日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Sock基础

發(fā)布時間:2023/12/10 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Sock基础 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.


z
1 客戶端
//客戶端 通信套接字
//1.創(chuàng)建監(jiān)聽套接字 使用 ip4協(xié)議,流式傳輸,TCP連接
Socket sokMsg = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//2.獲取要連接的服務端 節(jié)點
//2.1獲取網絡節(jié)點對象
IPAddress address = IPAddress.Parse(txtIP.Text);//127.0.0.1
IPEndPoint endPoint = new IPEndPoint(address, int.Parse(txtPort.Text));//10001
//3.向服務端 發(fā)送鏈接請求
sokMsg.Connect(endPoint);
//4.開啟通信線程
//客戶端 通信線程
Thread thrMsg = new Thread(RecevieMsg);
thrMsg.IsBackground = true;
thrMsg.SetApartmentState(ApartmentState.STA);//在winform7 要用到
thrMsg.Start();
------------------------------
void RecevieMsg()
{
//3.1創(chuàng)建 消息緩存區(qū)
byte[] arrMsg = new byte[1024 * 1024 * 1];
try
{
while (isRec)
{
//此處 接收 服務器發(fā)來的數據中,因為包含了一個 標識符,所以內容的真實長度,應該 - 1
int realLength = sokMsg.Receive(arrMsg) - 1;// Receive 會阻斷線程

switch (arrMsg[0])
{
case 0://接收到文本消息
GetMsg(arrMsg, realLength);
break;
case 1://
GeFile(arrMsg, realLength);
break;
default:
break;
}
}
}
catch (Exception ex)
{
sokMsg.Close();
sokMsg = null;
ShowMsg("服務端斷開連接!");
}
}

?


2 在服務端
private void btnStartListen_Click(object sender, EventArgs e)
{
try
{
//1.創(chuàng)建【監(jiān)聽套接字】 使用 ip4協(xié)議,流式傳輸,TCP連接
sokWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//2.綁定端口
//2.1獲取網絡節(jié)點對象
IPAddress address = IPAddress.Parse(txtIP.Text);//127.0.0.1
IPEndPoint endPoint = new IPEndPoint(address, int.Parse(txtPort.Text));//10001
//2.2綁定端口(其實內部 就向系統(tǒng)的 端口表中 注冊 了一個端口,并指定了當前程序句柄)
sokWatch.Bind(endPoint);
//2.3設置監(jiān)聽隊列(指,限制 同時 處理的 連接請求數--即同時處理的客戶端連接請求)
sokWatch.Listen(10);
//2.4開始監(jiān)聽,調用監(jiān)聽線程 執(zhí)行 監(jiān)聽套接字的 監(jiān)聽方法
thrWatch = new Thread(WatchConnecting);
thrWatch.IsBackground = true;
thrWatch.Start();
ShowMsg("服務器啟動啦~~!");
}
catch (SocketException sex)
{
MessageBox.Show("異常:" + sex);
}
catch (Exception ex)
{
MessageBox.Show("異常:" + ex);
}
}

/// <summary>
/// 服務端監(jiān)聽方法
/// </summary>
void WatchConnecting()
{
try
{
//循環(huán)監(jiān)聽 客戶端的 連接請求
while (isWatch)
{
//2.4開始監(jiān)聽:此方法會阻斷當前線程,直到有 其它程序 連接過來,才執(zhí)行完畢
Socket sokMsg = sokWatch.Accept();
//2.5創(chuàng)建通信管理類
MsgConnection conn = new MsgConnection(sokMsg, ShowMsg, RemoveClient);

//將當前連接成功的 【與客戶端通信的套接字】 的 標識 保存起來,并顯示到 列表中
//將 遠程客戶端的 ip和端口 字符串 存入 列表
lbOnline.Items.Add(sokMsg.RemoteEndPoint.ToString());
//將 服務端的通信套接字 存入 字典集合
dictCon.Add(sokMsg.RemoteEndPoint.ToString(), conn);

ShowMsg("有客戶端連接了~~!");
}
}
catch (Exception ex)
{
ShowMsg("異常:" + ex);
}
}

// 發(fā)送消息
sokMsg.Send();


/// <summary>
/// 斷開socket連接
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btdisConnect_Click(object sender, EventArgs e)
{
//如果當前客戶端的鏈接socket不為空并且處于和服務器的鏈接狀態(tài)時,斷開當前鏈接
if (cSocket != null && cSocket.Connected)
{
cSocket.Disconnect(false);
}
}

?


----------------------------可以將一個實體序列化成數組
/// <summary>
/// 將對象序列化成byte[]數組的幫助類,提供序列化和反序列功能
/// </summary>
public class SerDesrHelper
{
/// <summary>
/// 將對象序列化成byte數組
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
public static byte[] Serialization(object obj)
{
byte[] buffer;
//1 初始化一個二進制流的序列化器
BinaryFormatter ser = new BinaryFormatter();
// 2 定義一個內存流,用來接收二進制流的序列化器將對象obj序列化以后的byte[]數組
using (MemoryStream ms = new MemoryStream())
{
// 3 調用二進制流的序列化器Serialize()方法將obj序列化成二進制流保存到ms中
ser.Serialize(ms, obj);

//4 要將ms的當前流指針定位到0的位置
ms.Position = 0;
// 5 定義一個ms長度的接收byte[]數組
buffer = new byte[ms.Length];

// 6 將ms中的內容讀到byte[]數組buffer中
ms.Read(buffer, 0, buffer.Length);
}

// 7 返回有內容的buffer
return buffer;
}

/// <summary>
/// 將byte數組字節(jié)碼反序列化成相應的對象
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="objbty"></param>
/// <returns></returns>
public static T Deserialize<T>(byte[] objbty)
{
if (objbty.Length == 0) return default(T);

//1 初始化一個二進制流的序列化器
BinaryFormatter ser = new BinaryFormatter();
using (MemoryStream ms = new MemoryStream(objbty))
{
return (T)ser.Deserialize(ms);
}
}
}

轉載于:https://www.cnblogs.com/cdaq/p/4645579.html

總結

以上是生活随笔為你收集整理的Sock基础的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。