zoukankan      html  css  js  c++  java
  • c#使用Socket实现局域网内通信

    服务器端代码:

      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.Sockets;
      8 using System.Net;
      9 using System.Text;
     10 using System.Threading.Tasks;
     11 using System.Windows.Forms;
     12 using System.Threading;
     13 using System.IO;
     14 
     15 namespace socket通信
     16 {
     17     public partial class SERVER : Form
     18     {
     19         public SERVER()
     20         {
     21             InitializeComponent();
     22         }
     23         Socket socketSend;
     24         private void Form1_Load(object sender, EventArgs e)
     25         {
     26             this.ActiveControl = this.btnListen;
     27             txtaidip.Text = GetIpAdress();
     28             //txtport.Text = "80";
     29             Control.CheckForIllegalCrossThreadCalls = false;
     30         }
     31         //将远程连接的IP地址和Socket存放到集合中
     32         Dictionary<string, Socket> diSocket = new Dictionary<string, Socket>();
     33         private void button1_Click(object sender, EventArgs e)
     34         {
     35             try
     36             {
     37                 //创建一个socket,负责监听IP地址和端口号
     38                 Socket socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
     39                 IPAddress ip = IPAddress.Parse(txtaidip.Text.Trim());        //提供一个IP地址
     40                 IPEndPoint point = new IPEndPoint(ip, 80);      //端口号,其中包括了IP地址
     41 
     42 
     43                 socketWatch.Bind(point);            //绑定IP地址和端口
     44                 ShowMsg("监听成功");
     45                 socketWatch.Listen(10);             //设置监听队列,最多允许同时10个连接,(0表示不限制)
     46 
     47                 Thread th = new Thread(Listen);
     48                 th.IsBackground = true;
     49                 th.Start(socketWatch);              //socketWatch是Listen()的参数
     50             }
     51             catch
     52             {
     53 
     54             }
     55             
     56 
     57 
     58         }
     59         
     60         private void ShowMsg(string str)
     61         {
     62             txtReceMsg.AppendText(str + "
    ");
     63         }
     64         
     65         /// <summary>
     66         ///  //获取本机IP地址
     67         /// </summary>
     68         /// <returns></returns>
     69         private string GetIpAdress()     
     70         {
     71             try
     72             {
     73                 string HostName = Dns.GetHostName(); //得到主机名
     74                 IPHostEntry IpEntry = Dns.GetHostEntry(HostName);
     75                 for (int i = 0; i < IpEntry.AddressList.Length; i++)
     76                 {
     77                     //从IP地址列表中筛选出IPv4类型的IP地址
     78                     //AddressFamily.InterNetwork表示此IP为IPv4,
     79                     //AddressFamily.InterNetworkV6表示此地址为IPv6类型
     80                     if (IpEntry.AddressList[i].AddressFamily == AddressFamily.InterNetwork)
     81                     {
     82                         return IpEntry.AddressList[i].ToString();
     83                     }
     84                 }
     85                 return "";
     86             }
     87             catch (Exception ex)
     88             {
     89                 return ex.Message;
     90             }
     91         }
     92         
     93         /// <summary>
     94         /// 解决只能连接一个用户的问题
     95         /// </summary>
     96         private void Listen(Object o)
     97         {
     98             Socket socketWatch = o as Socket;
     99             while (true)
    100             {
    101                 try
    102                 {
    103                     //接下来等待客户端的连接
    104                     socketSend = socketWatch.Accept();   //为客户端创建一个负责通信的新的socket并接收来自客户端的请求
    105                     //将新的socket存放进集合中
    106                     diSocket.Add(socketSend.RemoteEndPoint.ToString(), socketSend);
    107                     //将远程连接的IP地址和端口号存入下拉框
    108                     cboUsers.Items.Add(socketSend.RemoteEndPoint.ToString());
    109                     ShowMsg(socketSend.RemoteEndPoint.ToString() + ":连接成功");     //192.168.0.103:连接成功
    110                     Thread th = new Thread(ReceiveSend);
    111                     //开启一个新线程不停接收来自客户端的消息
    112                     th.IsBackground = true;
    113                     th.Start(socketSend);
    114                 }
    115                 catch
    116                 {
    117 
    118                 }
    119                 
    120 
    121             }
    122         }
    123         /// <summary>
    124         /// 服务器端不停的接收客户端发送过来的消息
    125         /// </summary>
    126         /// <param name="o"></param>
    127         private void ReceiveSend(Object o)
    128         {
    129             Socket socketSend = o as Socket;
    130             while (true)
    131             {
    132                 try
    133                 {
    134                     //客户端连接成功后,服务器应该接受客户端发出的消息
    135                     byte[] buffer = new byte[1024*1024 * 1];
    136                     int r = socketSend.Receive(buffer);         // 实际接收到的有效字节数
    137                     if (r == 0)
    138                     {
    139                         break;
    140                     }
    141                     string str = Encoding.UTF8.GetString(buffer, 0, r);         //将字节流转换为string【str就是客户端向服务器发送的字符串】
    142                     ShowMsg(socketSend.RemoteEndPoint.ToString() + ":" + str);         //远程客户端连接:接收客户端发送的内容
    143                     
    144                 }
    145                 catch
    146                 {
    147 
    148                 }
    149             }
    150         }
    151 
    152         private void btnSendMsg_Click(object sender, EventArgs e)
    153         {           //将服务器端的信息发送给客户端
    154             string str = txtSendMsg.Text.Trim();
    155             byte[] buffer = System.Text.Encoding.UTF8.GetBytes(str);
    156             //socketSend.Send(buffer);
    157             //获得用户在下拉框中选中的IP地址,根据IP地址找到对应的socket,然后发送消息
    158             string ip = cboUsers.SelectedIndex.ToString();
    159             diSocket[ip].Send(buffer);
    160             txtReceMsg.AppendText(GetIpAdress() + ">>" + txtSendMsg.Text.Trim() + "
    ");
    161             txtSendMsg.Text = "";       //清空文本框
    162         }
    163 
    164         //在文本框中输入信息后按【Enter】键,触发【发送消息】事件
    165         private void txtSendMsg_KeyPress(object sender, KeyPressEventArgs e)
    166         {
    167             if (e.KeyChar == '
    ')
    168             {
    169                 btnSendMsg_Click(sender, e);
    170             }
    171         }
    172     }
    173 }

    客户端代码:
      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.Text;
      8 using System.Threading.Tasks;
      9 using System.Windows.Forms;
     10 using System.Net.Sockets;
     11 using System.Net;
     12 using System.Threading;
     13 
     14 namespace socket通信客户端
     15 {
     16     public partial class CLIENT : Form
     17     {
     18         public CLIENT()
     19         {
     20             InitializeComponent();
     21         }
     22 
     23         Socket socketSend;
     24         /// <summary>
     25         ///  //获取本机IP地址
     26         /// </summary>
     27         /// <returns></returns>
     28         private string GetIpAdress()
     29         {
     30             try
     31             {
     32                 string HostName = Dns.GetHostName(); //得到主机名
     33                 IPHostEntry IpEntry = Dns.GetHostEntry(HostName);
     34                 for (int i = 0; i < IpEntry.AddressList.Length; i++)
     35                 {
     36                     //从IP地址列表中筛选出IPv4类型的IP地址
     37                     //AddressFamily.InterNetwork表示此IP为IPv4,
     38                     //AddressFamily.InterNetworkV6表示此地址为IPv6类型
     39                     if (IpEntry.AddressList[i].AddressFamily == AddressFamily.InterNetwork)
     40                     {
     41                         return IpEntry.AddressList[i].ToString();
     42                     }
     43                 }
     44                 return "";
     45             }
     46             catch (Exception ex)
     47             {
     48                 return ex.Message;
     49             }
     50         }
     51 
     52         private void Form1_Load(object sender, EventArgs e)
     53         {
     54             //txtlocalip.Text = GetIpAdress();
     55             //txtport.Text = "8080";
     56             Control.CheckForIllegalCrossThreadCalls = false;
     57             this.ActiveControl = this.btnConnection;
     58             
     59         }
     60 
     61         private void btnConnection_Click(object sender, EventArgs e)
     62         {
     63             try
     64             {
     65                 //创建一个socket用来连接服务器
     66                 socketSend = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
     67                 IPAddress ip = IPAddress.Parse(txtaidip.Text.Trim());      //获取IP地址
     68                 IPEndPoint ipep = new IPEndPoint(ip, Convert.ToInt32(txtport.Text.Trim()));
     69 
     70                 //获得要连接的远程服务器的IP地址和端口号
     71                 socketSend.Connect(ipep);
     72                 showMSG("连接成功");
     73                 //创建一个线程,用来不断接收服务器端发送的信息
     74                 Thread th = new Thread(ReceiveMessage);
     75                 th.IsBackground = true;     //后台线程
     76                 th.Start(socketSend);       //socketSend是Start()的参数
     77             }
     78             catch
     79             {
     80 
     81             }
     82             
     83         }
     84 
     85         private void showMSG(string str)
     86         {
     87             txtReceMsg.AppendText(str + "
    ");
     88         }
     89 
     90         private void btnSendMsg_Click(object sender, EventArgs e)
     91         {
     92             string str = txtSendMsg.Text.Trim();
     93             byte[] buffer = System.Text.Encoding.UTF8.GetBytes(str);
     94             socketSend.Send(buffer);
     95             txtReceMsg.AppendText(GetIpAdress() + ">>" + txtSendMsg.Text.Trim() + "
    ");
     96             txtSendMsg.Text = "";
     97         }
     98 
     99         private void txtMsg_KeyPress(object sender, KeyPressEventArgs e)
    100         {
    101             if (e.KeyChar == '
    ')
    102             {
    103                 this.btnSendMsg_Click(sender, e);
    104             }
    105         }
    106         /// <summary>
    107         /// 不停地接收服务器端发送来的信息
    108         /// </summary>
    109         /// <param name="o"></param>
    110         private void ReceiveMessage(Object o)
    111         {
    112             Socket socketSend = o as Socket;
    113             try
    114             {
    115                 while (true)
    116                 {
    117                     byte[] buffer = new byte[1024 * 1024 * 1];
    118                     int r = socketSend.Receive(buffer);
    119                     if (r == 0)
    120                     {
    121                         break;
    122                     }
    123                     string str = Encoding.UTF8.GetString(buffer, 0, r);
    124                     showMSG(socketSend.RemoteEndPoint.ToString() + ":" + str);
    125                     
    126                 }
    127             }
    128             catch 
    129             {
    130                 
    131             }
    132             
    133             
    134         }
    135     }
    136 
    137 
    138 }
     
  • 相关阅读:
    墙裂推荐!B站上的Python学习资源
    docker实践-安装wordpress
    docker 使用:创建nginx容器
    docker 使用:镜像和容器
    python标准库:ftplib模块
    python标准库:datetime模块
    python标准库:csv 模块
    python标准库-calendar 模块
    python标准库-builtin 模块之compile,execfile
    python标准库-array 模块
  • 原文地址:https://www.cnblogs.com/decoct-tea/p/12375172.html
Copyright © 2011-2022 走看看