0

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

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() : "";
}

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

4

1 回答 1

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方法不是很有信心。您可能想从简单的东西开始,比如我在上面修复的内容(注意 write 调用中的换行符)。

于 2013-04-17T02:15:40.747 回答