我有一个关于从与套接字相关的输入流进行读写的问题。例如,我有
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
来自
public static String convertStreamToString(java.io.InputStream is) {
java.util.Scanner s = new java.util.Scanner(is).useDelimiter("\\A");
return s.hasNext() ? s.next() : "";
}
我对溪流和插座的理解是否存在一些缺陷。我认为如果您写入套接字的输出流,您可以从其输入流中检索它?该方法无限期挂起。
答案 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
方法不太自信。你可能想从一些简单的东西开始,比如我已经解决了上述问题(注意写入调用中的换行符)。