網(wǎng)站首頁 編程語言 正文
一、socket是什么
Socket是應(yīng)用層與TCP/IP協(xié)議族通信的中間軟件抽象層,它是一組接口。在設(shè)計模式中,Socket其實就是一個門面模式,它把復(fù)雜的TCP/IP協(xié)議族隱藏在Socket接口后面,對用戶來說,一組簡單的接口就是全部,讓Socket去組織數(shù)據(jù),以符合指定的協(xié)議。所以,我們無需深入理解tcp/udp協(xié)議,socket已經(jīng)為我們封裝好了,我們只需要遵循socket的規(guī)定去編程,寫出的程序自然就是遵循tcp/udp標(biāo)準(zhǔn)的。
二、套接字的工作流程
先從服務(wù)器端說起。服務(wù)器端先初始化Socket,然后與端口綁定(bind),對端口進(jìn)行監(jiān)聽(listen),調(diào)用accept阻塞,等待客戶端連接。在這時如果有個客戶端初始化一個Socket,然后連接服務(wù)器(connect),如果連接成功,這時客戶端與服務(wù)器端的連接就建立了??蛻舳税l(fā)送數(shù)據(jù)請求,服務(wù)器端接收請求并處理請求,然后把回應(yīng)數(shù)據(jù)發(fā)送給客戶端,客戶端讀取數(shù)據(jù),最后關(guān)閉連接,一次交互結(jié)束。
三、服務(wù)端
private void btnListen_Click(object sender, EventArgs e)
{
IPEndPoint point = new IPEndPoint(IPAddress.Any, 13000);//IPAddress.Any本機任何網(wǎng)卡IP。本機端口查看netstat -an
//服務(wù)端Socket定義
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket.Bind(point); //綁定IP
socket.Listen(10);//啟動監(jiān)聽。最大監(jiān)聽數(shù),同一個時間點過來10個客戶端,排隊
ShowMsg("服務(wù)器開始監(jiān)聽");
Thread thread = new Thread(AcceptInfo);
thread.Start(socket);
}
//記錄通信用的Socket
Dictionary<string, Socket> dic = new Dictionary<string, Socket>();
// private Socket client;
void AcceptInfo(object o)
{
Socket socket = o as Socket;
while (true)
{
//通信用socket
try
{
Socket clientSocket = socket.Accept();//如果客戶端有請求,生成一個新的Socket
string point = clientSocket.RemoteEndPoint.ToString();
ShowMsg(point + "連接客戶端成功!");
dic.Add(point, clientSocket);
//接收消息
Thread th = new Thread(ReceiveMsg);
th.Start(clientSocket);
}
catch (Exception ex)
{
break;
}
}
socket.Close();
}
//接收消息
void ReceiveMsg(object socket)
{
Socket clientSocket = socket as Socket;
while (true)
{
//接收客戶端發(fā)送過來的數(shù)據(jù)
try
{
//定義byte數(shù)組存放從客戶端接收過來的數(shù)據(jù)
byte[] buffer = new byte[1024 * 1024];
int n = clientSocket.Receive(buffer);//將接收過來的數(shù)據(jù)放到buffer中,并返回實際接受數(shù)據(jù)的長度
//將字節(jié)轉(zhuǎn)換成字符串
string words = Encoding.Unicode.GetString(buffer, 0, n);
Console.WriteLine(clientSocket.RemoteEndPoint.ToString() + ":" + words);
byte[] msg = Encoding.Unicode.GetBytes(words);
clientSocket.Send(msg);//發(fā)送數(shù)據(jù),字節(jié)數(shù)組
}
catch (Exception ex)
{
break;
}
}
clientSocket.Shutdown(SocketShutdown.Both);//禁止發(fā)送和接受數(shù)據(jù)
clientSocket.Close();//關(guān)閉socket,釋放資源
}
四、客戶端
Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint point = new IPEndPoint("127.0.0.1", 13000));//連接到的服務(wù)端IP
clientSocket.Connect(point);//連接到服務(wù)器
ShowMsg("連接成功");
ShowMsg("服務(wù)器" + client.RemoteEndPoint.ToString());
ShowMsg("客戶端:" + client.LocalEndPoint.ToString());
Thread th = new Thread(ReceiveMsg);//連接成功后,就可以接收服務(wù)器發(fā)送的信息了
th.IsBackground = true;
th.Start();
clientSocket.Shutdown(SocketShutdown.Both);//禁止發(fā)送和接受數(shù)據(jù)
clientSocket.Close();//關(guān)閉socket,釋放資源
五、Socket對象的成員
1、屬性
名稱 | 說明 |
---|---|
AddressFamily | 獲取 Socket 的地址族。 |
Available | 獲取已經(jīng)從網(wǎng)絡(luò)接收且可供讀取的數(shù)據(jù)量。 |
Blocking | 獲取或設(shè)置一個值,該值指示 Socket 是否處于阻止模式。 |
Connected | 獲取一個值,該值指示 Socket 是在上次 Send 還是 Receive 操作時連接到遠(yuǎn)程主機。 |
Handle | 獲取 Socket 的操作系統(tǒng)句柄。 |
LocalEndPoint | 獲取本地終結(jié)點。 |
RemoteEndPoint | 獲取遠(yuǎn)程終結(jié)點。 |
ProtocolType | 獲取 Socket 的協(xié)議類型。 |
SocketType | 獲取 Socket 的類型。 |
ReceiveBufferSize | 獲取或設(shè)置一個值,它指定 Socket 接收緩沖區(qū)的大小。 |
ReceiveTimeout | 獲取或設(shè)置一個值,該值指定之后同步 Receive 調(diào)用將超時的時間長度。 |
SendBufferSize | 獲取或設(shè)置一個值,該值指定 Socket 發(fā)送緩沖區(qū)的大小。 |
SendTimeout | 獲取或設(shè)置一個值,該值指定之后同步 Send 調(diào)用將超時的時間長度。 |
2、方法
Accept
名稱 | 說明 |
---|---|
Accept() | 為新建連接創(chuàng)建新的 Socket。 |
BeginAccept(AsyncCallback, Object) ? | 開始一個異步操作來接受一個傳入的連接嘗試。 |
EndAccept(Byte[], IAsyncResult) | 異步接受傳入的連接嘗試,并創(chuàng)建新的 Socket 對象來處理遠(yuǎn)程主機通信。 此方法返回包含所傳輸?shù)某跏紨?shù)據(jù)的緩沖區(qū)。 |
AcceptAsync(SocketAsyncEventArgs)? | 開始一個異步操作來接受一個傳入的連接嘗試。 |
Connect
名稱 | 說明 |
---|---|
Connect(EndPoint) | 與遠(yuǎn)程主機建立連接。 |
BeginConnect(EndPoint, AsyncCallback, Object) | 開始一個對遠(yuǎn)程主機連接的異步請求。 |
EndConnect(IAsyncResult) | 結(jié)束掛起的異步連接請求。 |
ConnectAsync(SocketAsyncEventArgs) | 開始一個對遠(yuǎn)程主機連接的異步請求。 |
Disconnect
名稱 | 說明 |
---|---|
Disconnect(Boolean) | 關(guān)閉套接字連接并允許重用套接字。 |
BeginDisconnect(Boolean, AsyncCallback, Object) | 開始異步請求從遠(yuǎn)程終結(jié)點斷開連接。 |
EndDisconnect(IAsyncResult) | 結(jié)束掛起的異步斷開連接請求。 |
DisconnectAsync(SocketAsyncEventArgs) | 關(guān)閉套接字連接并允許重用套接字。 |
Receive
名稱 | 說明 |
---|---|
Receive(Byte[]) | 從綁定的 Socket 套接字接收數(shù)據(jù),將數(shù)據(jù)存入接收緩沖區(qū)。 |
BeginReceive(Byte[], Int32, Int32, SocketFlags, AsyncCallback, Object) | 開始從連接的 Socket 中異步接收數(shù)據(jù)。 |
EndReceive(IAsyncResult) | 結(jié)束掛起的異步讀取。 |
ReceiveAsync(SocketAsyncEventArgs) | 開始一個異步請求以便從連接的 Socket 對象中接收數(shù)據(jù)。 |
ReceiveFrom
名稱 | 說明 |
---|---|
ReceiveFrom(Byte[], EndPoint) | 將數(shù)據(jù)報接收到數(shù)據(jù)緩沖區(qū)并存儲終結(jié)點。 |
BeginReceiveFrom(Byte[], Int32, Int32, SocketFlags, EndPoint, AsyncCallback, Object) | 開始從指定網(wǎng)絡(luò)設(shè)備中異步接收數(shù)據(jù)。 |
EndReceiveFrom(IAsyncResult, EndPoint) | 結(jié)束掛起的、從特定終結(jié)點進(jìn)行異步讀取。 |
ReceiveFromAsync(SocketAsyncEventArgs) | 開始從指定網(wǎng)絡(luò)設(shè)備中異步接收數(shù)據(jù)。 |
ReceiveMessageFrom
名稱 | 說明 |
---|---|
ReceiveMessageFrom(Byte[], Int32, Int32, SocketFlags, EndPoint, IPPacketInformation) | 使用指定的 SocketFlags 將指定字節(jié)數(shù)的數(shù)據(jù)接收到指定的數(shù)據(jù)緩沖區(qū)位置,并存儲終結(jié)點和數(shù)據(jù)包信息。 |
BeginReceiveMessageFrom(Byte[], Int32, Int32, SocketFlags, EndPoint, AsyncCallback, Object) | 開始使用指定的 SocketFlags 將指定字節(jié)數(shù)的數(shù)據(jù)異步接收到數(shù)據(jù)緩沖區(qū)的指定位置,然后存儲終結(jié)點和數(shù)據(jù)包信息。 |
EndReceiveMessageFrom(IAsyncResult, SocketFlags, EndPoint, IPPacketInformation) | 結(jié)束掛起的、從特定終結(jié)點進(jìn)行異步讀取。 此方法還顯示有關(guān)數(shù)據(jù)包而不是 EndReceiveFrom(IAsyncResult, EndPoint) 的更多信息。 |
ReceiveMessageFromAsync(SocketAsyncEventArgs) | 開始使用指定的 SocketFlags 將指定字節(jié)數(shù)的數(shù)據(jù)異步接收到數(shù)據(jù)緩沖區(qū)的指定位置,并存儲終結(jié)點和數(shù)據(jù)包信息。 |
Send
名稱 | 說明 |
---|---|
Send(Byte[]) | 將數(shù)據(jù)發(fā)送到連接的 Socket。 |
BeginSend(Byte[], Int32, Int32, SocketFlags, AsyncCallback, Object) | 將數(shù)據(jù)異步發(fā)送到連接的 Socket。 |
EndSend(IAsyncResult) | 結(jié)束掛起的異步發(fā)送。 |
SendAsync(SocketAsyncEventArgs) | 將數(shù)據(jù)異步發(fā)送到連接的 Socket 對象。 |
SendFile
名稱 | 說明 |
---|---|
SendFile(String) | 使用 Socket 傳輸標(biāo)志,將文件 fileName 發(fā)送到連接的 UseDefaultWorkerThread 對象。 |
BeginSendFile(String, AsyncCallback, Object) | 使用 Socket 標(biāo)志,將文件 fileName 發(fā)送到連接的 UseDefaultWorkerThread 對象。 |
EndSendFile(IAsyncResult) | 結(jié)束文件的掛起異步發(fā)送。 |
SendTo
名稱 | 說明 |
---|---|
SendTo(Byte[], EndPoint) | 將數(shù)據(jù)發(fā)送到指定的終結(jié)點。 |
BeginSendTo(Byte[], Int32, Int32, SocketFlags, EndPoint, AsyncCallback, Object) | 以異步方式將數(shù)據(jù)發(fā)送到特定遠(yuǎn)程主機。 |
EndSendTo(IAsyncResult) | 結(jié)束掛起的、向指定位置進(jìn)行的異步發(fā)送。 |
SendToAsync(SocketAsyncEventArgs) | 以異步方式將數(shù)據(jù)發(fā)送到特定遠(yuǎn)程主機。 |
其它
名稱 | 說明 |
---|---|
Select(IList, IList, IList, Int32) | 確定一個或多個套接字的狀態(tài)。 |
SendPacketsAsync(SocketAsyncEventArgs) | 將文件集合或者內(nèi)存中的數(shù)據(jù)緩沖區(qū)以異步方法發(fā)送給連接的 Socket 對象。 |
Bind(EndPoint) | 使 Socket 與一個本地終結(jié)點相關(guān)聯(lián)。 |
Listen(Int32) | 將 Socket 置于偵聽狀態(tài)。 |
CancelConnectAsync(SocketAsyncEventArgs) | 取消一個對遠(yuǎn)程主機連接的異步請求。 |
GetSocketOption(SocketOptionLevel, SocketOptionName) | 返回指定的 Socket 選項的值,表示為一個對象。 |
SetSocketOption(SocketOptionLevel, SocketOptionName, Boolean) | 將指定的 Socket 選項設(shè)置為指定的 Boolean 值。 |
SetIPProtectionLevel(IPProtectionLevel) | 設(shè)置套接字的 IP 保護(hù)級別。 |
Shutdown(SocketShutdown) | 禁用某 Socket 上的發(fā)送和接收。 |
Close() | 關(guān)閉 Socket 連接并釋放所有關(guān)聯(lián)的資源。 |
Dispose() | 釋放 Socket 類的當(dāng)前實例所使用的所有資源。 |
原文鏈接:https://www.cnblogs.com/springsnow/p/9433988.html
相關(guān)推薦
- 2022-06-21 解決Git?Bash中文亂碼的問題_其它綜合
- 2022-04-12 qt5之QFile讀寫文件功能詳解_C 語言
- 2023-02-27 pandas中concatenate和combine_first的用法詳解_python
- 2022-02-01 微信小程序批量獲取input的輸入值,監(jiān)聽輸入框,數(shù)據(jù)同步
- 2023-12-15 Linux系統(tǒng)設(shè)置多個IP地址、默認(rèn)路由、指定路由、永久刪除默認(rèn)路由
- 2022-07-22 CSS3過渡與動畫
- 2023-07-10 解決flask (flask-restful)中文亂碼問題
- 2022-06-12 GO語言中常見的排序算法使用示例_Golang
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支