服务端代码
C# — WinForm TCP连接之服务器端
TCP连接之服务器端,涉及到如下三个函数,分别是:
复制代码
/*****************************
** 函数功能:
服务端监听
** 输入参数:
** 输出参数:
******************************/
private void ServerListen(){}
复制代码
复制代码
/******************************
** 函数功能:
用于与客户端取得连接
** 输入参数:
** 输出参数:
******************************/
private void AcceptConnect(){}
复制代码
复制代码
/******************************
** 函数功能:
接受客户端发回的信息
** 输入参数:
ar:客户端发回的信息
** 输出参数:
******************************/
private void ReadCallback(IasyncResult ar){}
复制代码
三者的关系图如下:
具体代码如下:
1、ServerListen()
复制代码
private bool isExit = false;
TcpListener listener;
//用于线程同步,初始状态设为非终止状态,使用手动重置方式
private EventWaitHandle allDone = new EventWaitHandle(false, EventResetMode.ManualReset);
/******************************
** 作者: ***
** 变更时间: 2012-12-26
******************************/
#region 服务端监听方法
private void ServerListen()
{
//由于服务器要为多个客户服务,所以需要创建一个线程监听客户端连接请求
ThreadStart ts = new ThreadStart(AcceptConnect);
Thread myThread = new Thread(ts);
myThread.Start();
}
#endregion
复制代码
2、AcceptConnect()
复制代码
/******************************
** 作者: ***
** 变更时间: 2012-12-26
******************************/
#region 与客户机取得连接
private void AcceptConnect()
{
//获取本机所有IP地址
IPAddress[] localips = Dns.GetHostAddresses(Dns.GetHostName());
foreach (IPAddress ip in localips)
{
//找到本地所有IP地址符合IPV4协议的IP地址
if (ip.AddressFamily == AddressFamily.InterNetwork)
{
IPAddress ip4;
ip4 = ip;
listener = new TcpListener(ip4, 5000);
listener.Start();
break;
}
}
//引用在异步操作完成时调用的回调方法
AsyncCallback callback = new AsyncCallback(AcceptTcpClientCallback);
while (isExit == false)
{
//将事件的状态设为非终止
allDone.Reset();
//开始一个异步操作接受传入的连接尝试
listener.BeginAcceptTcpClient(callback, listener);
//阻塞当前线程,直到收到客户连接信号
allDone.WaitOne();
Thread.Sleep(100);
}
}
#endregion
复制代码
3、AcceptTcpClientCallback()
复制代码
/******************************
** 作者: ***
** 变更时间: 2012-12-26
******************************/
#region 连接客户端的回调函数
//ar是IAsyncResult类型的接口,表示异步操作的状态是由listener.BeginAcceptTcpClient(callback, listener)传递过来的
private void AcceptTcpClientCallback(IAsyncResult ar)
{
//将事件状态设为终止状态,允许一个或多个等待线程继续
allDone.Set();
TcpListener myListener = (TcpListener)ar.AsyncState;
//异步接收传入的连接,并创建新的TcpClient对象处理远程主机通信
TcpClient client = myListener.EndAcceptTcpClient(ar);
ReadWriteObject readWriteObject = new ReadWriteObject(client);
readWriteObject.netStream.BeginRead(readWriteObject.readBytes, 0, readWriteObject.readBytes.Length, ReadCallback, readWriteObject);
}
#endregion
复制代码
4、ReadCallback()
复制代码
byte[] tem = new byte[24];
byte[] Msgbody;
byte[] ErrorEndTime;
ByteToObject bytetoobject = new ByteToObject();
/******************************
** 作者: ***
** 变更时间: 2012-12-02
******************************/
#region 接收客户端发来的信息,ar为异步方法下客户端发回的信息
private void ReadCallback(IAsyncResult ar)
{
ReadWriteObject readWriteObject = (ReadWriteObject)ar.AsyncState;
int length = readWriteObject.netStream.EndRead(ar);
tem = new byte[24];
Array.Copy(readWriteObject.readBytes, 0, tem, 0, 24);
//MsgHead为自定义的结构体
MsgHead msghead = (MsgHead)bytetoobject.BytesToStuct(tem, typeof(MsgHead));
if (length > 0 && msghead.Sync == 0x4D)
{
switch (msghead.MsgType)
{
//根据收到的信息的头部来执行下面的操作
}
}
}
客户端代码
C# — WinForm TCP连接之客户端
TCP连接之客户端,涉及到如下三个函数,分别是:
复制代码
/*****************************
** 函数功能:
用于与服务端进行TCP连接
** 输入参数:
IP:IP地址
Port:端口号
** 输出参数:
******************************/
private void ClientConnect(string IP, string Port){}
复制代码
复制代码
/******************************
** 函数功能:
用于向服务端发送信息
** 输入参数:
MsgType:TCP协议中的协议头部
** 输出参数:
******************************/
private void ClientSendMsg(ushort MsgType){}
复制代码
复制代码
/******************************
** 函数功能:
接受服务端发回的信息
** 输入参数:
** 输出参数:
******************************/
private void RecMsg(){}
复制代码
三者的关系图如下:
具体代码如下:
1、ClientConnect()
复制代码
/******************************
** 作者: ***
** 变更时间: 2012-12-02
******************************/
#region 连接服务端方法
private void ClientConnect(string IP, string Port)
{
//定义一个套字节监听 包含3个参数(IP4寻址协议,流式连接,TCP协议)
socketClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//需要获取文本框中的IP地址
IPAddress ipaddress = IPAddress.Parse(IP);
//将获取的ip地址和端口号绑定到网络节点endpoint上
IPEndPoint endpoint = new IPEndPoint(ipaddress, int.Parse(Port));
//这里客户端套接字连接到网络节点(服务端)用的方法是Connect 而不是Bind
socketClient.Connect(endpoint);
//创建一个线程 用于监听服务端发来的消息
threadClient = new Thread(RecMsg);
//将窗体线程设置为与后台同步
threadClient.IsBackground = true;
//启动线程
threadClient.Start();
}
#endregion
复制代码
2、ClientSendMsg()
复制代码
/******************************
** 作者: ***
** 变更时间: 2012-12-02
******************************/
#region 发送节目全屏byte串信息到服务端的方法
private void ClientSendMsg(ushort MsgType)
{
//调用客户端套接字发送字节数组
socketClient.Send(addHeadBody);
}
#endregion
复制代码
3、RecMsg()
复制代码
/******************************
** 作者: 郭乐彬
** 变更时间: 2012-11-30
******************************/
#region 接收服务端发来信息的方法
private void RecMsg()
{
while (true) //持续监听服务端发来的消息
{
//定义一个1024*200的内存缓冲区 用于临时性存储接收到的信息
byte[] arrRecMsg = new byte[1024 * 200];
//将客户端套接字接收到的数据存入内存缓冲区, 并获取其长度
int length = socketClient.Receive(arrRecMsg);
byte[] tem = new byte[24];
Array.Copy(arrRecMsg, 0, tem, 0, 24);
ByteToObject bytetoobject = new ByteToObject();
//MsgHead为一个自定义的结构体
MsgHead msghead = (MsgHead)bytetoobject.BytesToStuct(tem, typeof(MsgHead));
switch (msghead.MsgType)
{
//根据自定义的TCP协议中规定的头部来决定后面的操作
}
}
}
原文:https://www.cnblogs.com/baylor2019/p/13629504.html