using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading; namespace 垂直剖面面浮标网口升级 { class Server { ///******************服务端************************/ ///** ////定义Socket对象 //private static Socket serverSocket = null; ////定义监听线程 //private static Thread listenThread; ////定义接受客户端数据线程 //private static Thread threadReceive; ////定义双方通信 //private static Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);**/ //private static String str; ////服务端 //private static Socket ServerSocket = null; ////tcp客户端字典 //public static Dictionary dic_ClientSocket = new Dictionary(); ////线程字典,每新增一个连接就添加一条线程 //private static Dictionary dic_ClientThread = new Dictionary(); ////监听客户端连接的标志 //private static bool Flag_Listen = true; ///// ///// 启动服务 ///// ///// 端口号 //public static bool OpenServer(int port) //{ // try // { // Flag_Listen = true; // // 创建负责监听的套接字,注意其中的参数; // ServerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); // // 创建包含ip和端口号的网络节点对象; // IPEndPoint endPoint = new IPEndPoint(IPAddress.Any, port); // try // { // // 将负责监听的套接字绑定到唯一的ip和端口上; // ServerSocket.Bind(endPoint); // } // catch // { // return false; // } // // 设置监听队列的长度; // ServerSocket.Listen(100); // // 创建负责监听的线程; // Thread Thread_ServerListen = new Thread(ListenConnecting); // Thread_ServerListen.IsBackground = true; // Thread_ServerListen.Start(); // return true; // } // catch // { // return false; // } //} ///// ///// 关闭服务 ///// //public static void CloseServer() //{ // lock (dic_ClientSocket) // { // foreach (var item in dic_ClientSocket) // { // item.Value.Close();//关闭每一个连接 // } // dic_ClientSocket.Clear();//清除字典 // } // lock (dic_ClientThread) // { // foreach (var item in dic_ClientThread) // { // item.Value.Abort();//停止线程 // } // dic_ClientThread.Clear(); // } // Flag_Listen = false; // //ServerSocket.Shutdown(SocketShutdown.Both);//服务端不能主动关闭连接,需要把监听到的连接逐个关闭 // if (ServerSocket != null) // ServerSocket.Close(); //} ///// ///// 监听客户端请求的方法; ///// //private static void ListenConnecting() //{ // while (Flag_Listen) // 持续不断的监听客户端的连接请求; // { // try // { // Socket sokConnection = ServerSocket.Accept(); // 一旦监听到一个客户端的请求,就返回一个与该客户端通信的 套接字; // // 将与客户端连接的 套接字 对象添加到集合中; // string str_EndPoint = sokConnection.RemoteEndPoint.ToString(); // MySession myTcpClient = new MySession() { TcpSocket = sokConnection }; // //创建线程接收数据 // Thread th_ReceiveData = new Thread(ReceiveData); // th_ReceiveData.IsBackground = true; // th_ReceiveData.Start(myTcpClient); // //把线程及客户连接加入字典 // foreach (string key in dic_ClientThread.Keys) // { // dic_ClientThread[key].Abort(); // } // dic_ClientThread.Clear(); // dic_ClientSocket.Clear(); // dic_ClientThread.Add(str_EndPoint, th_ReceiveData); // dic_ClientSocket.Add(str_EndPoint.Split(':')[0], myTcpClient); // Console.WriteLine(str_EndPoint); // } // catch (Exception err) // { // Console.WriteLine(err.Message); // } // Thread.Sleep(200); // } //} ///// ///// 接收数据 ///// ///// //private static void ReceiveData(object sokConnectionparn) //{ // MySession tcpClient = sokConnectionparn as MySession; // Socket socketClient = tcpClient.TcpSocket; // bool Flag_Receive = true; // while (Flag_Receive) // { // try // { // // 定义一个2M的缓存区; // byte[] arrMsgRec = new byte[1024 * 1024 * 2]; // // 将接受到的数据存入到输入 arrMsgRec中; // int length = -1; // try // { // length = socketClient.Receive(arrMsgRec); // 接收数据,并返回数据的长度; // } // catch (Exception err) // { // Console.WriteLine("断开连接时产生的信息:" + err.Message); // Flag_Receive = false; // // 从通信线程集合中删除被中断连接的通信线程对象; // foreach (string key in dic_ClientThread.Keys) // { // dic_ClientSocket.Remove(key);//删除客户端字典中该socket // if (dic_ClientThread[key].IsAlive) // { // dic_ClientThread[key].Abort();//关闭线程 // } // dic_ClientThread.Remove(key);//删除字典中该线程 // } // tcpClient = null; // socketClient = null; // CloseServer();//关闭服务器 // OpenServer(8899); // break; // } // byte[] buf = new byte[length]; // Array.Copy(arrMsgRec, buf, length); // lock (tcpClient.m_Buffer) // { // tcpClient.AddQueue(buf); // } // str = Encoding.Default.GetString(buf, 0, length); // //数据解析 // //data_analysis(str); // Form1 form1 = new Form1(); // form1.ParsingData(new List(buf)); // } // catch (Exception err) // { // Console.WriteLine(err.Message); // } // Thread.Sleep(100); // } //} ///// ///// 发送数据给指定的客户端 ///// ///// 客户端套接字 ///// 发送的数组 ///// //public static bool send_server(string _endPoint, byte[] buffer) //{ // MySession myT = new MySession(); // if (dic_ClientSocket.TryGetValue(_endPoint, out myT)) // { // myT.Send(buffer); // return true; // } // else // { // return false; // } //} //public class MySession //{ // public Socket TcpSocket;//socket对象 // public List m_Buffer = new List();//数据缓存区 // public MySession() // { // } // /// // /// 发送数据 // /// // /// // public void Send(byte[] buf) // { // if (buf != null) // { // try // { // TcpSocket.Send(buf); // } // catch (Exception err) // { // Console.WriteLine("发送指令失败,当前设备未连接"); // } // } // } // /// // /// 获取连接的ip // /// // /// // public string GetIp() // { // IPEndPoint clientipe = (IPEndPoint)TcpSocket.RemoteEndPoint; // string _ip = clientipe.Address.ToString(); // return _ip; // } // /// // /// 关闭连接 // /// // public void Close() // { // TcpSocket.Shutdown(SocketShutdown.Both); // } // /// // /// 提取正确数据包 // /// // public byte[] GetBuffer(int startIndex, int size) // { // byte[] buf = new byte[size]; // m_Buffer.CopyTo(startIndex, buf, 0, size); // m_Buffer.RemoveRange(0, startIndex + size); // return buf; // } // /// // /// 添加队列数据 // /// // /// // public void AddQueue(byte[] buffer) // { // m_Buffer.AddRange(buffer); // } // /// // /// 清除缓存 // /// // public void ClearQueue() // { // m_Buffer.Clear(); // } //} } }