Java没有侦听套接字消息

时间:2017-11-24 15:30:59

标签: java sockets

我这里有一个简单的问题(我想?)但是在搜索之后找不到解决方案。下面是我的客户端代码,这段代码的问题是,在我向服务器发送用户名后,它没有收到任何来自服务器的消息(当服务器发送一封时),我无法真正按照流程我的应用程序与while循环,任何人都可以向我解释我哪里出错这个?

快乐的流程: C:连接 S:HELO welcomemessage C:HELO用户名 S:+ OK用户名

广播消息 C:BCST消息 S:+ OK

public class Main {

BufferedReader in;
PrintWriter out;
String Serveraddress = "localhost";
int Serverport = 1337;
String username;

private void run() throws IOException {

    Socket s = new Socket(Serveraddress, Serverport);
    System.out.println("Connected: " + s);

    in = new BufferedReader(new InputStreamReader(s.getInputStream()));
    out = new PrintWriter(s.getOutputStream(), true);
    Scanner cmd = new Scanner(System.in);// console scanner
    String line = "";
    String cmdLine= "";
    while ((line = in.readLine()) != null) {
        System.out.println("Server: " + line);
        if (line.startsWith("HELO")) { //hij moet eerst naam invoeren
            System.out.println("\nVoer een username in");
            username = cmd.nextLine();
            out.println("HELO " + username);
            out.flush();
            System.out.println(username + " is verstuurd naar de server");
        }
        if (line.startsWith("BCST")) {
            System.out.println("Bericht binnen van de server: \n" + line);
        }
        if (line.startsWith("-ERR")) {
            System.out.println(" Error gekregen van de server " + line);
        }
    }
    while((cmdLine = cmd.nextLine()) != null){
        out.println("BCST " + cmdLine);
    }
}



public static void main(String[] args) throws Exception {
    Main client = new Main();
    try {
        client.run();
    } catch (IOException ioe) {
        System.out.println("Server probably not running :" + ioe.getMessage()); // if server not running
    }
}

}

我的问题是这段代码

while((cmdLine = cmd.nextLine()) != null){
        out.println("BCST " + cmdLine);
    }

这段代码应该放在哪里,因为在我输入用户名后,它不会检查我是否输入了控制台中的内容。

控制台日志: 连接:套接字[addr = localhost / 127.0.0.1,port = 1337,localport = 52469]服务器:HELO Welkom到WhatsUpp!  用户名中的用户名  myUsername<发送到服务器 是verstuurd naar de server 服务器:+ OK用户名(来自服务器的确认) 要广播的消息(然后我输入要发送给服务器)

要广播的消息应该发送到服务器,但它什么都不做,所以它不会进入cmdLine的while循环 任何提示/建议非常感谢

2 个答案:

答案 0 :(得分:1)

readLine正在阻止,永远不会返回null,所以你有无限循环,你读取数据发送,而你实际上从来没有读过你得到的东西。 我的建议是在不同的线程上进行读写或使用非阻塞的io。

答案 1 :(得分:0)

安装Wireshark并观察客户端和服务器发送的消息。你的in.readline()期望在服务器消息的末尾有一个\ n。如果缺少\ n,readline()将永远挂起。如果您无法控制服务器代码,请考虑读取接收的字节并记录它们以避免一直使用Wireshark。