java小白,在学习TDP尝试自己编写一个多人在线聊天服务时遇到了一个问题,希望有dl指点: 在客户端将聊天信息封装到Message后用writeObject输出后,如果加上一句socket.shutDownOutput(),则在服务端会报错,不加则正常运行,对此我不理解。 下面是源码:
//客户端
public void sendMessageToOne(String receiver,String content){
Message message=new Message();
message.setSender(user.getUserId());
message.setReceiver(receiver);
message.setMessageType(MessageType.MESSAGE_COMM_MES);
message.setContent(content);
try {
ObjectOutputStream objectOutputStream =
new ObjectOutputStream(ManageClientConnectServerThread.getClientConnectServerThread(user.getUserId()).getSocket().getOutputStream());
objectOutputStream.writeObject(message);
//在这里进行shutDownOutput
ManageClientConnectServerThread.getClientConnectServerThread(user.getUserId()).getSocket().shutdownOutput();
System.out.println("你对 "+receiver+" 说:"+content);
} catch (IOException e) {
e.printStackTrace();
}
}
//服务器端
public void run() {
System.out.println("服务器启动与" + userId + "的连接");
while (true) {
try {
ObjectInputStream objectInputStream = new ObjectInputStream(socket.getInputStream());
//没有收到消息则会一直阻塞在这里
Message message = (Message) objectInputStream.readObject();
//下面都是一些业务逻辑
if (message.getMessageType().equals(MessageType.MESSAGE_GET_ONLINE_FRIEND)) {
String friendList = ManageServerConnectClientThread.getOnlineFriendList();
Message message1 = new Message();
message1.setContent(friendList);
message1.setReceiver(message.getSender());
message1.setMessageType(MessageType.MESSAGE_RET_ONLINE_FRIEND);
ObjectOutputStream objectOutputStream = new ObjectOutputStream(socket.getOutputStream());
objectOutputStream.writeObject(message1);
} else if (message.getMessageType().equals(MessageType.MESSAGE_EXIT)) {
ObjectOutputStream objectOutputStream2 =
new ObjectOutputStream(ManageServerConnectClientThread.getServerConnectClient(message.getSender()).getSocket().getOutputStream());
objectOutputStream2.writeObject(message);
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
ManageServerConnectClientThread.removeManageServerConnectClientThread(userId);
socket.close();
break;
}else if(message.getMessageType().equals(MessageType.MESSAGE_COMM_MES)){
ObjectOutputStream objectOutputStream =
new ObjectOutputStream(ManageServerConnectClientThread.getServerConnectClient(message.getReceiver()).getSocket().getOutputStream());
objectOutputStream.writeObject(message);
System.out.println("已成功转发"+message.getSender()+"对"+message.getReceiver()+"的私聊信息");
}else if(message.getMessageType().equals(MessageType.MESSAGE_FILE_MES)){
ObjectOutputStream objectOutputStream1 =
new ObjectOutputStream(ManageServerConnectClientThread.getServerConnectClient(message.getReceiver()).getSocket().getOutputStream());
objectOutputStream1.writeObject(message);
System.out.print("已成功转发文件");
}
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
if (socket == null) {
break;
}
}
System.out.println("服务器断开与"+userId+"的连接");
}