我正在向你求助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");
答案 0 :(得分:0)
里面的代码
while ((inputLine = in.readLine()) != null)
很可能没有运行,因为in.readLine
一直在等待客户端的输入。
客户端程序/套接字需要将其放在PrintWriter
和println
上,以便您的while
循环可以读取它并作出响应(假设这就是您要实现的目标)
答案 1 :(得分:0)
好吧,我想我终于找到了问题的症结所在。首先要解释我的原始问题。现在,我确信要连接的设备在20秒钟(或大约20秒钟)没有任何活动被读取/写入后,会从服务器应用程序断开连接。因此,readline()将等待20秒钟,然后返回它所拥有的所有内容,并且此时没有写回该设备的信息。但是,如果我一次读取所有字符(通过read()),它就可以正常工作,允许我读取整个消息,并等待read()循环的最后一个字符读取迭代以获取最后的“- 1英寸通过,表示有效载荷已结束。在这段时间(读取第一个字符并等待最后一个字符)之间,我解析了有效负载并将任何想要的内容发送到设备。它在大多数情况下会收到。
我的第二个问题是有时输出流似乎已断开连接,再也不允许我发送任何消息了。在原始代码中,我使该类实现为“ Runnable”。这是一个错误。我到处都看到使用Runnable是执行此操作的首选方法,但是我注意到OutputStream在这种情况下几乎无法工作,我转而扩展Thread类,并且它在几乎100%的时间内都有效。我相信一个线程会覆盖另一个线程的输出流,然后下一个线程做同样的事情,然后每个线程都无法通过输出流进行通信。
在网上查看了其他一些示例之后,我假设可以通过某种方式使用Runnable,但必须在应用程序中重构其他项目。在回到那条路之前,我将不得不做更多阅读。
无论如何,它暂时似乎运行顺利,现在很少失败。我仍然很想知道为什么它有时仍然会失败,所以我将在时间允许的情况下继续进行调查。
我仍然对其中一位评论者感到困惑,他们说我不能在同一线程上读写...这似乎是完全不正确的,只要一个在写入设备之前,我先读了read()(与readLine()相对)。
答案 2 :(得分:-1)
读取套接字连接的InputStream是线程阻塞。您不能在同一线程中同时读写。将Printwriter移到另一个线程中,就可以了。