这是我第一次在代码中找不到问题/bug,所以现在我要问stackoverflow xd
我目前正在学习如何编写一个简单的服务器-客户机网络,以了解java中的套接字和服务器套接字是如何工作的。因此,我编写了一个由服务器、客户机和处理程序类组成的“程序”。handler类负责接收客户机的消息并发送响应。从服务器发送到客户端工作得非常好,客户端接收消息。但是,当客户机向服务器发送消息时,它不会收到任何消息。我用的bufferedreader卡在 readLine()
请求。
//This is the broken down version of what is happening in my Handler class
ServerSocket server = new ServerSocket(port); //These two lines of code actually happen in the Server class
Socket client = server.accept(); //but to simplify it I put them here
//Setting up the IO
BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
PrintWriter out = new PrintWriter(client.getOutputStream(), true);
//The Handler is waiting for the Reader to be ready and then prints the input
//Additionally, it sends a confirmation to the client
while(true) {
String input;
if(in.ready()){
if ((input = in.readLine()) != null) {
System.out.println(input);
out.println("Message Received");
if(input=="close") break;
}
}
}
//Expected output: "Message Received"
//Actual ouput: none, it gets stuck at in.ready() or in.readLine()
当我从客户机发送消息时,它应该只打印消息并向客户机发送确认,但它要么永远不会通过 if(in.ready()){...}
离开或被困在 if((input=in.readLine())!=null){...}
如果我删除第一个if语句。我使用intellij对其进行调试,inputstream不包含任何消息或 readLine()
. 我发现这很奇怪,因为服务器和客户机类的发送和接收部分(大部分)是相同的。
我唯一能想到的可能是这个问题的原因是客户端在发送消息时遇到了问题。
//This is the broken down version of what is happening in my Client class
Socket client = new Socket();
client.connect(new InetSocketAddress("localhost",port));
//Setting up the IO
Scanner scanner = new Scanner(System.in); //I am using a Scanner for the message inputs
BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
PrintWriter out = new PrintWriter(client.getOutputStream(), true);
String input;
System.out.println("Enter the first Message: ");
while ((input = scanner.nextLine()) != null) {
String inServer;
System.out.println(input); //The input is correct
out.println(input); //I am suspecting it has something to do with this line or the PrintWriter
//This part works perfectly fine here while it does not in the Handler class
if (in.ready()) {
if ((inServer = in.readLine()) != null) {
System.out.println(inServer);
}
}
System.out.println("Enter next Message: ");
}
Expected output: inServer
Actual output: inServer
如您所见,此部分的常规设置与handler类中的设置相同,但是在发送到服务器时似乎出现了一些问题。我不知道是服务器(我不这么认为,因为接收消息的相同代码在客户机类中工作得很好)还是客户机,在这种情况下,printwriter或类似的东西肯定有问题。
我已经查看了stackoverflow上的其他/类似问题,但没有找到任何可以解决我问题的方法。如果有人想详细地复制所有内容,那么类的完整代码是:(pastebin链接)
服务器类
客户端类
处理程序类
2条答案
按热度按时间h9a6wy2h1#
我的建议是使用实现reader的类的read()方法(bufferedreader就是其中之一)。语法如下:
这种方式更可靠,而且不存在回车问题。
hof1towb2#
嗯,看来问题已经解决了。。。它似乎与代码所在的intellij项目有关。我不得不把它搬进一个新项目,现在它可以工作了。这个问题现在已经解决了,如果有人想使用这个代码作为服务器客户机系统的基础,我会让pastebin链接继续工作。