1、简易客户端和服务端的聊天
- 实现客户端和服务端的消息请求和收发
- 实现多台客户端的连接,消息的异步发送
- 实现客户端的正常退出和异常退出检测
服务器端
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
namespace TCPServer
{
class Program
{
static void Main(string[] args)
{
StartServerASync();
Console.ReadKey();
}
//同步发送消息,只能一条一条发送,需要采用异步的方式,持续不断的收发消息
static void StartServerASync()
{
Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress ipAddress = IPAddress.Parse("192.168.0.124");
IPEndPoint ipEndPoint = new IPEndPoint(ipAddress, 88);
serverSocket.Bind(ipEndPoint);//绑定ip和端口号
serverSocket.Listen(0);//开始监听端口号
//Socket clientSocket = serverSocket.Accept();//接收一个客户端连接
//为了实现和多个客户端的连接,接收客户端的连接也需要使用异步的方式
serverSocket.BeginAccept(AcceptCallBack, serverSocket);
}
static void AcceptCallBack(IAsyncResult ar)
{
Socket serverSocket = ar.AsyncState as Socket;
Socket clientSocket = serverSocket.EndAccept(ar);
string msg = "Hello Client! 你好...";
byte[] data = System.Text.Encoding.UTF8.GetBytes(msg);
clientSocket.Send(data);
clientSocket.BeginReceive(dataBuffer, 0, 1024, 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;
}
string msg = Encoding.UTF8.GetString(dataBuffer, 0, count);
Console.WriteLine("从客户端接收到数据:" + msg);
clientSocket.BeginReceive(dataBuffer, 0, 1024, SocketFlags.None, ReceiveCallBack, clientSocket);//回调
}
catch (Exception e)
{
Console.WriteLine(e);
if (clientSocket != null)
{
clientSocket.Close();
}
}
}
}
}
客户端
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
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("192.168.0.124"), 88));
//客户端接收消息,收发顺序与服务器端相反
byte[] data = new byte[1024];
int count = clientSocket.Receive(data);//Receive执行后才继续执行下面代码
string msg = Encoding.UTF8.GetString(data, 0, count);
Console.Write(msg);
while (true)
{
string s = Console.ReadLine();
//Console.Write(s);
if (s == "exit")
{
clientSocket.Close();return;
}
clientSocket.Send(Encoding.UTF8.GetBytes(s));
}
Console.ReadKey();
clientSocket.Close();
}
}
}
客户端和服务端之间数据的传输以数据包的形式,当短时间内每个包都很小的时候,会采用粘包的方式传输(合并再发送);当包太大的时候,会采用分包的方式进行传输。