Java:插入套接字后无法写入套接字。readLine()

时间:2018-12-20 22:41:00

标签: java sockets tcp

我正在向你求助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");

3 个答案:

答案 0 :(得分:0)

里面的代码

while ((inputLine = in.readLine()) != null)

很可能没有运行,因为in.readLine一直在等待客户端的输入。

客户端程序/套接字需要将其放在PrintWriterprintln上,以便您的while循环可以读取它并作出响应(假设这就是您要实现的目标)

答案 1 :(得分:0)

好吧,我想我终于找到了问题的症结所在。首先要解释我的原始问题。现在,我确信要连接的设备在20秒钟(或大约20秒钟)没有任何活动被读取/写入后,会从服务器应用程序断开连接。因此,readline()将等待20秒钟,然后返回它所拥有的所有内容,并且此时没有写回该设备的信息。但是,如果我一次读取所有字符(通过read()),它就可以正常工作,允许我读取整个消息,并等待read()循环的最后一个字符读取迭代以获取最后的“- 1英寸通过,表示有效载荷已结束。在这段时间(读取第一个字符并等待最后一个字符)之间,我解析了有效负载并将任何想要的内容发送到设备。它在大多数情况下会收到。

我的第二个问题是有时输出流似乎已断开连接,再也不允许我发送任何消息了。在原始代码中,我使该类实现为“ Runnable”。这是一个错误。我到处都看到使用Runnable是执行此操作的首选方法,但是我注意到OutputStream在这种情况下几乎无法工作,我转而扩展Thread类,并且它在几乎100%的时间内都有效。我相信一个线程会覆盖另一个线程的输出流,然后下一个线程做同样的事情,然后每个线程都无法通过输出流进行通信。

在网上查看了其他一些示例之后,我假设可以通过某种方式使用Runnable,但必须在应用程序中重构其他项目。在回到那条路之前,我将不得不做更多阅读。

无论如何,它暂时似乎运行顺利,现在很少失败。我仍然很想知道为什么它有时仍然会失败,所以我将在时间允许的情况下继续进行调查。

我仍然对其中一位评论者感到困惑,他们说我不能在同一线程上读写...这似乎是完全不正确的,只要一个在写入设备之前,我先读了read()(与readLine()相对)。

答案 2 :(得分:-1)

读取套接字连接的InputStream是线程阻塞。您不能在同一线程中同时读写。将Printwriter移到另一个线程中,就可以了。