簡體   English   中英

從套接字讀取不等待輸入?

[英]Reading from a socket not waiting for input?

我正在嘗試使用Java進行一些Socket編程,並且正在使用BufferedStreamReader.read(char [])方法。

Java doc指出:

將字符讀入數組。 該方法將阻塞,直到某些輸入可用,發生I / O錯誤或到達流的末尾為止。

只是它不會阻止輸入。

somone可以指出以下代碼的問題嗎? 即使將行寫入輸出流,打印“ RCVD:”的行仍在打印,但在RCVD之后沒有任何數據。

public class Main {

    /**
     * @param args the command line arguments
     */
         private static Socket tcpSocket;
    public static void main(String args[]) {
        try {
            tcpSocket = new Socket("localhost", 8080);
        } catch (UnknownHostException ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        }

        new Thread(new Runnable() {

            public void run() {
                try {

                    System.out.println("Starting listening");

                    char[] dataBytes = new char[9];
                    BufferedReader netStream = new BufferedReader(new InputStreamReader(tcpSocket.getInputStream()));
                    while (true) {
                        netStream.read(dataBytes);

                        System.out.println("RCVD: " + String.copyValueOf(dataBytes));
                    }
                } catch (UnknownHostException ex) {
                    Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
                } catch (IOException ex) {
                    Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }).start();

        new Thread(new Runnable(){
            public void run() {
                System.out.println("Starting Writer");
               PrintWriter out = null;
                try {
                    out = new PrintWriter(tcpSocket.getOutputStream(), true);
                    for (int i = 0 ; i < 10 ; i++)
                    {
                      //  out.println("000000000");
                    }
                } catch (IOException ex) {
                    Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }).start();

    }
}

附加信息

我嘗試更改端口號,應用程序崩潰,也許我正在連接到計算機上運行的其他設備。

另外,從它的外觀來看,我正在接收穩定的字節流,所有字節都為空格。

您需要研究ServerSocket 目前,您的Socket尚未真正在“監聽”,它正在嘗試連接到localhost:8080,但實際上並未監聽它!

實際上,您正在連接到本地計算機上的其他設備。

查看上面的代碼,好像您希望在套接字的輸入流中接收寫入其輸出緩沖區的數據。 好像您將插座視為一段管子一樣,輸入流在管子的一端,輸出流在另一端。

套接字實際上是在管的一端 ,以使您聽到的歸結,並允許你“談”入管輸出流的輸入流。

對於讓您感到困惑的事情,我可能感到困惑...上述幫助嗎?

如果您認為讀取沒有阻塞,請捕獲read方法的結果並打印出來。 如果您的假設正確,則應為零。

int n = netStream.read(dataBytes);
System.out.println("Read " + n + " characters.");

無論如何,您都需要知道讀取了多少個字符,以便可以正確調用copyValueOf -通常,數組的僅一部分將被最后一次讀取的數據填充。 而且,當然,返回值表示流結束(感謝Darron!),因此您必須進行檢查。

我已經運行了您的代碼,並且能夠從服務器接收和打印數據。 測試您的服務器端,以確保其正常運行。

只需2c。 我不是套接字專業人士,但是當我使用它時,我傾向於在下一行中閱讀更多內容。

char[] dataBytes = new char[9];//tcpSocket.getReceiveBufferSize()

int result = 0;
while((result = is.read(inputData)) != -1)//check for eof, 
  //if(result > 0){//<- most probably the case anyways considering .read returned
  //display only what was received
    System.out.println("RCVD: " + String.copyValueOf(inputData,0,result));
  //}
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM