1. 依存ライブラリを導入します。サードパーティは必要ありません。
using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Windows.Forms;
2. 変数宣言
/// <summary>
/// 缓冲器
/// </summary>
private byte[] result = new byte[1024];
/// <summary>
/// 最大连接数
/// </summary>
private int maxClientCount;
/// <summary>
/// 服务IP地址
/// </summary>
private string ip;
/// <summary>
/// 服务端口号
/// </summary>
private int port;
// 编码
// private string code;
/// <summary>
/// 客户端列表
/// </summary>
private List<Socket> ClientSockets;
/// <summary>
/// IP终端
/// </summary>
private IPEndPoint ipEndPoint;
/// <summary>
/// 服务端Socket
/// </summary>
private Socket ServerSocket;
/// <summary>
/// 当前客户端Socket
/// </summary>
private Socket ClientSocket;
3. TCPサービスを開きます
ip = IPAddress.Any.ToString(); //服务于任意IP地址
port=8640;//服务端口,理论自定义范围 1-65535,不可与以开放端口冲突
maxClientCount = 256; //设定最大连接数
ClientSockets = new List<Socket>();
ipEndPoint = new IPEndPoint(IPAddress.Any, port); //初始化IP终端
ServerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //初始化服务端Socket
ServerSocket.Bind(this.ipEndPoint); //端口绑定
ServerSocket.Listen(maxClientCount); //设置监听数目
Thread ServerThread = new Thread(() =>
{
ListenClientConnect(); //开启监听,后台线程,非阻塞
})
{
IsBackground = true,
};
ServerThread.Start();//服务端线程开启
4. TCP 接続のリスニング
/// <summary>
/// 后台线程侦听连接
/// </summary>
private void ListenClientConnect()
{
//设置循环标志位
while (true)
{
try
{
//获取连接到服务端的客户端
ClientSocket = ServerSocket.Accept();
//将获取到的客户端添加到客户端列表
ClientSockets.Add(ClientSocket);
//显示连接者信息
//Show_msg($@"客户端接入:{ClientSocket.RemoteEndPoint}");
//创建客户端消息线程,实现客户端消息的循环监听
Thread ReveiveThread = new Thread(() =>
{
ReceiveClient(ClientSocket); //数据接收
})
{
IsBackground = true,
};
ReveiveThread.Start();
}
catch (Exception ex)
{
//Show_msg($@"连接侦听异常:{ex.Message}");
}
}
}
5. データ受信
/// <summary>
/// 后台线程接收数据
/// </summary>
/// <param name="obj"></param>
private void ReceiveClient(object obj)
{
Socket _ClientSocket = (Socket)obj;
while (true)
{
try
{
//获取数据长度
int receiveLength = _ClientSocket.Receive(result);
//获取客户端发来的数据
string strData = Encoding.UTF8.GetString(result, 0, receiveLength);
//Show_msg($@"客户端{_ClientSocket.RemoteEndPoint}】 发来数据:{strData}");
/*
对接收到的数据进行处理
*/
//向客户端回发数据
//_ClientSocket.Send(Encoding.UTF8.GetBytes($@"我已收到您发来的数据{strData }"));
}
catch (Exception e)//通讯出现异常
{
//从客户端列表中移除该客户端
this.ClientSockets.Remove(_ClientSocket);
//断开连接
//Show_msg($@"客户端{_ClientSocket.RemoteEndPoint}从服务器断开,断开原因:{e.Message}");
_ClientSocket.Shutdown(SocketShutdown.Both);
_ClientSocket.Close();
break;
}
}
}