两个线程可以同时使用同一个套接字,这可能有问题吗?

时间:2013-09-20 06:14:40

标签: java android multithreading sockets networking

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

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

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

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

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

因此可以让一个线程使用套接字并监听任何消息和另一个发送消息的线程。这样,如果在发送消息的同时从服务器接收到消息。

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

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

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

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

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

希望这有帮助