使用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...