簡體   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