我是JAVA的初学者,目前练习做Socket网络编程。
服务端和客户端使用java.io.ObjectOutputStream和java.io.ObjectInputStream 接收 com.myqq.Command 对象客户端可以和服务端建立连接,只有上了两个客户端才能测试发送消息。消息发到服务端,服务端没有给目标对象转发(目标对象是从服务端的Socket集合中取出的一个,非发送端),然后发送消息的客户端就不停的给服务端发这个消息。
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();
}
}
}
});服务端的处理:
//为每个客户端开启一个线程监听
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):会执行下面的代码:/**
* 发送消息
* 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()方法:
/**
 * 发送命令
 * 
 * @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;
}
服务器的execute()方法:public boolean execute(Command cmd, Socket target) {
ObjectOutputStream oos = null;
if (target != null) {
try {
oos = new ObjectOutputStream(target.getOutputStream());
oos.writeObject(cmd);
oos.flush();
return true;
} catch (IOException e) {
e.printStackTrace();
return false;
}
}
return false; }