A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

一、客户端向服务器的发送消息
        代码如下:
  1. public Form1()
  2.         {
  3.             InitializeComponent();
  4.             TextBox.CheckForIllegalCrossThreadCalls = false;//关闭跨线程修改控件检查
  5.         }

  6.         Socket sokClient = null;//负责与该服务端套接字通信的套接字
  7.         Thread threadClient = null;//负责 监听 服务器端发送来的消息的 线程
  8.         bool isRec = true;//是否循环接受服务端的数据
  9.         private void button1_Click(object sender, EventArgs e)
  10.         {
  11.             //实例化 套接字 (ip4寻址协议,流式传输,TCP协议)
  12.             sokClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  13.             //创建IP对象
  14.             IPAddress address = IPAddress.Parse(txtIp.Text.Trim());
  15.             //创建网络节点对象 包含 ip和port
  16.             IPEndPoint endPoint = new IPEndPoint(address, int.Parse(txtPort.Text.ToString().Trim()));
  17.             //创建 服务端监听套接字
  18.             sokClient.Connect(endPoint);
  19.             //创建负责接受 服务端发送来数据的 线程
  20.             threadClient = new Thread(ReceiveMsg);
  21.             threadClient.IsBackground = true;
  22.             threadClient.Start();
  23.         }
  24.         void ReceiveMsg()
  25.         {
  26.             while (isRec)
  27.             {
  28.                 byte[] msgArr = new byte[1024 * 1024 * 2];//接受到的消息的缓冲区
  29.                 sokClient.Receive(msgArr);
  30.                 string strMsg = System.Text.Encoding.UTF8.GetString(msgArr);
  31.                 ShowMsg("服务端消息:" + strMsg.ToString().Trim());
  32.             }
  33.         }

  34.         private void btnSendNews_Click(object sender, EventArgs e)
  35.         {
  36.             byte[] arrMsg = System.Text.Encoding.UTF8.GetBytes(txtInput.Text.Trim());//把字符串 转换成 字节
  37.             sokClient.Send(arrMsg);//发送信息
  38.             ShowMsg("我说:" + txtInput.Text.Trim());
  39.         }

  40.         #region 向文本框显示消息  -void ShowMsg(string msg)
  41.         //向文本框显示消息
  42.         void ShowMsg(string msg)
  43.         {
  44.             txtShow.AppendText(msg + "\r\n");
  45.         }
  46.         #endregion
