问问题:Java-关于TDP中的shutdownOutput()使用不当

175 阅读1分钟

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+"的连接");
}