【发布时间】:2020-04-26 08:00:57
【问题描述】:
您好,我正在研究一个服务器-客户端应用程序的示例,但我不明白客户端如何从服务器接收字符串。
服务器运行一个执行此操作的线程:
String seq = generateSequence(l); //random stuff
outSocket.println(seq);
在客户端类中有这样的代码:
String serverSeq = inSocket.readLine();
System.out.println(serverSeq);
inSocket 和 outSocket 在线程和客户端类中的实现方式相同,其中:
inSocket = new BufferedReader(new InputStreamReader(socket.getInputStream()));
outSocket = new PrintWriter(new BufferedWriter(
new OutputStreamWriter(socket.getOutputStream())), true);
socket 也是同一个对象,它是客户端的套接字
我的问题是为什么serverSeq 字符串正是seq 字符串?服务端写入输出流,客户端取输入流,这不是两个不同的内存区域吗?
【问题讨论】:
-
我不确定我是否理解这个问题。套接字不是相同的对象。它们是同一类的两个实例。一个在服务器 JVM 中运行,另一个在客户端 JVM 中运行。而套接字的全部意义在于通过网络在进程之间进行通信:客户端连接到服务器,然后两个套接字相互连接,并允许发送/接收日期。你应该阅读docs.oracle.com/javase/tutorial/networking/sockets/index.html
-
剩下的是上下文,但主要问题是为什么服务器使用输出流,客户端使用输入流,并且它看到正确的字符串。服务器不应该写入客户端的输入流以供读取吗?
-
您无法写入 InputStream。 InputStream 是您从中读取的内容。客户端位于通信通道的一端,并从输入流中读取字节。另一方面,服务器在另一台机器上,并写入输出流。客户端读取服务器写入的内容,反之亦然。服务器写入的内容通过网络发送,并由客户端接收。您似乎完全忽略了套接字用于通过网络进行通信的事实。
-
好的;感谢您的时间,这一切都在同一台计算机上执行,所以也许这就是我的错误。那么数据如何从服务器的输出流传递到客户端的输入流是我不需要知道的底层的东西?