[英]Java: Cannot write to socket after socket in.readLine()
我正在向您求助StackOverflow,我一直把头撞在墙上。
我正在做一些套接字编程,我可以看到当我在while循环(in.readLine())之前放入out.println(“ ...”)代码行时,它可以正常工作,但是我需要在循环内。
需要明确的是,我没有看到任何错误。 我只是看不到文本出现在此应用程序的客户端上。 看起来好像在工作,但事实并非如此。 另外,我也不控制它的客户端,它是由通过TCP连接到此Socket Listener应用程序的设备处理的。 是否有可能在读取数据后切断连接?
public class ConnectionHandlerTCP implements Runnable
{
private final Socket clientSocket;
ConnectionHandlerTCP(Socket socket)
{
clientSocket = socket;
}
public void run()
{
int uniqueId = 0;
try (
BufferedReader in = new BufferedReader( new InputStreamReader(clientSocket.getInputStream()));
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
){
String inputLine;
// This Line WORKS, I see it appear on the other side of the connection.
Log.debug("Sending now A");
out.println("text to send here");
while ((inputLine = in.readLine()) != null)
{
// This Line DOES NOT WORK, I do not see it on the other side of the connection.
//Log.debug("Sending now B");
//out.println("text to send here");
// ... bunch of commented out code here
}
in.close();
out.close();
clientSocket.close();
} catch (IOException e) {
Log.error("Exception caught when trying to read input.", e.getMessage());
} catch (Exception e) {
Log.error("Exception caught when trying to parse data.", e.getMessage());
}
}
}
任何帮助将不胜感激。 如果有帮助,这里是主要的课程。
import java.net.*;
import java.io.*;
public class SocketListenerTCP
{
public static void main(String[] args) throws IOException {
if (args.length != 1) {
System.exit(1);
}
int portNumber = Integer.parseInt(args[0]);
while(true)
{
try (
ServerSocket serverSocket = new ServerSocket(portNumber);
) {
Socket clientSocket = serverSocket.accept();
new Thread(new ConnectionHandlerTCP(clientSocket)).start();
} catch (IOException e) {
Log.error("Exception caught", e.getMessage());
}
}
}
}
我稍微简化了一点,完全删除了循环,但仍然无法正常工作。
inputLine = in.readLine();
Log.debug(inputLine);
Log.debug("Sending now");
out.println("text to send here");
里面的代码
while ((inputLine = in.readLine()) != null)
很可能没有运行,因为in.readLine
一直在等待客户端的输入。
客户端程序/套接字需要将其放在PrintWriter
和println
,以便您的while
循环可以读取它并做出响应(假设这就是您要实现的目标)。
好吧,我想我终于找到了问题的症结所在。 首先要解释我的原始问题。 现在,我确信要连接的设备在20秒钟(或大约20秒钟)没有任何活动被读取/写入后,会从服务器应用程序断开连接。 因此,readline()将等待20秒钟,然后返回它所拥有的所有内容,并且此时没有写回该设备的信息。 但是,如果我一次读取所有字符(通过read()),它就可以正常工作,允许我读取整个消息,并等待read()循环的最后一个字符读取迭代以获取最后的“- 1英寸通过,表示有效载荷已结束。 在这段时间(读取第一个字符并等待最后一个字符)之间,我解析了有效负载并将任何想要的内容发送到设备。 它在大多数情况下会收到。
我的第二个问题是,有时输出流似乎已断开连接,再也不允许我发送任何消息了。 在原始代码中,我使该类实现为“ Runnable”。 这是一个错误。 我到处都看到使用Runnable是执行此操作的首选方法,但是我注意到OutputStream在这种情况下几乎无法工作,我转而扩展Thread类,并且它在几乎100%的时间内都有效。 我相信一个线程会覆盖另一个线程的输出流,然后下一个线程做同样的事情,然后每个线程都无法通过输出流进行通信。
在网上查看了其他一些示例之后,我假设可以通过某种方式使用Runnable,但必须在应用程序中重构其他项目。 回到那条路之前,我将不得不做更多的阅读。
无论如何,它似乎暂时运行顺利,现在很少失败。 我仍然很想知道为什么它有时仍然会失败,因此我将在时间允许的情况下继续进行调查。
我仍然对其中一位评论者感到困惑,他们说我不能在同一线程上读写...这似乎是完全不正确的,只要我读了,读写似乎就可以了。 )首先(与readLine()相反),然后再写入设备。
读取套接字连接的InputStream是线程阻塞。 您不能在同一线程中同时读写。 将Printwriter移到另一个线程中,就可以了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.