繁体   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