困惑于从输入流(套接字)读取和写入

时间:2013-04-16 23:23:40

标签: java sockets

我有一个关于从与套接字相关的输入流进行读写的问题。例如,我有

ServerSocket testie = new ServerSocket(0);
Socket putClient = new Socket("localhost",testie.getLocalPort());
InputStream is = putClient.getInputStream();
OutputStream os = putClient.getOutputStream();
os.write("testt".getBytes());
System.out.println(convertStreamToString(is));

但奇怪的是,“testt”从未打印过。方法convertStreamToString来自

  

Read/convert an InputStream to a String

public static String convertStreamToString(java.io.InputStream is) {
    java.util.Scanner s = new java.util.Scanner(is).useDelimiter("\\A");
    return s.hasNext() ? s.next() : "";
}

我对溪流和插座的理解是否存在一些缺陷。我认为如果您写入套接字的输出流,您可以从其输入流中检索它?该方法无限期挂起。

1 个答案:

答案 0 :(得分:3)

如果您写入套接字的输出流,则可以从远程套接字的输入流中读取。在您的代码中,您正在写入套接字的一侧,然后尝试从同一侧读取。

不幸的是,您还没有创建远程套接字。接下来您要做的就是在accept()上致电ServerSocket。这将从putClient接收连接并创建Socket。这个新套接字将是服务器端套接字。基本上你将拥有以下内容:

//Server Thread
ServerSocket testie = new ServerSocket(0);
Socket remoteSocket = testie.accept();
remoteIs = remoteSocket.getInputStream();
remoteOs = remoteSocket.getOutputStream();
System.out.println(new Scanner(remoteIs).next());

//Client Thread
Socket putClient = new Socket("localhost",testie.getLocalPort());
InputStream is = putClient.getInputStream();
OutputStream os = putClient.getOutputStream();
os.write("testt\n".getBytes());
os.flush();

请注意,我说了两个不同的主题。问题是调用testie.accept()将阻塞,直到它获得连接。但是,new Socket("localhost",testie.getLocalPort())将阻塞,直到建立连接。这些调用不能在同一个线程上进行。

更新:

值得指出的是,我对convertStringToStream方法不太自信。你可能想从一些简单的东西开始,比如我已经解决了上述问题(注意写入调用中的换行符)。