簡體   English   中英

兩個線程可以同時使用同一套接字,這可能有問題嗎?

[英]can two threads use the same socket at the same time, and are there possible problems with this?

兩個線程可以同時使用同一套接字嗎?

例如,首先我打開一個套接字,該套接字代表Android客戶端與Windows 7服務器之間的連接。 我想使用DataOutputStream發送一個等於文件大小的整數,然后在此之后,我將使用BufferedOutputStream發送二進制文件,例如pdf

服務器將獲取客戶端發送的大小,然后檢查所接收文件的大小是否正確。 它將發送整數,文件大小編號與接收到的文件的實際大小進行比較。 如果存在任何差異,但服務器知道文件不完整,則它將向客戶端發送一條消息,要求再次發送該文件。

我有一個應用程序,其中大約5%的時間收到的文件不完整。 它到達小於實際大小。 解決此問題的唯一方法是,如果文件不完整,請重新發送該文件

如果我發送文件,則需要打開端口,並等待從服務器接收回消息,告知客戶端文件是否已完整接收或必須重新發送。

這樣就有可能使一個線程使用套接字並偵聽任何消息,而使另一個線程發送消息。 因此,如果同時從服務器接收到一條消息,則正在發送一條消息。

很明顯,僅使用一個線程將阻塞,並且需要兩個線程,但是使用同一套接字是否有可能出現此問題?

具有專用的讀取器線程並允許其他線程寫入同一套接字是一種非常常見的模式。

對於多個讀者或作家來說,這個問題是顯而易見的。 您讀或寫的內容必須有意義,因此套接字上的操作需要進行協調。 經常使用鎖

順便說一句,除非您喜歡混淆,否則請不要打開流。 如果要讓DataOutputStream包裝BufferedOutputStream,則僅將DOS用於所有內容。

您可以使用一個線程將數據發送到服務器,然后讓另一個線程等待並偵聽響應,並在收到響應時做一些事情。

如果多個線程使用同一套接字發送某些數據,則很有可能發生數據交織。

您可以使用單個套接字通過線程鎖(例如,Android中的鎖和Linux中的互斥鎖)使用多個線程發送數據。

希望這可以幫助

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM