[英]Confused About Reading and Writing From Input Streams (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
来自
public static String convertStreamToString(java.io.InputStream is) {
java.util.Scanner s = new java.util.Scanner(is).useDelimiter("\\A");
return s.hasNext() ? s.next() : "";
}
我对流和套接字的理解是否存在一些缺陷。 我以为,如果您写入套接字的输出流,则可以从其输入流中检索它? 该方法只是无限期地挂起。
如果写入套接字的输出流,则可以从远程套接字的输入流中读取。 在您的代码中,您正在写入套接字的一侧,然后尝试从同一侧读取。
不幸的是,您甚至还没有创建远程套接字。 接下来要做的是在ServerSocket
上调用accept()
。 这将接收来自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
方法不是很自信。 您可能想从简单的事情开始,例如我已经修复了上面的问题(请注意write调用中的换行符)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.