我是靠谱客的博主 奋斗白云,最近开发中收集的这篇文章主要介绍C#实现客户端与服务器的TCP通讯前言一、客户端与服务器界面二、客户端与服务器的连接、接收数据三、客户端与服务器发送数据四、常见问题点,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、客户端与服务器界面
  • 二、客户端与服务器的连接、接收数据
    • 1.服务器”开始监听“
    • 2.客户端”连接“
  • 三、客户端与服务器发送数据
    • 1.客户端”发送“
    • 2.服务器”发送“
  • 四、常见问题点
    • 1、线程中不能操作界面控件
    • 2、可能出错的地方加上try{}catch{}
    • 3、断开连接后会一直接收长度为0的数据,需要判断长度为0时跳出接收数据的循环
    • 4、连接/接收数据时处于while循环中,需要将连接的代码放在后台线程中,否则容易出现卡界面的情况


前言

实现多个客户端与一个服务器之间的通讯,界面使用Windows窗体应用程序生成


一、客户端与服务器界面

#1、客户端界面如下:客户端界面
功能1: 输入IP和端口号点击“connect”按钮实现客户端与服务器的连接(服务器处于监听状态),提示显示在第一个textbox中
功能2:在第二个textbox中输入要发送的内容,点击“发送"按钮,实现数据的发送,提示显示在第一个textbox中

#2、服务器界面如下:
服务器界面
功能1:输入端口号,点击”开始监听“按钮,等待客户端的连接,提示显示在第一个textbox中
功能2:选中combox中的ip和端口号,在第二个textbox中输入要发送的内容,点击”发送“按钮,蒋数据发送到对应的客户端,提示显示在第一个textbox中

二、客户端与服务器的连接、接收数据

1.服务器”开始监听“

等待客户端的连接,连接成功后一直接收客户端发来的消息

代码如下(示例):

		/// <summary>
        /// 开始监听
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
            //创建用于监听的socket
            Socket socketwatch = new Socket(SocketType.Stream, ProtocolType.Tcp);
            IPAddress ip = IPAddress.Any;
            IPEndPoint point = new IPEndPoint(ip,Convert.ToInt32(textBox1.Text));
            
            //监听
            socketwatch.Bind(point);
            socketwatch.Listen(10);
            showmsg("监听成功");
            
            //开辟新线程一直监听客户端的连接
            Thread th = new Thread(Listen);
            th.IsBackground = true;
            th.Start(socketwatch);
            
        }

        /// <summary>
        /// 开辟新的线程一直监听客户端的连接
        /// </summary>
        Socket socketsend;
        void Listen(object o)
        {
            Socket socketwatch = o as Socket;
            while(true)
            {
                //等待客户端的连接,并创建一个用于通信的socket
                socketsend = socketwatch.Accept();
                showmsg(socketsend.RemoteEndPoint.ToString() + ": 连接成功");
                
                //开辟新的后台线程一直接收客户端发来的消息
                Thread th = new Thread(receive);
                th.IsBackground = true;
                th.Start(socketsend);
            }
        }

        //定义键值对将ip和对应的通讯socket存入
        Dictionary<string, Socket> dicSocket = new Dictionary<string, Socket>();

        /// <summary>
        /// 接收客户端发来的消息
        /// </summary>
        /// <param name="o"></param>
        public void receive(object o)  //线程中传递变量必须是object类型
        {
            Socket socketsend = o as Socket;
            
            //将连接的ip和对应的socket存入键值对
            dicSocket.Add(socketsend.RemoteEndPoint.ToString(), socketsend);
            
            //将连接的ip和端口号存入combox中
            comboBox1.Items.Add(socketsend.RemoteEndPoint.ToString());
            while (true)
            {
                try {
                    //接收客户端发来的消息
                    byte[] buffer = new byte[1024 * 1024 * 2];
                    int i = socketsend.Receive(buffer);
                    
                    //断开连接时接收到的数据长度为0,此时跳出循环
                    if (i == 0)
                    {
                        comboBox1.Items.Remove(socketsend.RemoteEndPoint.ToString());
                        break;
                    }
                    string str = Encoding.UTF8.GetString(buffer, 0, i);
                    showmsg(socketsend.RemoteEndPoint + ":" + str);
                }
                catch { }
            }
        }
        
        /// <summary>
        /// 显示提示信息
        /// </summary>
        /// <param name="s"></param>
        void showmsg(string s)
        {
            textBox2.AppendText(s + "rn");
        }
        

