繁体   English   中英

Java:socket in.readLine()之后无法写入套接字

[英]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一直在等待客户端的输入。

客户端程序/套接字需要将其放在PrintWriterprintln ,以便您的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM