c#使用Socket实现局域网内通信

服务器端代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Net.Sockets;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;
using System.IO;

namespace socket通信
{
    public partial class SERVER : Form
    {
        public SERVER()
        {
            InitializeComponent();
        }
        Socket socketSend;
        private void Form1_Load(object sender, EventArgs e)
        {
            this.ActiveControl = this.btnListen;
            txtaidip.Text = GetIpAdress();
            //txtport.Text = "80";
            Control.CheckForIllegalCrossThreadCalls = false;
        }
        //将远程连接的IP地址和Socket存放到集合中
        Dictionary<string, Socket> diSocket = new Dictionary<string, Socket>();
        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                //创建一个socket,负责监听IP地址和端口号
                Socket socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                IPAddress ip = IPAddress.Parse(txtaidip.Text.Trim());        //提供一个IP地址
                IPEndPoint point = new IPEndPoint(ip, 80);      //端口号,其中包括了IP地址


                socketWatch.Bind(point);            //绑定IP地址和端口
                ShowMsg("监听成功");
                socketWatch.Listen(10);             //设置监听队列,最多允许同时10个连接,(0表示不限制)

                Thread th = new Thread(Listen);
                th.IsBackground = true;
                th.Start(socketWatch);              //socketWatch是Listen()的参数
            }
            catch
            {

            }
            


        }
        
        private void ShowMsg(string str)
        {
            txtReceMsg.AppendText(str + "\r\n");
        }
        
        /// <summary>
        ///  //获取本机IP地址
        /// </summary>
        /// <returns></returns>
        private string GetIpAdress()     
        {
            try
            {
                string HostName = Dns.GetHostName(); //得到主机名
                IPHostEntry IpEntry = Dns.GetHostEntry(HostName);
                for (int i = 0; i < IpEntry.AddressList.Length; i++)
                {
                    //从IP地址列表中筛选出IPv4类型的IP地址
                    //AddressFamily.InterNetwork表示此IP为IPv4,
                    //AddressFamily.InterNetworkV6表示此地址为IPv6类型
                    if (IpEntry.AddressList[i].AddressFamily == AddressFamily.InterNetwork)
                    {
                        return IpEntry.AddressList[i].ToString();
                    }
                }
                return "";
            }
            catch (Exception ex)
            {
                return ex.Message;
            }
        }
        
        /// <summary>
        /// 解决只能连接一个用户的问题
        /// </summary>
        private void Listen(Object o)
        {
            Socket socketWatch = o as Socket;
            while (true)
            {
                try
                {
                    //接下来等待客户端的连接
                    socketSend = socketWatch.Accept();   //为客户端创建一个负责通信的新的socket并接收来自客户端的请求
                    //将新的socket存放进集合中
                    diSocket.Add(socketSend.RemoteEndPoint.ToString(), socketSend);
                    //将远程连接的IP地址和端口号存入下拉框
                    cboUsers.Items.Add(socketSend.RemoteEndPoint.ToString());
                    ShowMsg(socketSend.RemoteEndPoint.ToString() + ":连接成功");     //192.168.0.103:连接成功
                    Thread th = new Thread(ReceiveSend);
                    //开启一个新线程不停接收来自客户端的消息
                    th.IsBackground = true;
                    th.Start(socketSend);
                }
                catch
                {

                }
                

            }
        }
        /// <summary>
        /// 服务器端不停的接收客户端发送过来的消息
        /// </summary>
        /// <param name="o"></param>
        private void ReceiveSend(Object o)
        {
            Socket socketSend = o as Socket;
            while (true)
            {
                try
                {
                    //客户端连接成功后,服务器应该接受客户端发出的消息
                    byte[] buffer = new byte[1024*1024 * 1];
                    int r = socketSend.Receive(buffer);         // 实际接收到的有效字节数
                    if (r == 0)
                    {
                        break;
                    }
                    string str = Encoding.UTF8.GetString(buffer, 0, r);         //将字节流转换为string【str就是客户端向服务器发送的字符串】
                    ShowMsg(socketSend.RemoteEndPoint.ToString() + ":" + str);         //远程客户端连接:接收客户端发送的内容
                    
                }
                catch
                {

                }
            }
        }

        private void btnSendMsg_Click(object sender, EventArgs e)
        {           //将服务器端的信息发送给客户端
            string str = txtSendMsg.Text.Trim();
            byte[] buffer = System.Text.Encoding.UTF8.GetBytes(str);
            //socketSend.Send(buffer);
            //获得用户在下拉框中选中的IP地址,根据IP地址找到对应的socket,然后发送消息
            string ip = cboUsers.SelectedIndex.ToString();
            diSocket[ip].Send(buffer);
            txtReceMsg.AppendText(GetIpAdress() + ">>" + txtSendMsg.Text.Trim() + "\r\n");
            txtSendMsg.Text = "";       //清空文本框
        }

        //在文本框中输入信息后按【Enter】键,触发【发送消息】事件
        private void txtSendMsg_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == '\r')
            {
                btnSendMsg_Click(sender, e);
            }
        }
    }
}

