从不等待输入的套接字读取?

时间:2009-02-04 14:22:10

标签: java sockets

我正在尝试用Java进行一些Socket编程,我正在使用BufferedStreamReader.read(char [])方法。

java doc声明:

  

将字符读入数组。这个   方法将阻塞,直到某些输入为止   可用,发生I / O错误,或者   到达流的末端。

只有它不会阻止输入。

可以用以下代码指出问题吗?即使使用写入输出流的行,打印“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();

    }
}

附加信息

我尝试更改端口号和应用程序崩溃,也许我正在连接到机器上运行的其他东西。

此外,我正在收集稳定的字节流,所有字节都是空格。

5 个答案:

答案 0 :(得分:1)

您需要查看ServerSocket。此刻您的Socket实际上并没有“正在收听”,它正在尝试连接到localhost:8080但实际上并没有收听它!

答案 1 :(得分:1)

事实上,您正在连接本地计算机上的其他内容。

查看上面的代码,看起来好像您希望在套接字的输入流中接收写入其输出缓冲区的数据。看起来好像你认为插座是一段管子,输入流在管子的一端,输出流在另一端。

套接字实际上是一个管的一端,输入流可以让你听到它下来的内容和输出流,让你“对话”进入电子管。

可能我对你的困惑感到困惑......以上是否有帮助?

答案 2 :(得分:1)

如果您认为您的读取没有阻塞,请捕获读取方法的结果并进行打印。如果您的假设是正确的,那么它应该为零。

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

在任何情况下,您都需要知道读取了多少个字符才能正确调用copyValueOf - 通常,只有部分数组将填充上次读取的数据。当然,返回值表示流结束(感谢Darron!),因此您需要检查它。

答案 3 :(得分:0)

我运行了您的代码,我能够从服务器接收和打印数据。测试您的服务器端以确保它正常工作。

答案 4 :(得分:0)

这只是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));
  //}
}