111,097
社区成员




using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.Diagnostics;
namespace TcpService
{
public partial class Form1 : Form
{
public delegate void SetThreadState(int nClientID);
public static int nCountRecv = 0;
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
}
/////////////////////////////////////////////////////////////////////////////
/// <summary>
/// socket服务器类,负责监听以及连接
/// </summary>
public class MyTCPServer
{
private int nListenPort = 4000;
private int nMaxClient = 500; //同时连接500个客户端
private TcpListener tlTcpListen;
private bool bIsListen = true;
private Thread thAccept;
MySocketProv[] RunSocketInfo;
bool[] ThreadRun;
public void DoStartIT()
{
try
{
RunSocketInfo = new MySocketProv[nMaxClient]; //500个客户端数组
ThreadRun = new bool[nMaxClient]; //500个客户端状态数组
for (int i = 0; i < nMaxClient; i++)
{
ThreadRun[i] = false;
RunSocketInfo[i] = new MySocketProv();
RunSocketInfo[i].ThreadState = SetExitThread;
}
tlTcpListen = new TcpListener(nListenPort); //以20812端口号来初始化TcpListener实例
tlTcpListen.Start(); //开始监听网络的连接请求
Console.WriteLine("正在监听...");
thAccept = new Thread(AcceptThread);
thAccept.Start();
}
catch (System.Security.SecurityException)
{
Console.WriteLine("侦听失败!错误");
Console.ReadLine();
}
}
public void DoExitIT()
{
bIsListen = false;
thAccept.Abort();
tlTcpListen.Stop();
for (int i = 0; i < nMaxClient; i++)
{
if (ThreadRun[i])
{
RunSocketInfo[i].ExitThread();
}
}
}
/// <summary>
/// 获取当前空的 ID
/// </summary>
/// <returns></returns>
private int GetEmptySocket()
{
int i = 0;
for (i = 0; i < nMaxClient; i++)
{
if (ThreadRun[i] == false)
{
break;
}
}
if (i == nMaxClient)
{
return -1;
}
else
{
return i;
}
}
/// <summary>
/// 接收线程
/// </summary>
private void AcceptThread()
{
while (bIsListen)
{
int nSocketID = GetEmptySocket();
if (nSocketID != -1)
{
Console.WriteLine("启动监听 {0} ", nSocketID);
RunSocketInfo[nSocketID].nClientID = nSocketID;
RunSocketInfo[nSocketID].mSocket = tlTcpListen.AcceptSocket();
RunSocketInfo[nSocketID].bIsRunNow = true;
Console.WriteLine("已经连接!{0}", nSocketID);
ThreadRun[nSocketID] = true;
RunSocketInfo[nSocketID].DoStartRead();
// Thread workObject = new Thread(ThreadProv);
// workObject.Start();
}
else
{
Thread.Sleep(100); //延时100ms 再尝试 -> 此时为已经满连接,等待中>>>>>
}
}
//////
}
private void SetExitThread(int nClientID)
{
ThreadRun[nClientID] = false;
}
}
/////////////////////////////////////////////////////////////////////////////
public void ExitThread()
{
bIsRun = false;
thProv.Abort();//这个不能这样用,这条语句会引发ThreadAbortException
SocketRW.Close();
}
//应该这样
public void ExitThread()
{
try
{
thProv.Abort();
}
catch(ThreadAbortException e)
{
bIsRun = false;
SocketRW.Close();
}
}
private void Form1_Load(object sender, EventArgs e)
{
statusBar1.Text = "1111111111";
listBox1.Items.Add("欢迎光临");
//MyTCPServer myTCPServerDemo = new MyTCPServer();
myTCPServerDemo.DoStartIT();
while (true);//这一句有用吗?
myTCPServerDemo.DoExitIT();
}
/// <summary>
/// 每一个终端的处理,处理通讯协议以及状态管理
/// </summary>
public class MySocketProv
{
private int ClientID;
private Socket SocketRW;
private bool bIsRun;
private Thread thProv;
//申明委托实例
private event SetThreadState SetExitState;
//
// public void OnExitState(int nClientID)
// {
// SetExitState(nClientID);
// }
public int nClientID
{
get
{
return ClientID;
}
set
{
ClientID = value;
}
}
public SetThreadState ThreadState
{
get
{
return SetExitState;
}
set
{
SetExitState = value;
}
}
public Socket mSocket
{
get
{
return SocketRW;
}
set
{
SocketRW = value;
}
}
public bool bIsRunNow
{
get
{
return bIsRun;
}
set
{
bIsRun = value;
}
}
public void DoStartRead()
{
thProv = new Thread(ThreadProv);
thProv.Start();
}
public void ExitThread()
{
bIsRun = false;
thProv.Abort();
SocketRW.Close();
}
private void ThreadProv()
{
EndPoint tempRemoteEP = SocketRW.RemoteEndPoint;
IPEndPoint tempRemoteIP = (IPEndPoint)tempRemoteEP; //获取请求的远程计算机名称
IPHostEntry host = Dns.GetHostByAddress(tempRemoteIP.Address);
string sHostName = host.HostName;
string sTime = DateTime.Now.ToShortTimeString();
while (bIsRun)
{
try
{
//获取接收数据时的时间
Byte[] byRead = new Byte[2048];
// int iRead = stRead[0].Receive(byRead, ref tempRemoteEP);
int iRead = SocketRW.Receive(byRead); ;
if (iRead > 10000 || iRead == 0)
{
bIsRun = false;
Console.WriteLine("连接已经关闭!");
}
else
{
//获得接收的字节数目
Byte[] byText = new Byte[iRead];
//并根据接收到的字节数目来定义字节数组
Array.Copy(byRead, 0, byText, 0, iRead);
string sTemp = System.Text.Encoding.Default.GetString(byText);
//判断是否为断开连接控制码
if (sTemp.Trim() == "STOP")
{
SocketRW.Close();
//关闭侦听
Console.WriteLine("连接已经关闭!");
//中止线程
return;
}
else
{
Console.WriteLine("{0} - " + sTime + " " + sTemp + " - rcev: {1}", ClientID, nCountRecv++);
string strSendBuf;
strSendBuf = string.Format("Server: ask - {0}", ClientID);
//
byte[] bySendBuf;
bySendBuf = new byte[100];
bySendBuf = Encoding.GetEncoding("gb2312").GetBytes(strSendBuf);
SocketRW.Send(bySendBuf);
}
}
}
//处理参数为空引用异常
catch (ArgumentNullException ae)
{
bIsRun = false;
SetExitState(ClientID);
Console.WriteLine("ArgumentNullException : {0}", ae.ToString());
ExitThread();
}
//处理操作系统异常
catch (SocketException se)
{
bIsRun = false;
SetExitState(ClientID);
Console.WriteLine("SocketException : {0}", se.ToString());
ExitThread();
}
catch (Exception e)
{
bIsRun = false;
SetExitState(ClientID);
Console.WriteLine("Unexpected exception : {0}", e.ToString());
ExitThread();
}
}
}
}
MyTCPServer myTCPServerDemo = new MyTCPServer();
private void Form1_Load(object sender, EventArgs e)
{
statusBar1.Text = "1111111111";
listBox1.Items.Add("欢迎光临");
//MyTCPServer myTCPServerDemo = new MyTCPServer();
myTCPServerDemo.DoStartIT();
while (true);
myTCPServerDemo.DoExitIT();
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
myTCPServerDemo.DoExitIT();
}
}
}