c#服务器管理程序
来源:互联网 发布:怀孕b超数据怎么看 编辑:程序博客网 时间:2024/05/20 01:47
namespace Servers
{
class Server:TCPFrameHandle
{
// Thread signal.
public ManualResetEvent allDone = new ManualResetEvent(false);
Form1 m_mainwnd = null;
//private Socket handler = null;
public ArrayList m_CliSocketArr = new ArrayList();
private string m_ServerIP;
private int m_ServerPort;
private static Object thisLock = new Object();
Socket listener = null;
Thread listenThread = null;
Thread workerThread = null;
bool IsThreadOpen = false;
public Server(Form1 mainwnd,string ServerIP = "192.168.0.112", int SerPort = 8080)
{
m_ServerIP = ServerIP;
m_ServerPort = SerPort;
m_mainwnd = mainwnd;
//InitServerSocket(ServerIP,SerPort);
//InitThread();
}
/// <summary>
/// 初始化套接字
/// </summary>
/// <param name="ServerIP"></param>
/// <param name="SerPort"></param>
private void InitServerSocket(string ServerIP, int SerPort)
{
IPAddress ipAddress = IPAddress.Parse(ServerIP);//
IPEndPoint localEndPoint = new IPEndPoint(ipAddress, SerPort);
// Create a TCP/IP socket.
listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
listener.Bind(localEndPoint);
listener.Listen(100);
// Start an asynchronous socket to listen for connections.
Console.WriteLine("Waiting for a connection...");
InformationShow("Waiting for a connection...");
}
/// <summary>
/// 初始化线程
/// </summary>
private void InitThread()
{
workerThread = null;
listenThread = null;
listenThread = new Thread(new ThreadStart(ListeningThread));
listenThread.Name = "listenThread";
listenThread.IsBackground = true;
workerThread = new Thread(new ThreadStart(WorkingThread));//创建一个线程用于处理请求
workerThread.Name = "workerThread";
workerThread.IsBackground = true;
ThreadPool.SetMaxThreads(int.MaxValue, int.MaxValue);
}
/// <summary>
/// 启动服务器
/// </summary>
public void StartServer()
{
if (!IsThreadOpen)
{
listener = null;
InitServerSocket(m_ServerIP,m_ServerPort);
InitThread();
//m_CliSocketArr = new ArrayList();
workerThread.Start();
listenThread.Start();
}
}
/// <summary>
/// 停止服务器
/// </summary>
public void StopServer()
{
//IsThreadOpen = false;
if (listener!=null)
{
listener.Close();
listener.Dispose();
listener = null;
workerThread.Abort();
listenThread.Abort();
workerThread = null;
listenThread = null;
foreach (Socket socket in m_CliSocketArr)
{
socket.Shutdown(SocketShutdown.Both);
socket.Close();
}
m_CliSocketArr.Clear();
}
}
/// <summary>
/// 由套接字获取IP地址
/// </summary>
/// <param name="sClient"></param>
/// <returns></returns>
private IPAddress GetIPAddress(Socket sClient)
{
return ((IPEndPoint)sClient.RemoteEndPoint).Address;
}
/// <summary>
/// 由套接字获取端口号
/// </summary>
/// <param name="sClient"></param>
/// <returns></returns>
private int GetPort(Socket sClient)
{
return ((IPEndPoint)sClient.RemoteEndPoint).Port;
}
/// <summary>
/// 监听套接字线程
/// </summary>
public void ListeningThread()
{
// Bind the socket to the local endpoint and listen for incoming connections.
try
{
while (true)
{
Socket sClient = listener.Accept();
Console.WriteLine("There is a new connection." +
GetIPAddress(sClient).ToString() + ":" +
GetPort(sClient).ToString());
InformationShow("There is a new connection." +
GetIPAddress(sClient).ToString() + ":" +
GetPort(sClient).ToString());
lock(thisLock)
{
if (!m_CliSocketArr.Contains(sClient))
{
m_CliSocketArr.Add(sClient);
Console.WriteLine("There is " + m_CliSocketArr.Count.ToString() + " connection now.");
InformationShow("There is " + m_CliSocketArr.Count.ToString() + " connection now.");
}
}
}
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
}
/// <summary>
/// 接收数据线程
/// </summary>
///
//Socket socketWorker = null;
public void WorkingThread()
{
Socket socketWorker = null;
ArrayList readList = new ArrayList();
while (true)
{
lock (thisLock) //线程同步
{
readList.Clear();
for (int i = 0; i < m_CliSocketArr.Count; i++)
{
readList.Add(m_CliSocketArr[i]);
}
}
//Socket sClient = listener.Accept();
//Console.WriteLine("There is a new connection.");
//m_CliSocketArr.Add(sClient);
//如果没有套接字,服务器等待
if (readList.Count <= 0)
{
Thread.Sleep(100);
continue;
}
try
{
Socket.Select(readList, null, null, 10);
for (int i = 0; i < readList.Count; i++)
{
socketWorker = (Socket)readList[i];
//Console.WriteLine("There is a new message from client.");
//InformationShow("There is a new message from client.");
byte[] buffer = new byte[1024];
int recLen = 0;
int maxnum = 1000; //最多循环1000次,防止死循环
for (int j = 0; j < maxnum; j++)
{
Array.Clear(buffer, 0, buffer.Length);
recLen = socketWorker.Receive(buffer);
if (IsSockWorkerOK(socketWorker, recLen))
{
List<byte> recvOneFrameList = RecveOneFrame(buffer);
if (recvOneFrameList.Count > 0) //接收到完整一帧
{
//Array.Clear(buffer, 0, buffer.Length);
ClientUserParam param = new ClientUserParam(socketWorker,recvOneFrameList.ToArray(), recvOneFrameList.Count);
ThreadPool.QueueUserWorkItem(new WaitCallback(ClientUserWorkThread), param); //线程池分出一个线程
break;
}
else //还没有接收完整一帧,继续接收
{
continue;
}
}
else
{
break;
}
}
// socketWorker.Send(buffer, recLen, SocketFlags.None);
}
}
catch (SocketException e)
{
Console.WriteLine("{0} Error code: {1}.", e.Message, e.ErrorCode);
for (int ii = 0; ii < m_CliSocketArr.Count; ii++)
{
Socket s = (Socket)m_CliSocketArr[ii];
if (s == socketWorker)
{
m_CliSocketArr.RemoveAt(ii);
Console.WriteLine("Remove a connection.");
InformationShow("Remove a connection.");
InformationShow("there are "+ GetConnectCount().ToString()+" connection now." );
}
}
socketWorker.Shutdown(SocketShutdown.Both);
socketWorker.Close();
}
}
}
/// <summary>
/// socketWorker.Receive(buffer)后判断套接字是否正常,返回值大于零正常,小于等于零不正常
/// </summary>
/// <param name="socketWorker"></param>
/// <param name="recLen"></param>
/// <returns></returns>
private bool IsSockWorkerOK(Socket socketWorker, int recLen)
{
if (recLen > 0)
{
Console.WriteLine("message recieve sucess.");
InformationShow("message recieve sucess.");
}
else
{//如果返回0,表示客户端已经断开连接,须将此socket关闭然后从连接池中清除
Console.WriteLine("Rece 0 length.Socket Disconnect");
for (int ii = 0; ii < m_CliSocketArr.Count; ii++)
{
Socket s = (Socket)m_CliSocketArr[ii];
if (s == socketWorker)
{
m_CliSocketArr.RemoveAt(ii);
Console.WriteLine("Remove a connection.");
InformationShow("Remove a connection.");
InformationShow("there are " + GetConnectCount().ToString() + " connection now.");
}
}
socketWorker.Shutdown(SocketShutdown.Both);
socketWorker.Close();
return false;
}
return true;
}
/// <summary>
/// 获得连接的客户端套接字的个数
/// </summary>
/// <returns></returns>
public int GetConnectCount()
{
return m_CliSocketArr.Count;
}
delegate void BD_NETThreadHandle(); //委托声明
/// <summary>
/// 解析线程--由线程池分出
/// </summary>
/// <param name="obj"></param>
private void ClientUserWorkThread(object obj)
{
ClientUserParam param = (ClientUserParam)obj;
byte[] recievebuf = param.buf;
int datalen = param.datalen;
byte[] buftemp = new byte[datalen];
Array.Copy(recievebuf, buftemp, datalen);
string text = Encoding.Default.GetString(buftemp);
Console.WriteLine(text);
InformationShow(text);
lock(thisLock)
{
foreach (Socket sock in m_CliSocketArr)
{
sock.Send(buftemp);
}
}
}
/// <summary>
/// 主窗口显示信息
/// </summary>
/// <param name="text"></param>
private void InformationShow(string text)
{
BD_NETThreadHandle a = delegate()
{
m_mainwnd.textBoxShow.AppendText(text+"\n");
};
m_mainwnd.textBoxShow.Invoke(a);
}
}
/// <summary>
/// 线程池传参数
/// </summary>
class ClientUserParam
{
public byte[] buf;
public int datalen;
public Socket socktWorker;
public ClientUserParam(Socket sockWorker,byte[] buff, int datalength)
{
socktWorker = sockWorker;
buf = buff;
datalen = datalength;
}
}
}
{
class Server:TCPFrameHandle
{
// Thread signal.
public ManualResetEvent allDone = new ManualResetEvent(false);
Form1 m_mainwnd = null;
//private Socket handler = null;
public ArrayList m_CliSocketArr = new ArrayList();
private string m_ServerIP;
private int m_ServerPort;
private static Object thisLock = new Object();
Socket listener = null;
Thread listenThread = null;
Thread workerThread = null;
bool IsThreadOpen = false;
public Server(Form1 mainwnd,string ServerIP = "192.168.0.112", int SerPort = 8080)
{
m_ServerIP = ServerIP;
m_ServerPort = SerPort;
m_mainwnd = mainwnd;
//InitServerSocket(ServerIP,SerPort);
//InitThread();
}
/// <summary>
/// 初始化套接字
/// </summary>
/// <param name="ServerIP"></param>
/// <param name="SerPort"></param>
private void InitServerSocket(string ServerIP, int SerPort)
{
IPAddress ipAddress = IPAddress.Parse(ServerIP);//
IPEndPoint localEndPoint = new IPEndPoint(ipAddress, SerPort);
// Create a TCP/IP socket.
listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
listener.Bind(localEndPoint);
listener.Listen(100);
// Start an asynchronous socket to listen for connections.
Console.WriteLine("Waiting for a connection...");
InformationShow("Waiting for a connection...");
}
/// <summary>
/// 初始化线程
/// </summary>
private void InitThread()
{
workerThread = null;
listenThread = null;
listenThread = new Thread(new ThreadStart(ListeningThread));
listenThread.Name = "listenThread";
listenThread.IsBackground = true;
workerThread = new Thread(new ThreadStart(WorkingThread));//创建一个线程用于处理请求
workerThread.Name = "workerThread";
workerThread.IsBackground = true;
ThreadPool.SetMaxThreads(int.MaxValue, int.MaxValue);
}
/// <summary>
/// 启动服务器
/// </summary>
public void StartServer()
{
if (!IsThreadOpen)
{
listener = null;
InitServerSocket(m_ServerIP,m_ServerPort);
InitThread();
//m_CliSocketArr = new ArrayList();
workerThread.Start();
listenThread.Start();
}
}
/// <summary>
/// 停止服务器
/// </summary>
public void StopServer()
{
//IsThreadOpen = false;
if (listener!=null)
{
listener.Close();
listener.Dispose();
listener = null;
workerThread.Abort();
listenThread.Abort();
workerThread = null;
listenThread = null;
foreach (Socket socket in m_CliSocketArr)
{
socket.Shutdown(SocketShutdown.Both);
socket.Close();
}
m_CliSocketArr.Clear();
}
}
/// <summary>
/// 由套接字获取IP地址
/// </summary>
/// <param name="sClient"></param>
/// <returns></returns>
private IPAddress GetIPAddress(Socket sClient)
{
return ((IPEndPoint)sClient.RemoteEndPoint).Address;
}
/// <summary>
/// 由套接字获取端口号
/// </summary>
/// <param name="sClient"></param>
/// <returns></returns>
private int GetPort(Socket sClient)
{
return ((IPEndPoint)sClient.RemoteEndPoint).Port;
}
/// <summary>
/// 监听套接字线程
/// </summary>
public void ListeningThread()
{
// Bind the socket to the local endpoint and listen for incoming connections.
try
{
while (true)
{
Socket sClient = listener.Accept();
Console.WriteLine("There is a new connection." +
GetIPAddress(sClient).ToString() + ":" +
GetPort(sClient).ToString());
InformationShow("There is a new connection." +
GetIPAddress(sClient).ToString() + ":" +
GetPort(sClient).ToString());
lock(thisLock)
{
if (!m_CliSocketArr.Contains(sClient))
{
m_CliSocketArr.Add(sClient);
Console.WriteLine("There is " + m_CliSocketArr.Count.ToString() + " connection now.");
InformationShow("There is " + m_CliSocketArr.Count.ToString() + " connection now.");
}
}
}
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
}
/// <summary>
/// 接收数据线程
/// </summary>
///
//Socket socketWorker = null;
public void WorkingThread()
{
Socket socketWorker = null;
ArrayList readList = new ArrayList();
while (true)
{
lock (thisLock) //线程同步
{
readList.Clear();
for (int i = 0; i < m_CliSocketArr.Count; i++)
{
readList.Add(m_CliSocketArr[i]);
}
}
//Socket sClient = listener.Accept();
//Console.WriteLine("There is a new connection.");
//m_CliSocketArr.Add(sClient);
//如果没有套接字,服务器等待
if (readList.Count <= 0)
{
Thread.Sleep(100);
continue;
}
try
{
Socket.Select(readList, null, null, 10);
for (int i = 0; i < readList.Count; i++)
{
socketWorker = (Socket)readList[i];
//Console.WriteLine("There is a new message from client.");
//InformationShow("There is a new message from client.");
byte[] buffer = new byte[1024];
int recLen = 0;
int maxnum = 1000; //最多循环1000次,防止死循环
for (int j = 0; j < maxnum; j++)
{
Array.Clear(buffer, 0, buffer.Length);
recLen = socketWorker.Receive(buffer);
if (IsSockWorkerOK(socketWorker, recLen))
{
List<byte> recvOneFrameList = RecveOneFrame(buffer);
if (recvOneFrameList.Count > 0) //接收到完整一帧
{
//Array.Clear(buffer, 0, buffer.Length);
ClientUserParam param = new ClientUserParam(socketWorker,recvOneFrameList.ToArray(), recvOneFrameList.Count);
ThreadPool.QueueUserWorkItem(new WaitCallback(ClientUserWorkThread), param); //线程池分出一个线程
break;
}
else //还没有接收完整一帧,继续接收
{
continue;
}
}
else
{
break;
}
}
// socketWorker.Send(buffer, recLen, SocketFlags.None);
}
}
catch (SocketException e)
{
Console.WriteLine("{0} Error code: {1}.", e.Message, e.ErrorCode);
for (int ii = 0; ii < m_CliSocketArr.Count; ii++)
{
Socket s = (Socket)m_CliSocketArr[ii];
if (s == socketWorker)
{
m_CliSocketArr.RemoveAt(ii);
Console.WriteLine("Remove a connection.");
InformationShow("Remove a connection.");
InformationShow("there are "+ GetConnectCount().ToString()+" connection now." );
}
}
socketWorker.Shutdown(SocketShutdown.Both);
socketWorker.Close();
}
}
}
/// <summary>
/// socketWorker.Receive(buffer)后判断套接字是否正常,返回值大于零正常,小于等于零不正常
/// </summary>
/// <param name="socketWorker"></param>
/// <param name="recLen"></param>
/// <returns></returns>
private bool IsSockWorkerOK(Socket socketWorker, int recLen)
{
if (recLen > 0)
{
Console.WriteLine("message recieve sucess.");
InformationShow("message recieve sucess.");
}
else
{//如果返回0,表示客户端已经断开连接,须将此socket关闭然后从连接池中清除
Console.WriteLine("Rece 0 length.Socket Disconnect");
for (int ii = 0; ii < m_CliSocketArr.Count; ii++)
{
Socket s = (Socket)m_CliSocketArr[ii];
if (s == socketWorker)
{
m_CliSocketArr.RemoveAt(ii);
Console.WriteLine("Remove a connection.");
InformationShow("Remove a connection.");
InformationShow("there are " + GetConnectCount().ToString() + " connection now.");
}
}
socketWorker.Shutdown(SocketShutdown.Both);
socketWorker.Close();
return false;
}
return true;
}
/// <summary>
/// 获得连接的客户端套接字的个数
/// </summary>
/// <returns></returns>
public int GetConnectCount()
{
return m_CliSocketArr.Count;
}
delegate void BD_NETThreadHandle(); //委托声明
/// <summary>
/// 解析线程--由线程池分出
/// </summary>
/// <param name="obj"></param>
private void ClientUserWorkThread(object obj)
{
ClientUserParam param = (ClientUserParam)obj;
byte[] recievebuf = param.buf;
int datalen = param.datalen;
byte[] buftemp = new byte[datalen];
Array.Copy(recievebuf, buftemp, datalen);
string text = Encoding.Default.GetString(buftemp);
Console.WriteLine(text);
InformationShow(text);
lock(thisLock)
{
foreach (Socket sock in m_CliSocketArr)
{
sock.Send(buftemp);
}
}
}
/// <summary>
/// 主窗口显示信息
/// </summary>
/// <param name="text"></param>
private void InformationShow(string text)
{
BD_NETThreadHandle a = delegate()
{
m_mainwnd.textBoxShow.AppendText(text+"\n");
};
m_mainwnd.textBoxShow.Invoke(a);
}
}
/// <summary>
/// 线程池传参数
/// </summary>
class ClientUserParam
{
public byte[] buf;
public int datalen;
public Socket socktWorker;
public ClientUserParam(Socket sockWorker,byte[] buff, int datalength)
{
socktWorker = sockWorker;
buf = buff;
datalen = datalength;
}
}
}
0 0
- c#服务器管理程序
- 服务器管理
- 服务器管理
- 服务器管理
- 简单易用的IT运维服务器管理程序分享!
- svn服务器管理
- WEBLOGIC服务器管理
- 服务器管理规范
- tomcat 服务器管理
- 服务器管理(1)
- 服务器管理相关
- Linux 服务器管理
- WEBLOGIC服务器管理
- 服务器管理规范
- MySQL服务器管理
- NodeJs服务器管理
- Redis服务器管理
- mongo服务器管理
- Eclipse console 中文乱码解决
- 【63】关系数据库常用的sql语句总结
- Pearson相关系数公式的四种形式及Python代码实现
- Android中ActionBarDrawerToggle、DrawerLayout、ActionBar 使用说明
- Android中的ViewRootImpl类源码解析
- c#服务器管理程序
- 欢迎使用CSDN-markdown编辑器
- IoC容器中装配Bean
- Arduino 通过串口传值给Processing 显示
- Java的接口和抽象类
- 数据挖掘工程师的面试问题与答题思路
- 自定义控件之QQ5.0侧滑效果
- Pixhawk之姿态解算篇(5)_ECF/EKF/GD介绍
- 【分享笔记】使用lint来改善你的代码