当前位置: 首页 > 知识库问答 >
问题:

套接字如何相互发送数据?

魏高邈
2023-03-14

一个非常简单的服务器代码:

while(true) {
    Socket sock = serverSock.accept();
    PrintWriter writer = new PrintWriter(sock.getOutputStream()); 
    String advice = "advice here";
    writer.println(advice);
    writer.close();
}

还有一个简单的客户端,可以从这个套接字读取数据:

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()?

如何通过客户端输出流发送的数据可以从服务器输入流中读取?我无法在头脑中建立联系,也无法想象它。

我的问题是inputstream和outputstream对象是如何连接的?我怎么能成为一名作家呢。println(建议);最终成为读者。readLine()?OutputStream如何连接到InputStream?

任何帮助都非常感谢。

共有3个答案

甄煜
2023-03-14

插座使用一种叫做三向握手的原理进行连接。

一旦建立了连接,数据就可以通过各种流在客户端之间来回发送。

童宏富
2023-03-14

调用的客户端中的套接字构造函数的版本将创建指向指定endpoint的已连接套接字。由于没有显示,我们假定服务器中的serverSock是为侦听该endpoint而创建和初始化的。当客户端成功连接时,将返回初始化的套接字,相应地,服务器的套接字accept()将返回连接到客户端的套接字。

连接的套接字允许连接的endpoint之间进行双向通信。写入一个套接字的内容将被传送到它所连接的相应对等套接字,并(最终)被该对等套接字读取。getOutputStream()getInputStream()方法返回流对象,这些流对象允许流I/O操作通过创建数据的相应套接字传递数据。

下面,我为您在我的帖子中的评论中列出的具体问题提供答案。

问:如果我写入输出流,但没有从输入流读取,会发生什么(技术上)?

答:数据保存在缓冲区中,直到被读取。缓冲区可以容纳的数据量是有限制的。当达到限制时,另一个套接字上的写入程序将被阻塞,或者被通知它必须等待对等套接字读取已经写入的内容。

问:它能活多久?

答:未读数据将保留在缓冲区中,直到它被读取或通过重置强制断开连接。连接重置与连接关闭的区别在于,关闭表示不再发送数据,并且接收器成功读取0字节数据时收到此通知,而重置表示连接不再有效,任何缓冲数据都将被丢弃,读写操作都将失败。

问:我还有多少时间可以再次阅读?

你可以随时阅读,只要连接仍然有效,它就会成功。

问:我能写两遍然后读两遍吗?

答:连接的套接字是字节流。一端的“写入次数”与另一端的“读取次数”之间没有真正的关系,除非0次写入对应将意味着0次成功读取。

作为一个简单的例子,4个字节的单次写入可以对应于1个字节的4次读取。大的单次写入可能会被分段,以至于接收者将被迫发出多次读取以成功接收整个消息。

类似地,两次写入(每个4字节)可能对应于一次读取8字节。多个小的写操作可能会以一种方式发送到接收器,以便在一次读取中检索所有这些操作。

宗建章
2023-03-14

套接字使用TCP。如果你不熟悉,它是一个协议,规定了通过互联网传输数据的机制。这个问题的协议的重要部分是连接。

当两个设备希望通信时,将在每个设备上为用于发送/接收的端口创建一个套接字。这个套接字提供了一条通信线路,服务器可以在上面监听。发送方通过该通信线路发送数据的“数据包”,在那里接收方接收到这些数据包。

数据包携带数据的“有效载荷”,其中一次有数据表示它是最后一个数据包。这允许接收者解释完整的消息并做出相应的响应。

确保所有数据以正确的顺序到达目的地涉及很多机制,但这有点超出了这个问题的范围。希望这有帮助!

 类似资料:
  • 因此,我正在用Java编写一个程序,在DatagramSocket和DataGramPacket的帮助下发送和接收数据。问题是,当我发送数据/接收数据时,数据在我发送的程序中也会有所不同,但只是在某些情况下,比如: 但有时会起作用,比如:

  • 我必须对FTP服务器进行编码,而且我在数据传输方面遇到了问题。 我在linux上使用ftp命令来测试它,我目前正在使用,它发送工作目录中的文件/目录列表。一切正常(ftp打印文件列表),除了ftp打印以下警告: 我想删除该警告,我认为ftp需要二进制数据,但我不知道如何通过套接字发送这样的数据,我目前正在使用最基本的方式发送结果:

  • 如何将数据从PHP页面发送到TCP端口? 我正在使用它,但我不能使用任何数据!还有,你知道我怎么才能暂停吗? 有什么问题?

  • 我想使用Qt UDP(不是TCP)套接字传输文件。所以我这样写代码: 看来要传输的Qt UDP数据包的最小大小是8192字节。接收方总是得到第一个数据包,但不能接收其他数据包。 我对Qt和网络编程的经验很少,所以我不知道我的猜想对不对。你能告诉我如何改变这些代码来支持在第一个数据包之后接收数据包,这样我就可以传输大数据了吗?

  • 问题内容: 我正在使用套接字连接我的Android应用程序(客户端)和Java后端服务器。每次与服务器通信时,我都希望从客户端发送两个数据变量。 1)某种消息(由用户通过界面定义) 2)消息的语言(由用户通过界面定义) 我该如何发送这些消息,以便服务器将每个消息解释为一个单独的实体? 在读取了服务器端的数据并做出了适当的结论之后,我想向客户端返回一条消息。(我想我会没事的) 因此,我的两个问题是如

  • 我有一个数组类型的。我必须在python中通过流/TCP套接字发送它。然后我必须在接收端接收相同的阵列。