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

两个线程可以同时使用相同的套接字吗,这是否存在问题?

陶博耘
2023-03-14

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

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

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

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

如果我发送一个文件,它需要打开一个端口,等待接收从服务器返回的消息,告诉客户端文件是否被完整接收或者必须重新发送。

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

很明显,仅使用一个线程会阻塞,并且需要两个线程,但要使用相同的套接字,这是否存在问题?

共有2个答案

令狐宜民
2023-03-14

您可以使用一个线程向服务器发送数据,并让另一个线程等待和侦听响应,并在收到响应时做一些事情。

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

你可以使用线程锁(例如Android中的锁)使用单个套接字通过多线程发送数据

希望这有所帮助

亢胤运
2023-03-14

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

对于多个阅读器或写入器来说,问题相当明显。你读或写的东西需要有意义,因此套接字上的操作需要协调。经常使用锁

顺便说一句,除非您喜欢混淆,否则不要解包流。如果您希望DataOutpuStream包装BufferedOutpuStream,那么只需将DOS用于所有内容。

 类似资料:
  • 问题内容: public class Deadlock { static class Friend { private final String name; public Friend(String name) { this.name = name; } public String getName() { return this.name; } public synchronized void b

  • 假设有一个多线程服务器将数据写入同一端口上的两个不同套接字,其中一个专用线程处理每个套接字。两个线程是否可以同时写入各自的套接字?(所谓“同时”,我指的是真正的同时性,而不仅仅是并发交错。)或者,套接字共享同一端口的事实是否意味着强制执行互斥? 一般来说,我不清楚如何在两个任意I/O流之间共享资源。我知道两个线程不能同时写入磁盘,因为磁盘本身是共享资源。然而,在套接字和端口的情况下,我没有类似的物

  • 问题内容: 我正在使用Linux 3.2.0,x86_64。我可以同时从多个线程为一个套接字调用accept()吗? 问题答案: 是的,您可以从多个线程和多个进程调用同一个侦听套接字,尽管指向它的指向可能不如您想象的那么多。内核将只允许一个成功。当使用进程完成此操作时,这称为预分支,并且为每个新连接节省了a的开销。但是,当您处理线程时,可以更轻松地拥有一个等待新连接队列的现有线程池。一个线程执行并

  • 我有大约60个套接字和20个线程,我想确保每个线程每次都在不同的套接字上工作,所以我根本不想在两个线程之间共享同一个套接字。 在我的类中,我有一个后台线程,它每60秒运行一次并调用方法。在方法中,我迭代我拥有的所有套接字,然后通过调用类的方法开始逐个ping它们,并根据响应将它们标记为活的或死的。在方法中,我总是需要迭代所有套接字并ping它们以检查它们是活的还是死的。 现在,所有读取器线程将并发

  • 问题内容: 和 第二个代码产生了一个空指针异常,该怎么做才能使下一个等效? 问题答案: 我可以看到,如果players某个自定义java.lang.Iterable的get()实现的实现被破坏,或者至少以一种异常的方式(与的行为不同),就会发生这种情况。 除此之外,我唯一能想到的就是您未在代码中向我们展示的某些内容导致了某些错误。 如果执行此操作会怎样?

  • 这可能是一个很基本的问题,但它使我感到困惑。 两个不同连接的套接字可以共享一个端口吗?我正在编写一个应用服务器,它应该能够处理100K以上的并发连接,我们知道一个系统上可用的端口数量大约是60K(16bit)。一个连接的套接字被分配给一个新的(专用的)端口,因此这意味着并发连接的数量受到端口数量的限制,除非多个套接字可以共享同一个端口。所以问题是。