zoukankan      html  css  js  c++  java
  • winform socket编程之TCPListener

    运行结果:

     服务端代码

      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 SocketServer
     15 {
     16     public partial class Form1 : Form
     17     {
     18         private List<TcpClient> clientList=new List<TcpClient>();///保存客户连接socket
     19         private TcpListener tcpListener;///监听类
     20 
     21         public Form1()
     22         {
     23             InitializeComponent();
     24         }
     25 
     26         private void button3_Click(object sender, EventArgs e)
     27         {
     28             tcpListener = new TcpListener(IPAddress.Any, 3000);//监听3000端口
     29             tcpListener.Start();//开始监听
     30             Thread listenThread = new Thread(new ThreadStart(ListenForClients));///新建线程来处理新的客户端连接
     31             listenThread.Start();
     32             
     33         }
     34 
     35         /// <summary>
     36         /// 处理客户端连接线程
     37         /// </summary>
     38         private void ListenForClients()
     39         {
     40             while (true)
     41             {
     42                 //blocks until a client has connected to the server
     43                 TcpClient client = this.tcpListener.AcceptTcpClient();
     44                 clientList.Add(client);
     45                 listBox2.BeginInvoke(new Action(()=>{listBox2.Items.Add(client.Client.RemoteEndPoint.ToString());}));
     46                 //create a thread to handle communication
     47                 //with connected client
     48                 Thread clientThread = new Thread(new ParameterizedThreadStart(HandleClientComm));
     49                 clientThread.Start(client);
     50                 
     51             }
     52         }
     53 
     54         /// <summary>
     55         /// 读客户端数据
     56         /// </summary>
     57         /// <param name="client"></param>
     58         private void HandleClientComm(object client)
     59         {
     60             TcpClient tcpClient = (TcpClient)client;
     61             NetworkStream clientStream = tcpClient.GetStream();
     62             byte[] message = new byte[4096];
     63             int bytesRead;
     64             while (true)
     65             {
     66                 bytesRead = 0;
     67                 try
     68                 {
     69                     //blocks until a client sends a message,每个线程在这一句时会中断一下,等待客户端有数据传进来后再往下执行
     70                     bytesRead = clientStream.Read(message, 0, 4096);
     71                 }
     72                 catch
     73                 {
     74                     //a socket error has occured
     75                     break;
     76                 }
     77                 if (bytesRead == 0)
     78                 {
     79                     //the client has disconnected from the server
     80                     break;
     81                 }
     82 
     83                 //message has successfully been received
     84                 UTF8Encoding utf8 = new UTF8Encoding();
     85                 System.Diagnostics.Debug.WriteLine(utf8.GetString(message, 0, bytesRead));
     86                 ///线程里修改UI界面的内容要用invoke方法和委托
     87                 listBox1.Invoke(new Action(() => { listBox1.Items.Add(utf8.GetString(message, 0, bytesRead)); }));
     88             }
     89 
     90             //tcpClient.Close();//不要关闭
     91         }
     92 
     93         /// <summary>
     94         /// 向所有客户端发送
     95         /// </summary>
     96         /// <param name="sender"></param>
     97         /// <param name="e"></param>
     98         private void button4_Click(object sender, EventArgs e)
     99         {
    100             foreach (var item in clientList)
    101             {
    102                 NetworkStream stream=item.GetStream();
    103                 stream.Write(UTF8Encoding.UTF8.GetBytes(this.textBox1.Text), 0, UTF8Encoding.UTF8.GetBytes(this.textBox1.Text).Length);
    104             }
    105         }
    106     }
    107 }
    View Code

     客户端代码

     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 EdoecSpeaker
    15 {
    16     public partial class Form1 : Form
    17     {
    18         TcpClient client;
    19         public Form1()
    20         {
    21             InitializeComponent();
    22         }
    23 
    24       /// <summary>
    25       /// 连接服务器
    26       /// </summary>
    27       /// <param name="sender"></param>
    28       /// <param name="e"></param>
    29         private void button3_Click(object sender, EventArgs e)
    30         {
    31             if (client==null)
    32             {
    33                 client = new TcpClient();
    34                 IPEndPoint serverEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 3000);
    35                 client.Connect(serverEndPoint);
    36                 Thread clientThread = new Thread(new ParameterizedThreadStart(HandleClientComm));
    37                 clientThread.Start(client);
    38             }            
    39             //clientStream.Flush();
    40         }
    41 
    42         /// <summary>
    43         /// 接收消息
    44         /// </summary>
    45         /// <param name="client"></param>
    46         private void HandleClientComm(object client)
    47         {
    48             TcpClient tcpClient = (TcpClient)client;
    49             NetworkStream clientStream = tcpClient.GetStream();
    50 
    51             byte[] message = new byte[4096];
    52             int bytesRead;
    53 
    54             while (true)
    55             {
    56                 bytesRead = 0;
    57 
    58                 try
    59                 {
    60                     //blocks until a client sends a message
    61                     bytesRead = clientStream.Read(message, 0, 4096);
    62                 }
    63                 catch
    64                 {
    65                     //a socket error has occured
    66                     break;
    67                 }
    68 
    69                 if (bytesRead == 0)
    70                 {
    71                     //the client has disconnected from the server
    72                     break;
    73                 }
    74 
    75                 //message has successfully been received
    76                 UTF8Encoding utf8 = new UTF8Encoding();
    77                 System.Diagnostics.Debug.WriteLine(utf8.GetString(message, 0, bytesRead));
    78                 listBox1.Invoke(new Action(() => { listBox1.Items.Add(utf8.GetString(message, 0, bytesRead)); }));
    79             }
    80             //tcpClient.Close();
    81         }
    82 
    83         /// <summary>
    84         /// 发送消息
    85         /// </summary>
    86         /// <param name="sender"></param>
    87         /// <param name="e"></param>
    88         private void button4_Click(object sender, EventArgs e)
    89         {
    90             NetworkStream clientStream = client.GetStream();
    91             clientStream.Write(UTF8Encoding.UTF8.GetBytes(this.textBox1.Text), 0, UTF8Encoding.UTF8.GetBytes(this.textBox1.Text).Length);
    92         }
    93     }
    94 }
    View Code
  • 相关阅读:
    VUE笔记-如何处理vue create demo时候,不能使用上下按键选择?
    帝国CMS之PC端上新栏目后,移动端无法同步,添加内容编辑页打开空白的处理方法
    帝国cms:迁移站点后,配置多端访问显示“访问端目录不存在”
    如何批量删除帝国CMS中同一前缀的数据表?
    宝塔插件"网站监控报表"错误日志显示大量不存在的链接,处理方法及流程
    mysql删除重复数据只保留一条
    VirtualBox 中 discuzq不能添加软链接的处理方法
    mysql8 source 导入大文件时 经常意外中断 且无法再链接断续 解决方法先设置 set names utf8;
    discuzq Virtualbox 虚拟机 在共享文件夹设置软链接 in 报错 Protocol error问题
    是的,奈学教育一周年了!
  • 原文地址:https://www.cnblogs.com/shengyu-kmust/p/6180174.html
Copyright © 2011-2022 走看看