客户端代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Net.Sockets;
using System.Net;
using System.Threading;

namespace socket通信客户端
{
    public partial class CLIENT : Form
    {
        public CLIENT()
        {
            InitializeComponent();
        }

        Socket socketSend;
        /// <summary>
        ///  //获取本机IP地址
        /// </summary>
        /// <returns></returns>
        private string GetIpAdress()
        {
            try
            {
                string HostName = Dns.GetHostName(); //得到主机名
                IPHostEntry IpEntry = Dns.GetHostEntry(HostName);
                for (int i = 0; i < IpEntry.AddressList.Length; i++)
                {
                    //从IP地址列表中筛选出IPv4类型的IP地址
                    //AddressFamily.InterNetwork表示此IP为IPv4,
                    //AddressFamily.InterNetworkV6表示此地址为IPv6类型
                    if (IpEntry.AddressList[i].AddressFamily == AddressFamily.InterNetwork)
                    {
                        return IpEntry.AddressList[i].ToString();
                    }
                }
                return "";
            }
            catch (Exception ex)
            {
                return ex.Message;
            }
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            //txtlocalip.Text = GetIpAdress();
            //txtport.Text = "8080";
            Control.CheckForIllegalCrossThreadCalls = false;
            this.ActiveControl = this.btnConnection;
            
        }

        private void btnConnection_Click(object sender, EventArgs e)
        {
            try
            {
                //创建一个socket用来连接服务器
                socketSend = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                IPAddress ip = IPAddress.Parse(txtaidip.Text.Trim());      //获取IP地址
                IPEndPoint ipep = new IPEndPoint(ip, Convert.ToInt32(txtport.Text.Trim()));

                //获得要连接的远程服务器的IP地址和端口号
                socketSend.Connect(ipep);
                showMSG("连接成功");
                //创建一个线程,用来不断接收服务器端发送的信息
                Thread th = new Thread(ReceiveMessage);
                th.IsBackground = true;     //后台线程
                th.Start(socketSend);       //socketSend是Start()的参数
            }
            catch
            {

            }
            
        }

        private void showMSG(string str)
        {
            txtReceMsg.AppendText(str + "\r\n");
        }

        private void btnSendMsg_Click(object sender, EventArgs e)
        {
            string str = txtSendMsg.Text.Trim();
            byte[] buffer = System.Text.Encoding.UTF8.GetBytes(str);
            socketSend.Send(buffer);
            txtReceMsg.AppendText(GetIpAdress() + ">>" + txtSendMsg.Text.Trim() + "\r\n");
            txtSendMsg.Text = "";
        }

        private void txtMsg_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == '\r')
            {
                this.btnSendMsg_Click(sender, e);
            }
        }
        /// <summary>
        /// 不停地接收服务器端发送来的信息
        /// </summary>
        /// <param name="o"></param>
        private void ReceiveMessage(Object o)
        {
            Socket socketSend = o as Socket;
            try
            {
                while (true)
                {
                    byte[] buffer = new byte[1024 * 1024 * 1];
                    int r = socketSend.Receive(buffer);
                    if (r == 0)
                    {
                        break;
                    }
                    string str = Encoding.UTF8.GetString(buffer, 0, r);
                    showMSG(socketSend.RemoteEndPoint.ToString() + ":" + str);
                    
                }
            }
            catch 
            {
                
            }
            
            
        }
    }


}

 

原文链接:https://www.cnblogs.com/decoct-tea/p/12375172.html

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值