服务端代码
using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using Mode;
using MySql.Data.MySqlClient;
using Newtonsoft.Json;
namespace Server
{
public class SocketServer
{
//创建一个和客户端通信的套接字
static Socket socketwatch = null;
//定义一个集合,存储客户端信息
static Dictionary<string, Socket> clientConnectionItems = new Dictionary<string, Socket> { };
//创建一个内存缓冲区,其大小为1024*1024字节
public static byte[] arrServerRecMsg = new byte[1024 * 1024];
public static bool Quit = false;
public static void Main(string[] args)
{
//定义一个套接字用于监听客户端发来的消息,包含三个参数(IP4寻址协议,流式连接,Tcp协议)
socketwatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//绑定网络节点
//将套接字的监听队列长度限制为20
socketwatch.Listen(20);
//负责监听客户端的线程:创建一个监听线程
Console.WriteLine("开始监听", socketwatch.LocalEndPoint.ToString());
new Thread(watchconnecting) { IsBackground = true }.Start();
Console.ReadLine();
Quit = true;
Thread.Sleep(2000);
}
/// <summary>
/// 监听客户端连接
/// </summary>
public static void watchconnecting()
{
//持续不断监听客户端发来的请求
while (!Quit)
{
try
{
Socket connection = socketwatch.Accept();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
break;
}
//让客户显示"连接成功"的信息
byte[] arrSendMsg = Encoding.UTF8.GetBytes($"连接服务端成功!\r\n");
//添加客户端信息
clientConnectionItems.Add(((Socket)null).RemoteEndPoint.ToString(), null);
//创建一个登录通信接收线程
new Thread(new ParameterizedThreadStart(HandleLogin.veri)) { IsBackground = true }.Start();
//创建一个执行通信接收线程
new Thread(new ParameterizedThreadStart(HandlePlace.recv)) { IsBackground = true }.Start();
//创建一个弹窗通信发送线程
new Thread(new ParameterizedThreadStart(HandleRemind.send)) { IsBackground = true }.Start();
}
}
protected static MySqlConnection sqlCnn = new MySqlConnection("");
/// <summary>
/// 登录
/// </summary>
public static class HandleLogin
{
static HandleLogin()
{
sqlCnn.Open();
}
/// <summary>
/// 验证客户端发来的信息
/// </summary>
/// <param name="socketclientpara"></param>
public static void veri(object socketclientpara)
{
Socket socketServer = (Socket)socketclientpara;
//将接收到的信息存入到内存缓冲区,并返回其字节数组的长度
try
{
ModeLogin login = JsonConvert.DeserializeObject<ModeLogin>(Encoding.UTF8.GetString(arrServerRecMsg, 0, socketServer.Receive(arrServerRecMsg)));
bool flag = true;
if (flag == true)
{
if (!Regex.IsMatch(login.Username, @"^[\u4E00-\u9FA5A-Za-z0-9_]+$")) //判断账号...
{
flag = false;
socketServer.Send(Encoding.UTF8.GetBytes("非法账号"));
}
}
if (flag == true)
{
if (!Regex.IsMatch(login.Password, @"^[\u4E00-\u9FA5A-Za-z0-9_]+$")) //判断密码...
{
flag = false;
socketServer.Send(Encoding.UTF8.GetBytes("密码中含有特殊字符"));
}
}
if (flag == true)
{
MySqlCommand sqlCmd = new MySqlCommand { Connection = sqlCnn, CommandText = "" };
if (sqlCmd.ExecuteReader().HasRows)
{
socketServer.Send(Encoding.UTF8.GetBytes("登录成功! "));
Console.WriteLine("登录成功");
}
else
{
socketServer.Send(Encoding.UTF8.GetBytes("账号或密码错误!"));
Console.WriteLine("密码错误");
}
}
}
catch (Exception ex)
{
Thread.Sleep(2000);
socketServer.Shutdown(SocketShutdown.Both);
//提示套接字监听异常
Console.WriteLine($"客户端{socketServer.RemoteEndPoint}已经中断连接\r\n{ex.Message}\r\n{ex.StackTrace}\r\n");
//关闭之前accept出来的和客户端进行通信的套接字
socketServer.Close();
}
}
}
/// <summary>
/// 派单
/// </summary>
public class HandlePlace
{
static HandlePlace()
{
sqlCnn.Open();
}
/// <summary>
/// 接收客户端发来的信息
/// </summary>
/// <param name="socketplacepara"></param>
public static void recv(object socketplacepara)
{
Socket socketServer = (Socket)socketplacepara;
try
{
PlaceOrder place = JsonConvert.DeserializeObject<PlaceOrder>(Encoding.UTF8.GetString(arrServerRecMsg, 0, socketServer.Receive(arrServerRecMsg)));
}
catch (Exception ex)
{
//提示套接字监听异常
Console.WriteLine($"客户端{socketServer.RemoteEndPoint}已经中断连接\r\n{ex.Message}\r\n{ex.StackTrace}\r\n");
//关闭之前accept出来的和客户端进行通信的套接字
socketServer.Close();
}
}
}
/// <summary>
/// 弹窗
/// </summary>
/// <param name="socketremindpara"></param>
public class HandleRemind
{
static HandleRemind()
{
sqlCnn.Open();
}
/// <summary>
/// 发送消息给客户端
/// </summary>
/// <param name="socketremindpara"></param>
public static void send(object socketremindpara)
{
Socket socketServer = (Socket)socketremindpara;
try
{
PlaceOrder remind = JsonConvert.DeserializeObject<PlaceOrder>(Encoding.UTF8.GetString(arrServerRecMsg, 0, socketServer.Receive(arrServerRecMsg)));
MySqlCommand sqlCmd = new MySqlCommand { Connection = sqlCnn, CommandText = "" };
MySqlDataReader recv = sqlCmd.ExecuteReader();
try
{
if (recv.HasRows)
{
string username = recv[0].ToString();
int count = int.Parse(recv[1].ToString());
string time = recv[2].ToString();
var str = JsonConvert.SerializeObject(new { username = username, count = count, time = time });
var bytes = Encoding.UTF8.GetBytes(str);
socketServer.Send(Encoding.UTF8.GetBytes(bytes.Length.ToString()));
socketServer.Receive(new byte[2]);
socketServer.Send(bytes);
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
catch (Exception ex)
{
//提示套接字监听异常
Console.WriteLine($"客户端{socketServer.RemoteEndPoint}已经中断连接\r\n{ex.Message}\r\n{ex.StackTrace}\r\n");
}
}
}
}
}