Java Socket ] DataInputStream 实例打印 continue null

标签 java sockets datainputstream

我正在使用 Java Swing 制作聊天室程序。

在客户端,我发现它没有从服务器端读取消息。

客户端的writeUTF()方法很好,我检查了服务器端的readUTFwriteUTF,发现也很好。

我认为问题是在客户端充当“接收者”的代码。

Thread的run()方法中,DataInputStream的实例dis持续为空值。

我很困惑..请给我一些帮助。

下面是我的客户端和服务器代码的一部分。

谢谢!

客户端代码

RoomBackground.java

public class RoomBackground {

    private static String socket_server = "127.0.0.1";
    private static Socket chatSocket;
    private static DataOutputStream dos;
    private static DataInputStream dis;
    private ChatReceiver chatReceiver;

    public Socket getChatSocket() {
        return chatSocket;
    }

    public static DataOutputStream getDos() {
        return dos;
    }

    public RoomBackground() throws IOException {
        chatSocket = new Socket(socket_server, 7777);
        chatReceiver = new ChatReceiver();
        chatReceiver.start();

        dos = new DataOutputStream(chatSocket.getOutputStream());
        dis = new DataInputStream(chatSocket.getInputStream());
        dos.writeUTF(User.getUser().getUsername());
        dos.flush();
    }
    class ChatReceiver extends Thread {
        @Override
        public void run(){
            try {
                # PROBLEM CODE..... Allways "dis is null"
                System.out.println("dis is " + dis);

                # This line never executed.
                while(dis != null) {    

                    # some codes.....

                }  
            } catch (IOException e) {
                e.printStackTrace();
                System.out.println(e.toString());
            } catch (BadLocationException e) {
                e.printStackTrace();
            }
        }
    }
}

RoomFrame.java

public class RoomFrame extends JFrame{

    private RoomBackground roomBackground;

    public RoomFrame(int roomId) throws IOException {
        chatField.addActionListener(new ActionListener() {
            roomBackground  = new RoomBackground();
            @Override
            public void actionPerformed(ActionEvent e) {
                String msg = chatField.getText() + "\n";
                try {
                    RoomBackground.getDos().writeUTF(msg);

                    # It works.
                    System.out.println("sent msg is " + msg);
                } catch (IOException e1) {
                    e1.printStackTrace();
                }
                chatField.setText("");
            }
        });
    }
}

现在是服务器代码。

服务器后台.java

public class ChatReceiver extends Thread {

    private DataInputStream in;
    private DataOutputStream out;

    public ChatReceiver(Socket chatSocket) throws IOException {

        out = new DataOutputStream(chatSocket.getOutputStream());
        in = new DataInputStream(chatSocket.getInputStream());

        nick = in.readUTF();
        addChatClient(nick, out);    
    }

    @Override
    public void run() {
        try {
            while(in!=null) {
                chatMsg = in.readUTF();

                # It works !
                System.out.println("before send" + chatMsg);
                sendMsg(chatMsg);

                # It works too!
                System.out.println("after send" + chatMsg);
            }
        }catch (IOException e) {
            removeChatClient(nick);
        }
    }
}

最佳答案

当您在 RoomBackground 中启动 ChatReceiver 线程时,dis 对象尚未初始化,这就是为什么它是 。一种解决方案是在 ChatReceiver 构造函数中初始化 dis 变量。

关于Java Socket ] DataInputStream 实例打印 continue null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34038990/

相关文章:

java - 客户端套接字不会从服务器接收数据

c# - 何时关闭 UDP 套接字

c# - 查看已安装设备的端口地址和属性

java - 以功能方式处理异常的更好方法

java - java的内部类会带来安全风险吗?

c - Sockets-客户端双重打印

java 数据输出流 getOutputStream() getInputStream()

java - readUTF 在服务器端挂起

java - 在 Java 应用程序中保存和更新配置设置

java - 从 Spring Controller 中删除重复项