📄 program.cs
字号:
using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.Net.NetworkInformation;
using System.IO;
namespace LxswServer
{
class Program
{
//private string cip = "10.14.110.221";
IPAddress sIP = IPAddress.Parse("10.14.110.229");
private const int sPort = 5257;
Socket ServerSocket;
Socket handler;//用于负责与建立连接的客户端进行通讯
//private int count=1;
string ClientIP;
//定义服务器线程手动控制
private static ManualResetEvent ServerReset = new ManualResetEvent(false);
private bool ReceiveEnd = false;
//程序入口
static void Main(string[] args)
{
//创建program实例
Program Server = new Program();
//服务器监听
Server.Server_Listen();
//有客户端连接后,服务器进行通讯处理
Server.ServerStart();
}
private void Server_Listen()
{
//初始化服务器EndPoint
IPEndPoint sEndPoint = new IPEndPoint(sIP, sPort);
//初始化服务器套接字
ServerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//服务器绑定套接字
ServerSocket.Bind(sEndPoint);
//设定监听可连接服务器的最大客户端数
ServerSocket.Listen(100);
Console.WriteLine("服务器" + sEndPoint.ToString() + "启动监听" + "\r\n");
}
private void ServerStart()
{
//新建一个服务器接受客户端请求的线程
Thread AcceptThread = new Thread(new ThreadStart(Server_Accept));
AcceptThread.Start();
}
private void Server_Accept()
{
try
{
//循环进行异步接受连接
while (true)
{
ServerReset.Reset();
ServerSocket.BeginAccept(new AsyncCallback(AcceptCallback), ServerSocket);
ServerReset.WaitOne();
}
}
catch (Exception ee)
{
Console.WriteLine(ee.ToString() + "\r\n");
}
}
//异步接受连接回调处理
private void AcceptCallback(IAsyncResult ar)
{
try
{
ServerReset.Set();
Socket listener = (Socket)ar.AsyncState;
handler = listener.EndAccept(ar);
//获取远程客户端IP信息
IPEndPoint Client;
Client = (IPEndPoint)handler.RemoteEndPoint;
ClientIP = Client.Address.ToString();
Console.WriteLine("响应客户端" + ClientIP + "的请求" + "\r\n");
}
catch (Exception ee)
{
Console.WriteLine(ee.ToString()+"\r\n");
}
//新建服务器接收数据的线程
Thread ReceiveThread = new Thread(new ThreadStart(Server_Receive));
ReceiveThread.Start();
}
private void Server_Receive()
{
try
{
StateObject state = new StateObject();
state.workSocket = handler;
//服务器开始异步接收数据
handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ServerReadCallback), state);
}
catch (Exception ee)
{
Console.WriteLine(ee.ToString()+"\r\n");
}
}
//服务器异步接收数据回调
private void ServerReadCallback(IAsyncResult ar)
{
try
{
StateObject state=(StateObject)ar.AsyncState;
Socket ServerTemp=state.workSocket;
int BytesReadNumber = 0;
if (ReceiveEnd == false)
{
BytesReadNumber = ServerTemp.EndReceive(ar);
}
//接受到客户端的数据并存储在content中
string ServerBuffer = System.Text.Encoding.BigEndianUnicode.GetString(state.buffer, 0, BytesReadNumber);
state.sb.Append(ServerBuffer);
string content = state.sb.ToString();
state.sb.Remove(0, content.Length);
int len = content.Length;
if (len < 3)
{
byte[] BytesSendData = System.Text.Encoding.BigEndianUnicode.GetBytes("数据错误!<--无结束符");
ServerTemp.BeginSend(BytesSendData, 0, BytesSendData.Length, 0, new AsyncCallback(SendCallback), handler);
Console.WriteLine("数据错误!<--无结束符");
ReceiveEnd=false;
}
else
{
//取接受到数据的末三位,以作为结束标志符的判断
int start = len - 3;
char[] ttt = content.ToCharArray(start, 3);
for (int i = 0; i < 3; i++)
{
state.sb.Append(ttt[i]);
}
string check = state.sb.ToString();
state.sb.Remove(0, 3);
//EOF为客户端发送数据的末尾标志,如接收到EOF,则由服务器发送ok表示接收到数据
if (check == "EOF")
{
byte[] BytesSendData = System.Text.Encoding.BigEndianUnicode.GetBytes("ok!");
ServerTemp.BeginSend(BytesSendData, 0, BytesSendData.Length, 0, new AsyncCallback(SendCallback), handler);
//显示客户端发来的数据
char[] tt = content.ToCharArray(0, len - 3);
for (int i = 0; i < len - 3; i++)
{
state.sb.Append(tt[i]);
}
string show = state.sb.ToString();
state.sb.Remove(0, len - 3);
Console.WriteLine("远程客户端-->" + ClientIP + " :" + show + "\r\n");
ReceiveEnd=true;
Console.WriteLine("远程客户端-->" + ClientIP + "发送完成断开连接!\r\n");
}
else
{
byte[] BytesSendData = System.Text.Encoding.BigEndianUnicode.GetBytes("是否缺少结束标志符?");
ServerTemp.BeginSend(BytesSendData, 0, BytesSendData.Length, 0, new AsyncCallback(SendCallback), handler);
Console.WriteLine("远程客户端-->" + ClientIP + "数据包有误(没有结束标志符EOF)!\r\n");
ReceiveEnd=false;
//重新开始接受数据
ServerTemp.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ServerReadCallback), state);
}
}
}
catch (Exception ee)
{
Console.WriteLine(ee.ToString());
}
}
//异步发送回调处理
private void SendCallback(IAsyncResult ar)
{
try
{
handler = (Socket)ar.AsyncState;
int BytesSendNumber = handler.EndSend(ar);
//handler.Close();
}
catch (Exception ee)
{
Console.WriteLine(ee.ToString());
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -