[英]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.