Random random = new Random();// use for sleep /// <summary> /// function~ /// </summary> public MyPlayer(PictureBox viewer) { this.viewer = viewer; playEventHandler = playChangeMethod; curState = PlayState.STOP; trackHandle = new threadHandler(this.progressTrack); }
/// <summary> /// 在socket客户端新开一个线程,监听来自服务器的socket的消息 /// </summary> /// <param name="Socket1">socket对象</param> /// <param name="encode">编码</param> /// <param name="threadHandler1">操作当前的线程委托,参数为thread</param> /// <param name="stringHandler1">接收消息失败时执行的委托,参数为string</param> /// <param name="stringHandler2">收到消息后执行的委托,参数为string</param> public void clentListenSocketMessage(Socket Socket1, string encode, threadHandler threadHandler1, stringHandler stringHandler1, stringHandler stringHandler2) { Thread Thread1 = new Thread(new ThreadStart(() => { threadHandler1(Thread.CurrentThread); string leaveMessage = string.Empty; while (true) { string[] result = receiveMessageFromSocket(Socket1, encode); //如果socket连接已断开,则终止监听该消息的线程 if (Socket1.Connected == false) { Thread.CurrentThread.Abort(); break; } if (result[0] == null) { stringHandler1(result[1]); } else { leaveMessage = leaveMessage + result[0]; Match Match1 = Regex1.Match(leaveMessage); //消息未发送完成 if (Match1.Value == string.Empty) { } //有完整的一条消息 else { string decodeMessage = getMessageFromMyJson(Match1.Value); leaveMessage = leaveMessage.Substring(Match1.Value.Length, leaveMessage.Length - Match1.Value.Length); stringHandler2(decodeMessage); } } } })); Thread1.Start(); }
/// <summary> /// 以指定的本机端口初始化服务器socket链接,并分别新开1个所有客户端的socket管理线程和1个所有客户端的socket消息监听线程 /// </summary> /// <param name="ip">本机ip</param> /// <param name="port">机端口号</param> /// <param name="listenNum">允许的最大客户端连接数</param> /// <param name="listenFailHandler">监听端口失败时执行的委托</param> /// <param name="manageThreadHandler">管理客户端连接的所有socket集合的线程</param> /// <param name="listenThreadHandler">监听客户端消息的线程</param> /// <param name="errorMessageHandler">监听消息失败时执行的委托</param> /// <param name="succMessageHandler">收到客户端消息时执行的委托</param> /// <param name="ClientSocketList">客户端连接的所有socket集合的对象</param> public void socketServerInit(string ip, int port, int listenNum, stringHandler listenFailHandler, socketHandler socketHandler1, threadHandler manageThreadHandler, threadHandler listenThreadHandler, stringHandler errorMessageHandler, stringHandler succMessageHandler, List<Socket> ClientSocketList) { object[] object1 = startSocketServer(ip, port, listenNum); Socket StartSocket = (Socket)object1[0]; //监听端口失败 if (StartSocket == null) { listenFailHandler((string)object1[1]); return; } socketHandler1(StartSocket); manageConnectClient(ClientSocketList, StartSocket, manageThreadHandler, listenThreadHandler, errorMessageHandler, succMessageHandler); }
/// <summary> /// 新开一个线程管理socket服务器收到的客户端连接 /// </summary> /// <param name="ClientSocketList">所有客户端连接的集合</param> /// <param name="StartSocket">服务器监听端口的socket</param> /// <param name="manageThread">新开的管理线程</param> private void manageConnectClient(List<Socket> ClientSocketList, Socket StartSocket, threadHandler manageThread, threadHandler listenThreadHandler, stringHandler errorMessageHandler, stringHandler succMessageHandler) { Thread t = new Thread(new ThreadStart(() => { manageThread(Thread.CurrentThread); while (true) { Socket ClientSocket = StartSocket.Accept(); ClientSocketList.Add(ClientSocket); listenSocketMessage(ClientSocketList,ClientSocket, "UTF-8", listenThreadHandler, errorMessageHandler, succMessageHandler); } })); t.Start(); }
/// <summary> /// 以指定ip和端口初始化客户端的socket连接,连接成功后会新增一个线程监听服务器的消息 /// </summary> /// <param name="ip">服务器ip</param> /// <param name="port">服务器端口</param> /// <param name="connectFailHanlder">socket连接失败时执行的委托,参数为string</param> /// <param name="currentSocketHandler">socket连接成功时执行的委托,参数为socket</param> /// <param name="listenThreadHandler">监听消息线程的委托,参数为thread</param> /// <param name="errorMessageHandler">socket接收消息失败时执行的委托,参数为string</param> /// <param name="succMessageHandler">初始化成功后,接收到消息时执行的委托,参数为string</param> public void socketClientInit(string ip, int port, string encode, stringHandler connectFailHanlder, socketHandler currentSocketHandler, threadHandler listenThreadHandler, stringHandler errorMessageHandler, stringHandler succMessageHandler) { object[] object1 = connectToSocketServer(ip, port); Socket ClientSocket = (Socket)object1[0]; //判断建立连接是否失败 if (ClientSocket == null) { connectFailHanlder((string)object1[1]); return; } //建立连接成功后返回该socket对象,用于发送和接收消息 currentSocketHandler(ClientSocket); //使用该socket对象监听服务器链接 clentListenSocketMessage(ClientSocket, encode, (listenMessageThread) => { listenThreadHandler(listenMessageThread); }, (receiveExc) => { errorMessageHandler(receiveExc); }, (result) => { succMessageHandler(result); }); }