用c#suppersocket实现简易的服务端与客户端通讯

最终实现的效果:
在这里插入图片描述
项目大体结构
在这里插入图片描述
服务端:
设计思路:
1、创建一个监听连接的serverSocket对象
2.用指定的端口号和服务器的ip建立一个EndPoint对像;
3.将EndPoint对象绑定到serverSocket对象上
4.用serverSocket.Listen()方法开始监听
5.接收到客户端的连接,用serverSocket.Accpet方法创建一个新的socket对像用于和客户端进行通信的;
6.:通信结束后一定先关闭socket;监听线程关闭,接受信息线程关闭
在这里插入图片描述

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

namespace MyServer
{
    public partial class Server : Form
    {
        //定义Socket对象
        Socket serverSocket;
        //定义监听线程
        Thread listenThread;
        //定义接受客户端数据线程
        Thread threadReceive;
        //定义双方通信
        Socket socket;
        String str;
        public Server()
        {
            InitializeComponent();
        }
        //开始监听按钮
        private void buttonServer_Click(object sender, EventArgs e)
        {
            IPAddress ip = IPAddress.Parse(this.textIp.Text.Trim());
            serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            try
            {
                //绑定IP和端口
                serverSocket.Bind(new IPEndPoint(ip, Convert.ToInt32(this.textPortBox.Text.Trim())));
                //设置最多10个连接请求
                serverSocket.Listen(10);
                //开启线程循环监听
                listenThread = new Thread(ListenClientConnect);
                listenThread.Start();
                this.startButton.Enabled = false;
            }
            catch { }
        }
        //停止监听按钮
        private void endButton_Click(object sender, EventArgs e)
        {
            //socket关闭
            serverSocket.Close();
            //线程关闭
            listenThread.Abort();
            threadReceive.Abort();
        }
        //监听
        private void ListenClientConnect()
        {
            while (true)
            {
                //监听到客户端的链接,获取双方通信的socket
                socket = serverSocket.Accept();
                //创建线程循环接收客户端发送的请求
                threadReceive = new Thread(Receive);
                //传入双方通信socket
                threadReceive.Start(socket);
            }
        }
        //接收客户端数据
        private void Receive(object socket)
        {
            try
            {
                Socket myClientStocket = (Socket)socket;
                while (true)
                {

                    byte[] buff = new byte[2000];
                    int r = myClientStocket.Receive(buff);
                    str = Encoding.Default.GetString(buff, 0, r);
                    //将客户端发送的消息显示到文本框中
                    this.Invoke(new Action(() => { this.richTextBoxShow.Text = str; }));


                }
            }
            catch
            {

                MessageBox.Show("接收数据失败");
            }

        }
        //发送按钮,发送数据
        private void send_Click(object sender, EventArgs e)
        {
            try
            {
                string strMsg = this.richTextsend.Text.Trim();
                byte[] buffer = new byte[20000];
                buffer = Encoding.Default.GetBytes(strMsg);
                socket.Send(buffer);
            }
            catch
            {
                MessageBox.Show("发送数据失败", "发送数据失败");
            }

        }

}
客户端:
1:建立一个clientSocket对像;
2:用指定的端口号和服务器的ip建立一个EndPoint对像;
3:用clientSocket对像的Connect()方法以上面建立的EndPoint对像做为参数,向服务器发出连接请求;
4:如果连接成功,就用clientSocket对像的Send()方法向服务器发送信息;
5:用clientSocket对像的Receive()方法接受服务器发来的信息 ;

在这里插入图片描述

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

namespace MyClient
{
    public partial class Client : Form
    {
        public Socket serverSocket { get; private set; }
        //定义Socket对象
        Socket clientSocket;
        //创建接收消息的线程
        Thread threadReceive;
        //接收服务端发送的数据
        string str;

        public Client()
        {
            InitializeComponent();
        }

        private void buttonStart_Click(object sender, EventArgs e)
        {
            IPAddress ip = IPAddress.Parse(this.textBoxIp.Text.Trim());
            clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            try
            {
                //连接服务器
                clientSocket.Connect(ip, Convert.ToInt32(this.textBoxPort.Text.Trim()));
                //开启线程不停地接服务器发送的数据
                threadReceive = new Thread(new ThreadStart(Receive));
                //设置该值是否是后台线程
                threadReceive.IsBackground = true;
                threadReceive.Start();
                this.buttonStart.Enabled = false;


            }
            catch
            {
                MessageBox.Show("连接服务端失败,请确认ip和端口是否填写正确", "连接服务端失败");
            }
        }
        //接收客户端数据
        private void Receive()
        {
            try
            {

                while (true)
                {

                    byte[] buff = new byte[2000];
                    int r = clientSocket.Receive(buff);
                    str = Encoding.Default.GetString(buff, 0, r);
                    this.Invoke(new Action(() => { this.richTextShow.Text = str; }));


                }
            }
            catch
            {

                MessageBox.Show("获取服务端参数失败", "获取服务端参数失败");
            }

        }

        private void buttonEnd_Click(object sender, EventArgs e)
        {
            //clientSocket关闭
            clientSocket.Close();
            //线程关闭
            threadReceive.Abort();
        }

}

猜你喜欢

转载自blog.csdn.net/ling_ling1997/article/details/88862190