TCP协议实现双工通信
2019-12-26 15:44 .net小跟班(杜) 阅读(1707) 评论(0) 编辑 收藏 举报核心代码
public TcpClient TcpClient; // TCP连接 StreamReader ClientReader; // 网络流 读数据 StreamWriter ClientWriter; // 网络流 写数据 NetworkStream Stream; // 网络流 Thread Thd; void GetMessage() // 接收服务器传的数据 { if (Stream != null && Stream.DataAvailable) { rtxChatInfo.AppendText(DateTime.Now.ToString()); rtxChatInfo.AppendText(" 服务器说:\n"); rtxChatInfo.AppendText(ClientReader.ReadLine() + "\n"); //下拉框 rtxChatInfo.SelectionStart = rtxChatInfo.Text.Length; rtxChatInfo.Focus(); rtxSendMessage.Focus(); } } void GetConn() // 连接函数 { CheckForIllegalCrossThreadCalls = false; while (true) { try { var tex = txtServerIp.Text; var par = int.Parse(txtPort.Text.Trim()); TcpClient = new TcpClient(txtServerIp.Text, int.Parse(txtPort.Text.Trim())); Stream = TcpClient.GetStream(); ClientReader = new StreamReader(Stream); ClientWriter = new StreamWriter(Stream); txtServerIp.Enabled = false; btnConnect.Enabled = false; this.Text = "客户端 " + "正在与" + txtServerIp.Text.Trim() + "连接……"; return; } catch { txtServerIp.Enabled = true; btnConnect.Enabled = true; this.Text = "连接失败……"; //MessageBox.Show("连接失败!", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); } } } private void btnConnect_Click(object sender, EventArgs e) // 连接按钮 执行 { // 开始监听 代码 if (txtServerIp.Text.Trim() == "") // 服务器IP { MessageBox.Show("请输入服务器IP", "客户端信息", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } else { Thd = new Thread(new ThreadStart(GetConn));// 先执行 连接函数 ,在执行现场启动,新线程 Thd.Start();// 线程启动 } }
TcpListener Listener; // 监听 public Socket SocketClient; // NetworkStream NetStream; // 网络流 StreamReader ServerReader; // 服务器 读 StreamWriter ServerWriter; // 服务器 写 Thread Thd; // 线程 public void BeginLister() // 打开服务器 子函数 { while (true) { try { IPAddress[] Ips = Dns.GetHostAddresses(""); // 本机 IP地址 定义 string GetIp = "127.0.0.1"; //Ips[0].ToString(); // 获取到IP 地址 Listener = new TcpListener(IPAddress.Parse(GetIp), 5000); // 监听 Listener.Start(); // 开始监听 CheckForIllegalCrossThreadCalls = false; btnBeginServer.Enabled = false;// 开始服务器 按键控件使能关闭 // MessageBox.Show("服务器已经开启!", "服务器消息", MessageBoxButtons.OK, MessageBoxIcon.Information); this.Text = "服务器 已经开启……"; SocketClient = Listener.AcceptSocket();//接受挂起----监听到的Socket NetStream = new NetworkStream(SocketClient); // 网络流 ServerWriter = new StreamWriter(NetStream); ServerReader = new StreamReader(NetStream); if (SocketClient.Connected) // 监听 ScoketClient { MessageBox.Show("客户端连接成功!", "服务器消息", MessageBoxButtons.OK, MessageBoxIcon.Information); } } catch { }// 不做处理 继续测试监听 } } private void GetMessage() // 获取消息 { if (NetStream != null && NetStream.DataAvailable) // 网络流 非空 或者数据可用 { rtxChatInfo.AppendText(DateTime.Now.ToString()); rtxChatInfo.AppendText(" 客户端说:\n"); rtxChatInfo.AppendText(ServerReader.ReadLine() + "\n"); //下拉框 rtxChatInfo.SelectionStart = rtxChatInfo.Text.Length; rtxChatInfo.Focus(); rtxSendMessage.Focus(); } } private void tmrGetMess_Tick(object sender, EventArgs e) // 定时器 执行函数 { GetMessage(); }