余LI  

winform.cs代码   client端代码 见下:

 这是客户端代码:

  1 using System;
  2 using System.Collections.Generic;
  3 using System.ComponentModel;
  4 using System.Data;
  5 using System.Drawing;
  6 using System.Linq;
  7 using System.Net;
  8 using System.Net.Sockets;
  9 using System.Text;
 10 using System.Threading;
 11 using System.Threading.Tasks;
 12 using System.Windows.Forms;
 13 
 14 namespace TcpMsgClient
 15 {
 16 public partial class FrmClient : Form
 17 {
 18 public FrmClient()
 19 {
 20 InitializeComponent();
 21 //关闭对文本框的非法线程操作检查
 22 TextBox.CheckForIllegalCrossThreadCalls = false;
 23 }
 24 //创建 1个客户端套接字 和1个负责监听服务端请求的线程 
 25 Socket socketClient = null;
 26 Thread threadClient = null;
 27 
 28 /// <summary>
 29 /// 连接服务端事件
 30 /// </summary>
 31 /// <param name="sender"></param>
 32 /// <param name="e"></param>
 33 private void btnListenServer_Click(object sender, EventArgs e)
 34 {
 35 //定义一个套字节监听 包含3个参数(IP4寻址协议,流式连接,TCP协议)
 36 socketClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
 37 //需要获取文本框中的IP地址
 38 IPAddress ipaddress = IPAddress.Parse(this.txtIP.Text.Trim());
 39 //将获取的ip地址和端口号绑定到网络节点endpoint上
 40 IPEndPoint endpoint = new IPEndPoint(ipaddress, int.Parse(this.txtPort.Text.Trim()));
 41 //这里客户端套接字连接到网络节点(服务端)用的方法是Connect 而不是Bind
 42 try
 43 {
 44 socketClient.Connect(endpoint);
 45 this.txtMsg.AppendText("客户端连接服务端成功!" + "\r\n");
 46 this.btnListenServer.Enabled = false;
 47 //创建一个线程 用于监听服务端发来的消息
 48 threadClient = new Thread(RecMsg);
 49 //将窗体线程设置为与后台同步
 50 threadClient.IsBackground = true;
 51 //启动线程
 52 threadClient.Start();
 53 }
 54 catch (Exception ex) {
 55 this.txtMsg.AppendText("远程服务端断开,连接失败!" + "\r\n");
 56 } 
 57 }
 58 
 59 /// <summary>
 60 /// 接收服务端发来信息的方法
 61 /// </summary>
 62 private void RecMsg()
 63 {
 64 while (true) //持续监听服务端发来的消息
 65 {
 66 try
 67 {
 68 //定义一个1M的内存缓冲区 用于临时性存储接收到的信息
 69 byte[] arrRecMsg = new byte[1024 * 1024];
 70 //将客户端套接字接收到的数据存入内存缓冲区, 并获取其长度
 71 int length = socketClient.Receive(arrRecMsg);
 72 //将套接字获取到的字节数组转换为人可以看懂的字符串
 73 string strRecMsg = Encoding.UTF8.GetString(arrRecMsg, 0, length);
 74 //将发送的信息追加到聊天内容文本框中
 75 txtMsg.AppendText("服务端 " + GetCurrentTime() + "\r\n" + strRecMsg + "\r\n");
 76 }
 77 catch (Exception ex) {
 78 this.txtMsg.AppendText("远程服务器已中断连接!"+"\r\n");
 79 this.btnListenServer.Enabled = true;
 80 break;
 81 }
 82 }
 83 }
 84 
 85 /// <summary>
 86 /// 发送字符串信息到服务端的方法
 87 /// </summary>
 88 /// <param name="sendMsg">发送的字符串信息</param>
 89 private void ClientSendMsg(string sendMsg)
 90 {
 91 try { 
 92 //将输入的内容字符串转换为机器可以识别的字节数组
 93 byte[] arrClientSendMsg = Encoding.UTF8.GetBytes(sendMsg);
 94 //调用客户端套接字发送字节数组
 95 socketClient.Send(arrClientSendMsg);
 96 //将发送的信息追加到聊天内容文本框中
 97 txtMsg.AppendText("天涯 " + GetCurrentTime() + "\r\n" + sendMsg + "\r\n");
 98 }
 99 catch(Exception ex){
100 this.txtMsg.AppendText("远程服务器已中断连接,无法发送消息!" + "\r\n");
101 }
102 }
103 
104 private void btnSendMsg_Click(object sender, EventArgs e)
105 {
106 //调用ClientSendMsg方法 将文本框中输入的信息发送给服务端
107 ClientSendMsg(this.txtClientSendMsg.Text.Trim());
108 this.txtClientSendMsg.Clear();
109 }
110 
111 private void txtClientSendMsg_KeyDown(object sender, KeyEventArgs e)
112 {
113 //当光标位于文本框时 如果用户按下了键盘上的Enter键 
114 if (e.KeyCode == Keys.Enter)
115 {
116 //则调用客户端向服务端发送信息的方法
117 ClientSendMsg(this.txtClientSendMsg.Text.Trim());
118 this.txtClientSendMsg.Clear();
119 }
120 }
121 
122 /// <summary>
123 /// 获取当前系统时间的方法
124 /// </summary>
125 /// <returns>当前时间</returns>
126 private DateTime GetCurrentTime()
127 {
128 DateTime currentTime = new DateTime();
129 currentTime = DateTime.Now;
130 return currentTime;
131 }
132 }
133 }

 

posted on 2020-03-26 17:31  余LI  阅读(407)  评论(0编辑  收藏  举报