您好,我正在研究服务器-客户端应用程序的示例,但我不理解客户端如何从服务器接收字符串。
服务器运行执行此操作的线程:
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
字符串?服务器写入输出流,客户端从输入流中提取,这不是两个不同的存储区吗?
[如果您正在通过网络使用套接字,则有很多底层软件,以及潜在的硬件在这里发挥作用。
实现可能取决于OS /平台,但是通常在PC的两端都会打开一个端口。数据将以某种方式在端口之间流动,可能会通过某种内存映射的I / O,然后流出到网络,或者在本地情况下,可能只是通过cpu或内存命令进行路由。对于本地情况,可能会将数据复制到服务器套接字的缓冲区/内存空间中,并且readline会简单地读取它并重新定位地址指针以指示已读取数据。
这一切对您都是隐藏的,因此,除非您为此使用低级代码,否则您不必太在意数据的发送和接收方式,但是至少您应该了解常用的不同协议(TCP ,UDP,RAW)。
编辑:即使您使用本地主机,也可能会转到系统的网络控制器,然后进行环回。系统不太可能对其进行优化以绕过网络控制器,而不会直接将其直接复制到接收套接字。
实际上,我认为服务器的accept()
函数返回了客户端的套接字,但没有,它返回了一个新的套接字,可以与客户端的套接字进行对话,但是它们是两个不同的对象,因此inSocket
和[ C0]在客户端和服务器中都引用两个不同的套接字,而不是相同的套接字。
服务器将字符串写入其输出流,然后进入客户端的输入流,这很合乎逻辑,我知道服务器正在将字符串写入客户端的输出流,但这没有任何意义。