这是一个非常简单的服务器代码:
while(true) {
Socket sock = serverSock.accept();
PrintWriter writer = new PrintWriter(sock.getOutputStream());
String advice = "advice here";
writer.println(advice);
writer.close();
}
一个简单的客户端将从这个Socket中读取数据:
Socket s = new Socket(“127.0.0.1”, 4242);
InputStreamReader streamReader = new InputStreamReader(s.getInputStream());
BufferedReader reader = new BufferedReader(streamReader);
String advice = reader.readLine();
我正在尝试的是非常高级的,实际上非常简单。 sock.getOutputStream如何连接到s.getInputStream()?
如何从服务器输入流中读取通过客户端输出流发送的数据?我无法在脑海中建立连接,我无法想象它。
我的问题是输入流和输出流对象是如何连接的?如何写作.println(建议);最终在reader.readLine()? OutputStream如何连接到InputStream?
非常感谢任何帮助。
答案 0 :(得分:1)
您调用的客户端中的Socket
构造函数的版本创建了一个指向指定端点的连接套接字。由于未显示,我们假设服务器中的serverSock
已创建并初始化以侦听该端点。当客户端成功连接时,返回初始化的套接字,相应地,服务器的套接字accept()
返回连接到客户端的套接字。
连接的套接字允许连接的端点之间的双向通信。写入一个套接字的内容被传送到并且可以(最终)由它所连接的相应对等套接字读取。 getOutputStream()
和getInputStream()
方法返回流对象,允许流I / O操作将数据通过创建它的相应套接字传递。
下面,我将对你的一条评论中列出的具体问题的答案提供给我的帖子。
问:如果我写入输出流但是没有从输入流中读取,那么(技术上)会发生什么?
答:数据保存在缓冲区中直到被读取。缓冲区可以容纳多少数据是有限制的。达到限制时,另一个套接字上的编写器将阻止或被通知它必须等待对等套接字读出已写入的内容。
问:它会活多久?
答:未读数据将保留在缓冲区中,直到它被读出或直到连接被强制拆除并重置为止。连接复位与关闭连接的区别在于,关闭表示不再发送数据,接收方将此通知作为成功读取0字节数据,而复位表示连接不再有效,任何缓冲的数据将被丢弃,读写操作都将失败。
问:在我再次阅读之前,我需要多长时间?
答:您可以随时阅读,只要连接仍然有效,它就会成功。
问:我可以写两次然后再读两次吗?
答:连接的套接字是字节流。一端的“写入次数”与另一端的“读取次数”之间没有真正的关系,除了0次写入对应将意味着0次成功读取。
作为一个简单的例子,4个字节的单次写入可能对应于1个字节的4次读取。一个大的单个写入可能会被分割,使得接收器将被强制发出多个读取以成功接收整个消息。
类似地,两个写入,每个4个字节,可以对应于8个字节的单个读取。多个小写可能会以一种方式传递给接收器,即可以在一次读取中检索所有这些小写。
答案 1 :(得分:1)
Sockets
使用TCP。如果您不熟悉,它是一个协议,它规定了通过互联网传输数据的机制。这个问题的协议的重要部分是连接。
当2个设备希望通信时,在每个设备上创建Socket
,用于发送/接收端口。该Socket提供了一条通信线路,服务器可以在其上进行监听。发件人通过该通信线路发送“数据包”数据,接收方将接收这些数据。
数据包携带数据的“有效载荷”,其中一次数据表示它是最后一个数据包。这允许接收者解释完整的消息并做出相应的响应。
有很多机制可以确保所有数据以正确的顺序到达那里,但这有点超出了这个问题的范围。希望这有帮助!
答案 2 :(得分:0)
套接字使用名为Three Way Handshake的原则进行连接。
创建连接后,可以通过各种streams
在客户端之间来回发送数据。