服务器端:
//本机10.0.117.245
using System.Net.Sockets;
using System.Net;
using System.Text;
using System;
using ConsoleApp1;
namespace ServiceTerminal
{
class Program
{
static void Main(string[] args)
{
StartServerAsync();
Console.ReadKey();
}
static Messgae msg = new Messgae();
static void StartServerAsync()//异步
{
Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//寻址方案,类型,协议
IPAddress ipAddress = IPAddress.Parse("10.0.117.245");//绑定IP
IPEndPoint ipEndPoint = new IPEndPoint(ipAddress, 88);//绑定端口号
serverSocket.Bind(ipEndPoint);//绑定ip和端口号
serverSocket.Listen(0);//挂起客户端数量队列为 0==无限 监听
serverSocket.BeginAccept(AcceptCallBack, serverSocket);//异步等待客户端连接
}
static void AcceptCallBack(IAsyncResult ar)
{
Socket serverSocket = ar.AsyncState as Socket;
Socket clientSocket = serverSocket.EndAccept(ar);
string msgStr = "Hello Client!";
byte[] data = Encoding.UTF8.GetBytes(msgStr);//根据UTF8转换编码格式
clientSocket.Send(data);//向客户端发送消息
clientSocket.BeginReceive(msg.Data, msg.StartIndex, msg.RemainSize, SocketFlags.None, ReceiveCallBack, clientSocket);//异步进行接受数据
serverSocket.BeginAccept(AcceptCallBack, serverSocket);//递归
}
static byte[] dataBuffer = new byte[1024];//设置数组最大字节
static void ReceiveCallBack(IAsyncResult ar)
{
Socket clientSocket = null;
try
{
clientSocket = ar.AsyncState as Socket;
int count = clientSocket.EndReceive(ar);
if (count == 0)//处理正常关闭情况
{
clientSocket.Close();
return;
}
msg.AddCount(count);//读取到count个字节
msg.ReadMessage();
clientSocket.BeginReceive(msg.Data, msg.StartIndex, msg.RemainSize, SocketFlags.None, ReceiveCallBack, clientSocket);//异步进行接受数据
}
catch (Exception e)//处理非正常关闭情况
{
Console.WriteLine(e);
if (clientSocket != null)
{
clientSocket.Close();
}
}
}
static void StartServerSync()//同步
{
Socket serverSocker = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//寻址方案,类型,协议
IPAddress ipAddress = IPAddress.Parse("10.0.117.245");//绑定IP
IPEndPoint ipEndPoint = new IPEndPoint(ipAddress, 88);//绑定端口号
serverSocker.Bind(ipEndPoint);//绑定ip和端口号
serverSocker.Listen(0);//挂起客户端数量队列为 0==无限 监听
serverSocker.Accept();//接收端口 代码到在这里会暂停 直到有客户端连入
Socket clientSocket = serverSocker.Accept();//接受一个客户端连接
string msg = "Hello Client!";
byte[] data = Encoding.UTF8.GetBytes(msg);//根据UTF8转换编码格式
clientSocket.Send(data);//向客户端发送消息
byte[] dataBuffer = new byte[1024];//创建接受数据的数组大小
int count = clientSocket.Receive(dataBuffer);//接收消息
string msgReceive = Encoding.UTF8.GetString(dataBuffer, 0, count);//从dataBuffer数组中的0号位置开始 读取count个字节的数据 根据UTF8转换编码格式
Console.WriteLine(msgReceive);
clientSocket.Close();//关闭与客户端的连接
serverSocker.Close();//关闭服务端
}
}
}
客户端:
using System;
using System.Text;
using System.Net.Sockets;
using System.Net;
namespace TCPClient
{
class Program
{
static void Main(string[] args)
{
Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
clientSocket.Connect(new IPEndPoint(IPAddress.Parse("10.0.117.245"), 88));//建立连接
byte[] data = new byte[1024];
int count = clientSocket.Receive(data);
string msg = Encoding.UTF8.GetString(data, 0, count);//转换数据
Console.Write(msg);
for (int i = 0; i < 100; i++)//粘包
{
clientSocket.Send(Class1.GetBytes(i.ToString()));//需要转换编码格式
}
Console.ReadKey();
clientSocket.Close();
}
}
}
转码:
using System;
using System.Linq;
using System.Text;
namespace TCPClient
{
class Class1
{
public static byte[] GetBytes(string data)
{
byte[] dataBytes = Encoding.UTF8.GetBytes(data);//转换为字节数组
int dataLength = dataBytes.Length;//获取到字节长度
byte[] lengthBytes = BitConverter.GetBytes(dataLength);//数据长度
byte[] newBytes = lengthBytes.Concat(dataBytes).ToArray();//数据
return newBytes;
}
}
}
解析数据:
using System;
using System.Text;
namespace ConsoleApp1
{
class Messgae
{
private byte[] data = new byte[1024];//数据长度
private int startIndex = 0;//计数器
public void AddCount(int count)
{
startIndex += count;
}
public byte[] Data//存储数据
{
get { return data; }
}
public int StartIndex//当前存储位置
{
get { return startIndex; }
}
public int RemainSize//剩余空间
{
get { return data.Length - startIndex; }
}
public void ReadMessage()//解析或者读取数据
{
while (true)
{
if (startIndex <= 4)
{
return;
}
int count = BitConverter.ToInt32(data, 0);
if ((startIndex - 4) >= count)//从索引为4的开始读取数据
{
string s = Encoding.UTF8.GetString(data, 4, count);//得到一条完整的记录
Console.WriteLine("解析出来一条数据:" + s);
Array.Copy(data, count + 4, data, 0, startIndex - 4 - count);//移动
startIndex -= (count + 4);//更新数据
}
else
{
break;
}
}
}
}
}