socket實現類群聊功能

2021-09-22 12:44:36 字數 2861 閱讀 6864

使用socket做了乙個類似群聊功能的demo,來記錄這兩天學習socket的成果。

在實現功能之前先看下sockect通訊的基本流程:

socket服務端:

1.socket():建立套接字

3.listen():監聽套接字,準備接受客戶請求

4.accept():接收客戶端請求,返回乙個對應此連線新套接字

5.用accept()返回的套接字和客戶端進行通訊,recv()/send() 接受/傳送資訊

6.返回,等待另乙個客戶請求

7.關閉套接字

socket客戶端:

1.socket():建立套接字

2.connect():建立到達伺服器的連線

3.與伺服器進行通訊,recv()/send()接受/傳送資訊

5.close():關閉客戶連線

伺服器的關鍵實現有兩點:

2.方便管理每收到乙個鏈結建立乙個執行緒來管理對應的通訊;

實現**如下:

#include #include #include #include #include #include "winsock.h"

#pragma comment(lib, "ws2_32") // 鏈結到ws2_32.lib

using namespace std;

std::setm_socketset;

std::string inttostring(int v)

int main()

socket s_handle = socket(af_inet, sock_stream, ipproto_tcp);

if (s_handle == invalid_socket)

sockaddr_in sin;

sin.sin_family = af_inet;

sin.sin_port = htons(4567); //1024 ~ 49151:普通使用者註冊的埠號

sin.sin_addr.s_un.s_addr = inaddr_any;

if (::bind(s_handle, (sockaddr *)&sin, sizeof(sin)) == socket_error)

if (::listen(s_handle, 10) == socket_error)

sockaddr_in remoteaddr;

int naddrlen = sizeof(remoteaddr);

char sztext = "hello client...\n";

void handleclient(socket sclient);

while (true)

else

}closesocket(s_handle);

//關閉伺服器套接字

getchar();

return 0;

}void handleclient(socket sclient)

; int nrecv = ::recv(sclient, buff, 256, 0);

if (nrecv > 0)

}else

} else

} m_socketset.erase(sclient);

//鏈結斷開 從容器中刪除

closesocket(sclient);

//關閉套接字

}

客戶端部分主要是通絡通訊線程與主線程分離,實現**如下:

// socketclient.cpp : 定義控制台應用程式的入口點。

//int _tmain(int argc, _tchar* ar**)

; while (true) }

getchar();

return 0;

}

客戶端封裝的網路通訊類:

#include #include "winsock.h";

#pragma comment(lib, "ws2_32") // 鏈結到ws2_32.lib

return instance;

}:m_sockid(invalid_socket)

, m_serverrespond(false)

} m_sockid = ::socket(af_inet, sock_stream, ipproto_tcp);

if (m_sockid == invalid_socket)

// 也可以在這裡呼叫bind函式繫結乙個本地位址

// 否則系統將會自動安排

// 填寫遠端位址資訊

sockaddr_in servaddr;

servaddr.sin_family = af_inet;

servaddr.sin_port = htons(4567);

// 注意,這裡要填寫伺服器程式(tcpserver程式)所在機器的ip位址

// 如果你的計算機沒有聯網,直接使用127.0.0.1即可

servaddr.sin_addr.s_un.s_addr = inet_addr("127.0.0.1");

if (::connect(m_sockid, (sockaddr*)&servaddr, sizeof(servaddr)) == -1)

m_thread.detach();

//建立網路執行緒 並與主線程分離}

else

} // 關閉套節字

::closesocket(m_sockid);

m_sockid = invalid_socket;

} else

return false;}

這樣乙個簡單的類群聊功能就實現了,開啟兩個客戶端,乙個客戶端輸入hello everyone ... 並回車,另乙個客戶端就收到了訊息。

Android XMPP實現IM 群聊功能

時間倉促,在此僅做一些流水式的記錄,便於後面查詢。主要的 片段如下 private multiuserchat muc null private boolean ishistory false private int count 0 private final int receive 1 priva...

通過Socket實現群聊的思路

問題來自論壇 我的個人看法 啥叫群聊?也就是幾個人在乙個組裡!ok,那麼你先建乙個虛擬的組吧,然後把參 聊的人加入進去。然後每個成員發言時,傳送物件是組,伺服器負責把訊息發給組內的每個人。看看qq,裡面也是這麼做的。當然,聊天協議要設計好,至少每個訊息裡一定有傳送人,接收人 組 群,訊息等 再分享一...

socket類實現傳送

server端 include include void main if lobyte wsadata.wversion 1 hibyte wsadata.wversion 1 socket socksrv socket af inet,sock stream,0 sockaddr in addrs...