gpt4 book ai didi

Java Socket 服务器端无法读取 play 框架应用程序中传入的文本行

转载 作者:行者123 更新时间:2023-12-01 13:48:18 24 4
gpt4 key购买 nike

所以我在Java的服务器端套接字上遇到了一些严重的问题,它接受连接,但它无法从BufferedReader读取任何内容,我已经将其用于从套接字连接读取文本流。我的线程 run() 的代码,我在加载任何页面时第一次创建并运行该线程。

public void run() {

try{
ServerSocket s = new ServerSocket(4100);

System.out.println("New tcp socket created");

Socket socket = s.accept();
System.out.println("New tcp update connection established.");
InputStream din = socket.getInputStream();
PrintWriter outp = new PrintWriter(socket.getOutputStream(), true);
BufferedReader in = new BufferedReader(new InputStreamReader(din));
System.out.println("Streams created");
String inputline = "nothing yet...";
outp.println("hello from server");
while(true){
System.out.println("Got input from client:" + inputline);
inputline = in.readLine();
if(inputline == null || inputline.equals("exit")){

break;
}

}
}
catch(Exception e){
e.printStackTrace();
}
System.out.println("Updater thread exits.");
}

这会正确打印出所有内容,除了 Got input from client: + 我的客户端使用 PrintWriter 发送的内容,输出到套接字。

客户端示例:

Socket s = new Socket(serverip, serverDownloadsUpdatePort);

OutputStream dout = s.getOutputStream();
PrintWriter outp = new PrintWriter(dout);
BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));

System.out.println(in.readLine());//This prints out properly, what server sends to client
outp.println("test connection");
outp.println("Can you hear me?");
outp.println("exit");
s.close();

最佳答案

您的客户端可能不会随其输入一起发送行尾字符,导致您的服务器在“in.readLine()”处无限期等待。

BufferedReader 的 readLine 方法 ( http://docs.oracle.com/javase/7/docs/api/java/io/BufferedReader.html#readLine() ) 的 Javadoc 说:“读取一行文本。一行被视为由换行符 ('\n')、回车符 ('\r'),或回车后紧跟换行符。”确保您的客户端发送符合此规则的输入。

我能够使用您的服务器和以下客户端 Runnable 查看客户端输入(但前提是包含“\n”):

public void run() {
try{
Socket writeSocket = new Socket("localhost", 4100);
PrintWriter out =
new PrintWriter(writeSocket.getOutputStream(), true);
out.write("Hello there!\n");
out.flush();

}
catch(Exception e){
e.printStackTrace();
}

}

编辑:当在提交者的客户端示例中使用 println 时,您无需担心添加“\n”,但您确实需要刷新套接字。确保发生这种情况的一种方法是在 PrintWriter 构造函数中设置 autoFlush=true。

关于Java Socket 服务器端无法读取 play 框架应用程序中传入的文本行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20176997/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com