Sock基础
z
1 客戶端
//客戶端 通信套接字
//1.創(chuàng)建監(jiān)聽套接字 使用 ip4協(xié)議,流式傳輸,TCP連接
Socket sokMsg = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//2.獲取要連接的服務(wù)端 節(jié)點
//2.1獲取網(wǎng)絡(luò)節(jié)點對象
IPAddress address = IPAddress.Parse(txtIP.Text);//127.0.0.1
IPEndPoint endPoint = new IPEndPoint(address, int.Parse(txtPort.Text));//10001
//3.向服務(wù)端 發(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)
{
//此處 接收 服務(wù)器發(fā)來的數(shù)據(jù)中,因為包含了一個 標識符,所以內(nèi)容的真實長度,應(yīng)該 - 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("服務(wù)端斷開連接!");
}
}
?
2 在服務(wù)端
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獲取網(wǎng)絡(luò)節(jié)點對象
IPAddress address = IPAddress.Parse(txtIP.Text);//127.0.0.1
IPEndPoint endPoint = new IPEndPoint(address, int.Parse(txtPort.Text));//10001
//2.2綁定端口(其實內(nèi)部 就向系統(tǒng)的 端口表中 注冊 了一個端口,并指定了當前程序句柄)
sokWatch.Bind(endPoint);
//2.3設(shè)置監(jiān)聽隊列(指,限制 同時 處理的 連接請求數(shù)--即同時處理的客戶端連接請求)
sokWatch.Listen(10);
//2.4開始監(jiān)聽,調(diào)用監(jiān)聽線程 執(zhí)行 監(jiān)聽套接字的 監(jiān)聽方法
thrWatch = new Thread(WatchConnecting);
thrWatch.IsBackground = true;
thrWatch.Start();
ShowMsg("服務(wù)器啟動啦~~!");
}
catch (SocketException sex)
{
MessageBox.Show("異常:" + sex);
}
catch (Exception ex)
{
MessageBox.Show("異常:" + ex);
}
}
/// <summary>
/// 服務(wù)端監(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());
//將 服務(wù)端的通信套接字 存入 字典集合
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不為空并且處于和服務(wù)器的鏈接狀態(tài)時,斷開當前鏈接
if (cSocket != null && cSocket.Connected)
{
cSocket.Disconnect(false);
}
}
?
----------------------------可以將一個實體序列化成數(shù)組
/// <summary>
/// 將對象序列化成byte[]數(shù)組的幫助類,提供序列化和反序列功能
/// </summary>
public class SerDesrHelper
{
/// <summary>
/// 將對象序列化成byte數(shù)組
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
public static byte[] Serialization(object obj)
{
byte[] buffer;
//1 初始化一個二進制流的序列化器
BinaryFormatter ser = new BinaryFormatter();
// 2 定義一個內(nèi)存流,用來接收二進制流的序列化器將對象obj序列化以后的byte[]數(shù)組
using (MemoryStream ms = new MemoryStream())
{
// 3 調(diào)用二進制流的序列化器Serialize()方法將obj序列化成二進制流保存到ms中
ser.Serialize(ms, obj);
//4 要將ms的當前流指針定位到0的位置
ms.Position = 0;
// 5 定義一個ms長度的接收byte[]數(shù)組
buffer = new byte[ms.Length];
// 6 將ms中的內(nèi)容讀到byte[]數(shù)組buffer中
ms.Read(buffer, 0, buffer.Length);
}
// 7 返回有內(nèi)容的buffer
return buffer;
}
/// <summary>
/// 將byte數(shù)組字節(jié)碼反序列化成相應(yīng)的對象
/// </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);
}
}
}
轉(zhuǎn)載于:https://www.cnblogs.com/cdaq/p/4645579.html
總結(jié)
- 上一篇: python 3.7 安装 win32
- 下一篇: 公司用章知识