socket多線程編程
① 同步socket, 非同步socket, 多線程socket, 多進程socket
socket常用,本文立足同步和非同步socket,以及現有的socketserver庫。
同步socket一般有利用socket庫直接,就可以寫出tcp或udp的套接字
socketserver提供的線程或進程方式的socket
利用python 3.5+的asyncio協議,封裝一個協程的socket server ,普通的socket客戶也可以連接。
伺服器端
客戶端
為位元組流加上自定義固定長度報頭,報頭中包含位元組流長度,然後一次send到對端,對端在接收時,先從緩存中取出定長的報頭,然後再取真實數據
構造報頭信息
服務端
客戶端
粘包,分包都tcp
tcp為什麼會有粘包分包這些情況:
1.服務端處理不過來
2.客戶端採用優化納格爾演算法,達到一定位元組才發
怎麼處理:
1. 客,服雙方確定包頭規范,根據包頭的信息取包長度
2. 客戶端發送帶上標記位,如\n, 服務端根據標記取包
伺服器端
客戶端
伺服器端
客戶端
伺服器端
客戶端
封裝了socket,而且解決了Io阻塞問題
服務端
客戶端
客戶端
參考:
http://www.cnblogs.com/jokerbj/p/7422349.html
http://xiaorui.cc/2016/03/08/%E8%A7%A3%E5%86%B3golang%E5%BC%80%E5%8F%91socket%E6%9C%8D%E5%8A%A1%E6%97%B6%E7%B2%98%E5%8C%85%E5%8D%8A%E5%8C%85bug/
http://xiaorui.cc/2016/04/15/%E6%89%93%E9%80%A0mvc%E6%A1%86%E6%9E%B6%E4%B9%8Bsocket%E8%8E%B7%E5%8F%96http%E7%B2%98%E5%8C%85%E9%97%AE%E9%A2%98/
https://www.jianshu.com/p/065c53cab328
https://mozillazg.com/2017/08/python-asyncio-note-io-protocol.html#hidid3
② mfc socket tcp 多線程編程,一個伺服器對多個客戶端,跪求代碼!
簡單的就這樣,收到一個連接請求,就生成一個socket負責與客戶端通信,
③ C# winForm Socket 多線程 編程 關閉問題
2中方式,除主線程外其他線程設置為後台線程,即background thread,這是線程創建時的一個屬性,另一種就是應用程序退出時的事件裏手動退出線程
----
void Application_Exit(object sender,args e)
{
//thread.abort();
}
好像是這樣寫吧,好久沒用C#了,有點忘了,MSDN上有詳細的說明
socket是非託管資源,我的理解是最好首先清理(在其他線程前);
④ c++ socket編程中的多線程處理問題
你說的有點沒看明白,這樣的代碼結構應該可以吧。不過不會state一變化就停止a操作,一次a操作的流程要執行完,在下次進入循環的時候才會轉去執行其他操作。
while() //死循環
{
if(state == 2)
{
//執行其他操作
usleep();//如果沒有其他操作,可以睡眠一段時間 比如10ms。
contunue;
}
// a操作
}
⑤ 使用socket編程,實現一個多線程聊天程序,使用9977埠,要求服務端使用兩個線程(一個接收,一個輸出)
對於通信來說,不存在絕對的伺服器和客戶端,誰在等待別人來,誰就是伺服器,誰主動去聯系人,誰就是客戶端。
所以。
你要想客戶端接受消息,那在啟動客戶端的時候,在客戶端程序里開始一個提供埠的Socket就可以了。
ServerSocket serverSocket = new ServerSocket(5000);
while (true) {
final Socket socket = serverSocket.accept();
new Thread() {
Socket mySocket = socket;
@Override
public void run() {
try {
System.out.println(mySocket);
InputStream is = mySocket.getInputStream();
byte[] bytes = new byte[1024];
int n = is.read(bytes);
System.out.println(new String(bytes, 0, n));
OutputStream os = mySocket.getOutputStream();
os.write(("server reply at time " + new Date()
.toString()).getBytes());
mySocket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}.start();
}
⑥ socket同步非同步多線程問題
1.是多線程,不算非同步。
2.BeginAccept是非同步,雖然你的程序中用myreset.WaitOne();進入了等待事件的過程。如果不等待事件,就可以繼續運行下面的程序了。
我的經驗是,這種情況就不用非同步。
3.回調當然會消耗系統資源。大數據的話,我建議用線程循環做。
4.同步就會阻塞,非同步主線程不阻塞,當需要監聽後,還需要做一些其他處理的話,就用非同步,如果一切就緒等待連接的,就用同步比較好。
5.委託給了.net框架,內部應該也是線程和阻塞。
路過,不足之處,請繼續問。
⑦ c++ 多線程socket編程可以多個線程同時accept數據嗎
監聽連接都用一個線程就行了,多線程監聽是不明智的,監聽到之後把創建連接的套接字發送給其他線程通信就行。。。。
⑧ socket如何用多線程實現同時能接收和發送消息
單IP,多線程監聽相同埠,不能實現,詳見UNPV1,不過使用一個線程監聽埠,把結果存入一個對象,然後多線程並發訪問這個對象倒是可以實現的
⑨ 關於Socket多線程編程的recv函數問題
建議設個flag,在服務端進這個while後,如果沒處理(文件沒發送)完畢前,不在進入,或多開幾個thread設置不同埠等待接收客戶端的要求。