复制代码
二、服务端接受客户端发送的消息
        代码如下:
  1. public Form1()
  2.         {
  3.             InitializeComponent();
  4.             TextBox.CheckForIllegalCrossThreadCalls = false;//关闭跨线程修改控件检查
  5.         }

  6.         Socket sokWatch = null;//负责监听 客户端 连接请求的 套接字
  7.         Thread threadWatch = null;//负责调用套接字,执行  监听请求的线程

  8.         //开始监听按钮
  9.         private void button1_Click(object sender, EventArgs e)
  10.         {
  11.             //实例化 套接字 (ip4寻址协议,流式传输,TCP协议)
  12.             sokWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  13.             //创建IP对象
  14.             IPAddress address = IPAddress.Parse(txtIp.Text.Trim());
  15.             //创建网络节点对象 包含 ip和port
  16.             IPEndPoint endPoint = new IPEndPoint(address, int.Parse(txtPort.Text.ToString().Trim()));
  17.             //将 监听套接字 绑定到 对应的IP和端口
  18.             try
  19.             {
  20.                 sokWatch.Bind(endPoint);
  21.             }
  22.             catch (Exception ex)
  23.             {
  24.                 ShowMsg("异常:" + ex);
  25.                 return;
  26.             }
  27.             //设置 监听队列 长度为10(同时能处理10个连接请求)
  28.             sokWatch.Listen(10);
  29.             threadWatch = new Thread(StartWatch);
  30.             threadWatch.IsBackground = true;
  31.             threadWatch.Start();
  32.             ShowMsg("启动服务成功!");
  33.         }

  34.         Dictionary<string, Socket> dicSocket = new Dictionary<string, Socket>();
  35.         bool isWatch = true;
  36.         //被线程调用 监听连接端口
  37.         void StartWatch()
  38.         {
  39.             while (isWatch)
  40.             {
  41.                 //监听 客户端 连接请求 ,但是,它会阻断当前线程
  42.                 Socket sokMsg = sokWatch.Accept();//监听到请求,立即创建负责与该客户端套接字通信的套接字
  43.                 //将 通信套接字 加入 集合,并以通信套接字的远程IpPort作为键
  44.                 dicSocket.Add(sokMsg.RemoteEndPoint.ToString(), sokMsg);
  45.                 cboClient.Items.Add(sokMsg.RemoteEndPoint.ToString());
  46.                 ShowMsg("接受连接成功!");
  47.                 //启动一个新线程  用来监听客户端发送来的数据
  48.                 Thread threadConnection = new Thread(ReciveMsg);
  49.                 threadConnection.IsBackground = true;
  50.                 threadConnection.Start(sokMsg);
  51.             }
  52.         }

  53.         //发送信息  到指定的客户端
  54.         private void btnSendNews_Click(object sender, EventArgs e)
  55.         {
  56.             byte[] arrMsg = System.Text.Encoding.UTF8.GetBytes(txtInput.Text.Trim());//把字符串 转换成 字节
  57.             //从下拉框中 获得 要向哪个客户端发送消息
  58.             string socketConnection = cboClient.Text.Trim();
  59.             if (!string.IsNullOrEmpty(socketConnection))
  60.             {
  61.                 //查字典集合中根据键获得 负责与该客户端负责通信的套接字 并调用send方法发送数据过去
  62.                 dicSocket[socketConnection].Send(arrMsg);
  63.                 //sokMsg.Send(arrMsg);//发送信息
  64.                 ShowMsg("我说:" + txtInput.Text.Trim());
  65.             }
  66.             else
  67.             {
  68.                 ShowMsg("消息:请选择发送消息的用户!");
  69.             }

  70.         }
  71.         bool isRec = true;//与客户端通信的 套接字 是否 监听消息

  72.         #region 接受客户端发送来的消息  -void ReciveMsg(Socket sokConnection)
  73.         /// <summary>
  74.         /// 接受客户端发送来的消息
  75.         /// </summary>
  76.         /// <param name="sokConnection">与客户端通信的套接字对象</param>
  77.         void ReciveMsg(object sok)
  78.         {
  79.             Socket sokConnection = sok as Socket;
  80.             if (sokConnection != null)
  81.             {
  82.                 try
  83.                 {
  84.                     while (isRec)
  85.                     {
  86.                         byte[] msgArr = new byte[1024 * 1024 * 2];//接受到的消息的缓冲区
  87.                         int length = sokConnection.Receive(msgArr);
  88.                         string strMsg = System.Text.Encoding.UTF8.GetString(msgArr, 0, length);
  89.                         ShowMsg(sokConnection .RemoteEndPoint+ "的消息:" + strMsg + "\r\n");
  90.                     }
  91.                 }
  92.                 catch (SocketException ex)
  93.                 {
  94.                     ShowMsg("异常:" + ex);
  95.                 }
  96.                 catch (Exception ex)
  97.                 {
  98.                     ShowMsg("异常:" + ex);
  99.                 }
  100.             }
  101.         }
  102.         #endregion

  103.         #region 向文本框显示消息  -void ShowMsg(string msg)
  104.         //向文本框显示消息
  105.         void ShowMsg(string msg)
  106.         {
  107.             txtShow.AppendText(msg + "\r\n");
  108.         }
  109.         #endregion
复制代码

评分

参与人数 1技术分 +1 收起 理由
杨志 + 1

查看全部评分

3 个回复

倒序浏览
值得学习ing!
回复 使用道具 举报
{:soso_e181:}
回复 使用道具 举报
学习学习
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马