2.客户端”连接“

客户端连接服务器,成功后一直接听服务器发来的消息
代码如下(示例):

        //设为全局变量用于通讯连接和接收数据
        Socket socketsend;
        
        /// <summary>
        /// 连接服务器
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
            try {
                //创建用于通讯的socket
                socketsend = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                IPAddress ip = IPAddress.Parse(textBox2.Text);
                IPEndPoint port = new IPEndPoint(ip, Convert.ToInt32(textBox1.Text));
                
                //连接对应的端口
                socketsend.Connect(port);
                ShowMsg(socketsend.RemoteEndPoint+ ": 连接成功!");
                
                //开辟新的线程用于接收服务器发来的数据
                Thread th = new Thread(receive);
                th.IsBackground = true;
                th.Start();
            }
            catch { }
        }

        /// <summary>
        /// 接收服务器发来的数据
        /// </summary>
        public void receive()
        {
            while(true)
            {
                try {
                    byte[] buffer = new byte[1024 * 1024 * 2];
                    int i = socketsend.Receive(buffer);
                    
                    //接收到的数据长度为0时表示连接断开,跳出循环
                    if (i == 0)
                    {
                        break;
                    }
                    string str = Encoding.UTF8.GetString(buffer, 0, i);
                    ShowMsg(socketsend.RemoteEndPoint+":"+ str);
                }
                catch { }
            }
        }

        /// <summary>
        /// 显示提示信息
        /// </summary>
        /// <param name="str"></param>
        public void ShowMsg(string str)
        {
            textBox3.AppendText(str + "rn");
        }

三、客户端与服务器发送数据

1.客户端”发送“


        /// <summary>
        /// 发送数据
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button2_Click(object sender, EventArgs e)
        {
            string str = textBox4.Text;
            Byte[] buffer = System.Text.Encoding.UTF8.GetBytes(str);
            socketsend.Send(buffer);
        }

2.服务器”发送“

        /// <summary>
        /// 发送数据
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button2_Click(object sender, EventArgs e)
        {
            string str = textBox3.Text;
            byte[] buffer = Encoding.UTF8.GetBytes(str);
            dicSocket[comboBox1.SelectedItem.ToString()].Send(buffer);
            //socketsend.Send(buffer);
        }

四、常见问题点

1、线程中不能操作界面控件


        /// <summary>
        /// 将检查线程调用界面控件设置为false
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Form1_Load(object sender, EventArgs e)
        {
            Control.CheckForIllegalCrossThreadCalls = false;
        }

2、可能出错的地方加上try{}catch{}

3、断开连接后会一直接收长度为0的数据,需要判断长度为0时跳出接收数据的循环

4、连接/接收数据时处于while循环中,需要将连接的代码放在后台线程中,否则容易出现卡界面的情况

最后

以上就是奋斗白云为你收集整理的C#实现客户端与服务器的TCP通讯前言一、客户端与服务器界面二、客户端与服务器的连接、接收数据三、客户端与服务器发送数据四、常见问题点的全部内容,希望文章能够帮你解决C#实现客户端与服务器的TCP通讯前言一、客户端与服务器界面二、客户端与服务器的连接、接收数据三、客户端与服务器发送数据四、常见问题点所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(62)

评论列表共有 0 条评论

立即
投稿
返回
顶部