private void btnStop_Click(object sender, EventArgs e) { if (client != null) { client.Disconnect(); } }
void OnRead(TcpSocketClient client, byte[] buffers) { ThreadCalls(() => { try { BaseCommand cmd = new BaseCommand(buffers); switch (cmd.Command) { case Commands.Bind: var bind = new Bind(buffers); this.BindHandler(client, bind); break; case Commands.UnBind: var unbind = new UnBind(buffers); this.UnBindHandler(client, unbind); break; case Commands.Submit: var submit = new Submit(buffers); this.SubmitHandler(client, submit); PrintLog("接收到 \"" + submit.SPNumber + "\" 发送送给 \"" + submit.UserNumber + "\" 的消息: " + submit.MessageContent); break; case Commands.Deliver_Resp: this.DeliverRespHandler(client, new Deliver_Resp(buffers)); break; case Commands.Report_Resp: this.ReportRespHandler(client, new Report_Resp(buffers)); break; default: break; } PrintLog("接收到一条 \"" + client.LocalIPAddress + "\" 发送的命令:" + Commands.GetString(cmd.Command)); } catch (Exception e) { if (e is BadCmdHeadException) { PrintLog(client.LocalIPAddress + " 发送错误的消息头格式!"); } else if (e is BadCmdBodyException) { PrintLog(client.LocalIPAddress + " 发送错误的消息体格式!"); } else { PrintLog("接受 \"" + client.LocalIPAddress + "\" 发送的消息出现错误:" + e.Message); } //断开连接 client.Disconnect(); } }); }
/// <summary> /// Starts the local HTTP server and listen for requests /// </summary> /// <returns>Task completion object</returns> /// <exception cref="InvalidOperationException"> /// If failed to find an unused port or prohibited from listening for new /// connections. /// </exception> public virtual async Task RunServerAsync() { if (Server != null) return; const ushort validPortsMin = 1025; const ushort validPortsMax = ushort.MaxValue; var invalidPorts = new List<ushort>(); var random = new Random(); while (invalidPorts.Count < validPortsMax - validPortsMin) { PortNumber = (ushort) random.Next(validPortsMin, validPortsMax); if (invalidPorts.Contains(PortNumber)) continue; try { Server = new HttpListener(TimeSpan.FromSeconds(30)); await Server.StartTcpRequestListener(PortNumber); Server.HttpRequestObservable.Subscribe(OnHttpRequest); using (var testSocket = new TcpSocketClient()) { var tokenSource = new CancellationTokenSource(); var connectOperation = testSocket.ConnectAsync("127.0.0.1", PortNumber.ToString(), false, tokenSource.Token); tokenSource.CancelAfter(TimeSpan.FromSeconds(10)); await connectOperation; if (connectOperation.IsFaulted || connectOperation.IsCanceled) { if (connectOperation.Exception != null) throw connectOperation.Exception; throw new InvalidOperationException(); } testSocket.Disconnect(); } Protocol = @"http://127.0.0.1:" + PortNumber; } catch (NotImplementedException) { Server = null; throw; } catch { invalidPorts.Add(PortNumber); try { Server?.StopTcpRequestListener(); } catch { // ignored } Server = null; continue; } return; } throw new InvalidOperationException(@"There is no free port to bind to on this machine."); }
void OnSend(TcpSocketClient client, byte[] buffers) { ThreadCalls(() => { try { BaseCommand cmd = new BaseCommand(buffers); switch (cmd.Command) { case Commands.UnBind: case Commands.UnBind_Resp: client.Disconnect(); break; case Commands.Bind_Resp: //绑定验证出错则断开连接 var bindresp = new Bind_Resp(buffers); if (bindresp.Result != CommandError.Success) { client.Disconnect(); } else { StartWaitSendThread(client); } break; default: break; } PrintLog("发送一条命令 \"" + Commands.GetString(cmd.Command) + "\" 给 \"" + client.LocalIPAddress + "\""); } catch (Exception e) { PrintLog("发送一条命令给 \"" + client.LocalIPAddress + "\" 出现错误:" + e.Message); } }); }
private static async void StartTcpClient() { var tcpClient = new TcpSocketClient(); await tcpClient.ConnectAsync("www.abc.dk", "8088", secure : true, ignoreServerCertificateErrors : true); var helloWorld = "Hello World!"; var bytes = Encoding.UTF8.GetBytes(helloWorld); await tcpClient.WriteStream.WriteAsync(bytes, 0, bytes.Length); tcpClient.Disconnect(); tcpClient.Dispose(); }
void OnRead(TcpSocketClient client, byte[] buffers) { ThreadCalls(() => { try { var cmd = new BaseCommand(buffers); switch (cmd.Command) { case Commands.Bind_Resp: var bind_resp = new Bind_Resp(buffers); if (bind_resp.Result != CommandError.Success) { PrintLog("绑定验证失败:" + CommandError.GetMessage(bind_resp.Result)); Thread.Sleep(1000); client.Disconnect(); } break; case Commands.Deliver: var deliver = new Deliver(buffers); //新消息提醒 PrintLog("收到一条 " + deliver.UserNumber + " 发来的新消息!"); //绑定消息会话 BindSession(false, deliver.UserNumber, deliver.MessageContent); //发送响应 client.Send(new Deliver_Resp { SequenceNumber = deliver.SequenceNumber, Result = CommandError.Success }.GetBytes()); break; case Commands.Deliver_Resp: var deliver_resp = new Deliver_Resp(buffers); if (deliver_resp.Result != CommandError.Success) { PrintLog("传送消息失败:" + CommandError.GetMessage(deliver_resp.Result)); } break; case Commands.Report: client.Send(new Report_Resp { SequenceNumber = cmd.SequenceNumber, Result = CommandError.Success }.GetBytes()); break; default: break; } PrintLog("接收一条命令:" + Commands.GetString(cmd.Command)); } catch (Exception e) { PrintLog("读取消息出现错误: " + e.Message); } }); }
private async Task <bool> ExecSendCommand() { #region TCP listener //var communicationInterface = new CommunicationsInterface(); //var allInterfaces = communicationInterface.GetAllInterfaces(); //var networkInterface = allInterfaces.FirstOrDefault(x => x.IpAddress == Address); //tcpListener = new TcpSocketListener(); //var obseravbleListener = await tcpListener.CreateObservableListener(80, networkInterface, false); //var subscriberTcpListener = obseravbleListener.Subscribe( //client => //{ // //Insert your code here //}, //ex => //{ // // Insert your exception code here // Console.WriteLine("Error!"); //}, //() => //{ // // Insert your completed code here // Console.WriteLine("End!"); //}); #endregion var command = $"{Command}\n"; var tcpClient = new TcpSocketClient(); var ok = false; using (var sending = UserDialogs.Instance.Loading("Invio...")) { ok = await AsyncHelper.DoFunc(async() => { await tcpClient.ConnectAsync(Address, Port); var bytes = Encoding.ASCII.GetBytes(command); await tcpClient.WriteStream.WriteAsync(bytes, 0, bytes.Length); }, "Problema invio comando"); } //se l'invio non è andato a buon fine non aspetto la risposta if (!ok) { return(false); } //do tempo ad arduino di scrivere la risposta await Task.Delay(TimeSpan.FromSeconds(3)); //verifico di essere ancora connesso if (tcpClient.IsConnected) { using (var receiving = UserDialogs.Instance.Loading("Ricezione...")) { var cts = new CancellationTokenSource(); cts.CancelAfter(TimeSpan.FromSeconds(2)); ok = await AsyncHelper.DoFunc(async() => { if (tcpClient.ReadStream.CanRead) { var bytes = await((NetworkStream)tcpClient.ReadStream).ReadFullyAsync(cts.Token); Response = Encoding.ASCII.GetString(bytes); } }, "Problema in ricezione", "Ricevuto!"); } tcpClient.Disconnect(); } else { ok = false; } return(ok); }
public void Stop() { _socketClient.Disconnect(); }
void OnRead(TcpSocketClient client, byte[] buffers) { ThreadCalls(() => { try { var cmd = new BaseCommand(buffers); switch (cmd.Command) { case Commands.Bind_Resp: var bind_resp = new Bind_Resp(buffers); if (bind_resp.Result != CommandError.Success) { PrintLog("绑定验证失败:" + CommandError.GetMessage(bind_resp.Result)); Thread.Sleep(1000); client.Disconnect(); } break; case Commands.Deliver: var deliver = new Deliver(buffers); //添加接收记录 var sms = new SMS { SPNumber = deliver.SPNumber, UserNumber = deliver.UserNumber, Content = deliver.MessageContent, Time = DateTime.Now, Type = SMSTypes.RECEIVE }; SMSHistory.Add(sms); //绑定会话组 BindGroup(deliver.SPNumber); //绑定会话 if (lbGroup.SelectedItem != null && lbGroup.SelectedItem.ToString() == sms.SPNumber) { BindSession(sms); } else { lbGroup.SelectedItem = deliver.SPNumber; BindSession(deliver.SPNumber); } //新消息提醒 PrintLog("收到一条 " + sms.SPNumber + " 发来的新消息!"); //发送响应 client.Send(new Deliver_Resp { SequenceNumber = deliver.SequenceNumber, Result = CommandError.Success }.GetBytes()); break; case Commands.Deliver_Resp: var deliver_resp = new Deliver_Resp(buffers); if (deliver_resp.Result != CommandError.Success) { PrintLog("传送消息失败:" + CommandError.GetMessage(deliver_resp.Result)); } break; default: break; } PrintLog("接收一条命令:" + Commands.GetString(cmd.Command)); } catch (Exception e) { PrintLog("读取消息出现错误: " + e.Message); } }); }