关于Socket编程里面的问题
在Socket编程中,我再服务端写了如下代码
while (true) {
int port = Integer.parseInt(textField.getText());
try {
ServerSocket serverSocket = new ServerSocket(port);
Socket sk = serverSocket.accept();
BufferedReader bReader = new BufferedReader(
new InputStreamReader(sk.getInputStream()));
textArea.setText(bReader.readLine());
serverSocket.close();
bReader.close();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
package conn;
import java.io.*;
import java.net.*;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
/*对象反串行化,与客户端定义一样*/
class Customer extends Object implements java.io.Serializable //封装登录信息
{
String custName; //用户名
String custPassword; //密码
}
class ChaXun extends Object implements java.io.Serializable //封装查询信息
{
String neirong; // 用户ID或用户姓名
}
class Exit extends Object implements java.io.Serializable //封装退出信息
{
String custName; //退出
}
/*对象串行化,与客户端定义一样*/
class Message extends Object implements java.io.Serializable //封装通讯录信息
{
String ID; //用户ID
String name; //用户姓名
String address; //单位地址
String mobilephone; //手机号码
String telephone; //单位电话
String homephone; //家庭电话
}
public class Server{
ServerSocket server;
Socket socket;
Thread thread;
PrintStream ToClient;
public Server() {
try {
server = new ServerSocket(2000);
System.out.println("等待与客户端连接...");
while (true) {
socket = server.accept(); // 侦听连接请求,等待连接
new Connect(socket);
}
} catch (Exception e) {
System.out.println("不能启动服务");
}
}
public static void main(String[] args) { //main方法
new Server();
}
}
class Connect extends Thread{
ObjectInputStream FromClient; // 从客户端到服务器
PrintStream ToClient;
Socket Client;
Object obj; // 定义根类对象
String user[] = new String[2]; // 2个字符串空间用于存放登录时查询数据库所得的用户信息(用户名和密码)
Message message = new Message(); // 创建Message对象,用于封装查询通讯录中一个用户的全部信息
Exit exit = new Exit(); // 用户退出请求
public Connect(Socket Client) {
this.Client = Client;
try {
FromClient = new ObjectInputStream(this.Client.getInputStream()); // 检索客户端输入
ToClient = new PrintStream(this.Client.getOutputStream()); // 服务器写回客户端
} catch (IOException e) {
try {
this.Client.close();// 关闭套接字连接
} catch (IOException e1) {
e1.printStackTrace();
}
System.out.println("1输入输出流异常!");
}
this.start();// 启动线程
}
public void run() {
try {
obj = (Object) FromClient.readObject();
int none = 0;// 用于判断用户是否存,0不存在
/* 暂时不考虑重复登录 */
if (obj.getClass().getName().equals("Customer")) { // 客户端登录时
Customer customer = (Customer) obj;
loginsql(user, customer); // 登录时数据库操作
if (user[0].equals(customer.custName)) {
none = 1;
if (!user[1].equals(customer.custPassword))
{
ToClient.println("密码错误,请重新输入!");
}
else
{
System.out.println("用户"+customer.custName+"登录成功!");
ToClient.println("登录成功!");
}
}
else if (none == 0)
{
ToClient.println("用户不存在!");
}
}
if (obj.getClass().getName().equals("ChaXun")) { // 客户端查询通信录时
ChaXun chaxun = (ChaXun) obj;
addressbooksql(message, chaxun); // 查询通讯录数据库操作
if (message.name.equals(chaxun.neirong)
[解决办法]
message.ID.equals(chaxun.neirong))//查询成功
{
ObjectOutputStream streamToServer=new ObjectOutputStream(Client.getOutputStream());//信息发往客户端
streamToServer.writeObject((Message)message);
}
else //查询失败
{
ObjectOutputStream streamToServer=new ObjectOutputStream(Client.getOutputStream());//信息发往客户端
streamToServer.writeObject((Message)message);//此时Message各成员变量都为初始化的值
}
}
if (obj.getClass().getName().equals("Exit")) { // 客户端退出时
Exit exit = (Exit) obj;
System.out.println("用户"+exit.custName + "退出!");
}
} catch (IOException e1) {
e1.printStackTrace();
System.out.println("3输入输出流异常!");
} catch (ClassNotFoundException e2) {
System.out.println("读对象异常!");
} finally {
try {
Client.close(); // 关闭套接字连接
} catch (IOException e) {
e.printStackTrace();
System.out.println("4输入输出流异常!");
}
}
}