2

两个线程可以同时使用同一个套接字吗?

例如,首先我打开一个表示 Android 客户端和 Windows 7 服务器之间连接的套接字。我想通过使用 DataOutputStream 发送一个文件大小的整数,然后在此之后我将使用 BufferedOutputStream 发送二进制文件,例如 pdf

服务器将获取客户端发送的大小,然后检查接收到的文件大小是否正确。它将发送整数、文件大小数字与接收到的文件的实际大小进行比较。如果有任何差异,服务器知道文件不完整,然后它将向客户端发送一条消息以请求再次发送文件。

我有一个应用程序,其中大约 5% 的时间文件被接收为不完整。它比实际尺寸小。解决此问题的唯一方法是在文件不完整时再次重新发送文件

如果我发送文件,则需要打开一个端口并等待从服务器接收一条消息,告诉客户端文件是否已接收完成或必须重新发送。

那么是否可以让一个线程使用套接字并侦听任何消息并在另一个线程上发送消息。因此,如果在发送消息的同时从服务器接收到消息。

很明显,只使用一个线程会阻塞,并且需要两个线程,但是使用同一个套接字可能会出现问题吗?

4

2 回答 2

3

拥有一个专用的读取器线程并允许其他线程写入同一个套接字是一种非常常见的模式。

多个读者或作者的问题是相当明显的。您读或写的内容需要有意义,因此套接字上的操作需要协调。经常使用锁

顺便说一句,除非您喜欢混淆,否则不要打开流。如果你想要一个 DataOutputStream 来包装一个 BufferedOutputStream 那么只使用 DOS 来处理所有事情。

于 2013-09-20T06:24:03.497 回答
0

您可以使用一个线程将数据发送到服务器,并让另一个线程等待并侦听响应,并在收到响应时执行一些操作。

如果多个线程使用同一个套接字发送一些数据,则很有可能发生数据交错。

您可以使用单个套接字通过使用线程锁的多个线程发送数据(例如,Android 中的 Lock 和 linux 中的互斥锁)。

希望这可以帮助

于 2013-09-20T06:23:24.310 回答