我这里有一个简单的问题(我想?)但是在搜索之后找不到解决方案。下面是我的客户端代码,这段代码的问题是,在我向服务器发送用户名后,它没有收到任何来自服务器的消息(当服务器发送一封时),我无法真正按照流程我的应用程序与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循环 任何提示/建议非常感谢
答案 0 :(得分:1)
readLine
正在阻止,永远不会返回null
,所以你有无限循环,你读取数据发送,而你实际上从来没有读过你得到的东西。
我的建议是在不同的线程上进行读写或使用非阻塞的io。
答案 1 :(得分:0)
安装Wireshark并观察客户端和服务器发送的消息。你的in.readline()期望在服务器消息的末尾有一个\ n。如果缺少\ n,readline()将永远挂起。如果您无法控制服务器代码,请考虑读取接收的字节并记录它们以避免一直使用Wireshark。