博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Sock基础
阅读量:5128 次
发布时间:2019-06-13

本文共 3763 字,大约阅读时间需要 12 分钟。

z
1 客户端
//客户端 通信套接字
//1.创建监听套接字 使用 ip4协议,流式传输,TCP连接
Socket sokMsg = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//2.获取要连接的服务端 节点
//2.1获取网络节点对象
IPAddress address = IPAddress.Parse(txtIP.Text);//127.0.0.1
IPEndPoint endPoint = new IPEndPoint(address, int.Parse(txtPort.Text));//10001
//3.向服务端 发送链接请求
sokMsg.Connect(endPoint);
//4.开启通信线程
//客户端 通信线程
Thread thrMsg = new Thread(RecevieMsg);
thrMsg.IsBackground = true;
thrMsg.SetApartmentState(ApartmentState.STA);//在winform7 要用到
thrMsg.Start();
------------------------------
void RecevieMsg()
{
//3.1创建 消息缓存区
byte[] arrMsg = new byte[1024 * 1024 * 1];
try
{
while (isRec)
{
//此处 接收 服务器发来的数据中,因为包含了一个 标识符,所以内容的真实长度,应该 - 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.创建【监听套接字】 使用 ip4协议,流式传输,TCP连接
sokWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//2.绑定端口
//2.1获取网络节点对象
IPAddress address = IPAddress.Parse(txtIP.Text);//127.0.0.1
IPEndPoint endPoint = new IPEndPoint(address, int.Parse(txtPort.Text));//10001
//2.2绑定端口(其实内部 就向系统的 端口表中 注册 了一个端口,并指定了当前程序句柄)
sokWatch.Bind(endPoint);
//2.3设置监听队列(指,限制 同时 处理的 连接请求数--即同时处理的客户端连接请求)
sokWatch.Listen(10);
//2.4开始监听,调用监听线程 执行 监听套接字的 监听方法
thrWatch = new Thread(WatchConnecting);
thrWatch.IsBackground = true;
thrWatch.Start();
ShowMsg("服务器启动啦~~!");
}
catch (SocketException sex)
{
MessageBox.Show("异常:" + sex);
}
catch (Exception ex)
{
MessageBox.Show("异常:" + ex);
}
}

/// <summary>

/// 服务端监听方法
/// </summary>
void WatchConnecting()
{
try
{
//循环监听 客户端的 连接请求
while (isWatch)
{
//2.4开始监听:此方法会阻断当前线程,直到有 其它程序 连接过来,才执行完毕
Socket sokMsg = sokWatch.Accept();
//2.5创建通信管理类
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);
}
}

// 发送消息

sokMsg.Send();

/// <summary>
/// 断开socket连接
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btdisConnect_Click(object sender, EventArgs e)
{
//如果当前客户端的链接socket不为空并且处于和服务器的链接状态时,断开当前链接
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数组字节码反序列化成相应的对象
/// </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

你可能感兴趣的文章
[Serializable]的应用--注册码的生成,加密和验证
查看>>
Linux操作系统 和 Windows操作系统 的区别
查看>>
Android-多线程AsyncTask
查看>>
LeetCode【709. 转换成小写字母】
查看>>
如何在Access2007中使用日期类型查询数据
查看>>
CF992E Nastya and King-Shamans(线段树二分+思维)
查看>>
如果没有按照正常的先装iis后装.net的顺序,可以使用此命令重新注册一下:
查看>>
linux install ftp server
查看>>
Ubuntu下的eclipse安装subclipse遇到没有javahl的问题...(2天解决了)
查看>>
alter database databasename set single_user with rollback IMMEDIATE 不成功问题
查看>>
WCF揭秘——使用AJAX+WCF服务进行页面开发
查看>>
【题解】青蛙的约会
查看>>
IO流
查看>>
mybatis调用存储过程,获取返回的游标
查看>>
设计模式之装饰模式(结构型)
查看>>
面向对象的设计原则
查看>>
Swift3.0服务端开发(三) Mustache页面模板与日志记录
查看>>
EntityFrameWork 实现实体类和DBContext分离在不同类库
查看>>
autopep8
查看>>
GIT在Linux上的安装和使用简介
查看>>