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

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来自

读取/将InputStream转换为字符串

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 票数:3 已采纳

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

不幸的是,您甚至还没有创建远程套接字。 接下来要做的是在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调用中的换行符)。

  ask by user1431282 translate from so

未解决问题?本站智能推荐:

关注微信公众号