我是JAVA的初学者,目前练习做Socket网络编程。
服务端和客户端使用java.io.ObjectOutputStream和java.io.ObjectInputStream 接收 com.myqq.Command 对象
客户端可以和服务端建立连接,只有上了两个客户端才能测试发送消息。消息发到服务端,服务端没有给目标对象转发(目标对象是从服务端的Socket集合中取出的一个,非发送端),然后发送消息的客户端就不停的给服务端发这个消息。
- Java code
this.field.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
Socket socket = ClientFrame.this.client.getSocket();
if (socket != null && !socket.isClosed()) {
try {
//显示到本地消息框
ClientFrame.this.updateMessageFrame(
ClientFrame.this.client.getIdentityId(),
ClientFrame.this.client.getServerTime(),
ClientFrame.this.field.getText());
//发送给服务器,要求服务器转发这条信息
ClientFrame.this.client.execute(new Command(
CommandEnum.NORMAL_MESSAGE,
ClientFrame.this.client.getIdentityId())
.setParameter(CommandParameter.CONTENT, //CommandParameter.CONTENT是一个标识,用来存取消息的内容
ClientFrame.this.field.getText()));//取出输入框的内容
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
});
服务端的处理:
- Java code
//为每个客户端开启一个线程监听 class CommandListenner implements Runnable { Socket socket = null; public CommandListenner(Socket s) { this.socket = s; } public void run() { while (Server.this.isServerStart() && this.socket != null && !this.socket.isClosed()) { Command cmd = null; try { cmd = Server.getRemoteCommand(this.socket); Server.this.commandHandler.execute(cmd, this.socket); } catch (IOException e) { e.printStackTrace(); return; } catch (ClassNotFoundException e) { e.printStackTrace(); return; } catch (Exception e) { if (this.socket == null || this.socket.isClosed()) { Server.this.disconnectClientSocket(socket); } else { e.printStackTrace(); } } } if (this.socket != null || !this.socket.isBound()) { Server.this.disconnectClientSocket(socket); } } }
Server.this.commandHandler.execute(cmd, this.socket):会执行下面的代码:
- Java code
/** * 发送消息 * from (消息发送者名称) * socket (接收者的) * date (时间) * content (消息内容) */ private boolean sendMessage(String from, Socket socket, long date, String content) { if (socket != null && socket.isConnected()) { // 问题所在区,如果将其注释掉,下面的语句将会导致循环发送数据 // 测试: System.out.println("发送给" + socket); return server.execute(new Command(CommandEnum.NORMAL_MESSAGE, from) .setParameter(CommandParameter.CONTENT, content) .setParameter(CommandParameter.IDENTITY_ID, from) .setParameter(CommandParameter.TIME, date), socket); } else { // 存入数据库 return true; } }
客户端execute()方法:
- Java code
/** * 发送命令 * * @throws IOException */ public boolean execute(Command cmd) throws IOException { System.out.println("*"); ObjectOutputStream oos = null; if (this.socket != null && !this.socket.isClosed() && cmd != null) { oos = new ObjectOutputStream(this.socket.getOutputStream()); oos.writeObject(cmd); oos.flush(); if (cmd.getCmd() == CommandEnum.CLIENT_CLOSE) { this.isConnection = false; } return true; } return false; }