创建Socket-客户端

网上搜的资料,在这里简单记录一下

上一章记录了Socket在服务器端如何使用,这里记录在客户端如何使用

用途:Socket可以实现软件与软件之间的通信

流程:创建Socket——创建网络端口——将Socket与端口绑定——连线服务器

创建Socket

//1.0 实例化套接字(IP4寻址地址,流式传输,TCP协议)
            _socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

创建网络端口

//2.0 创建IP对象
            IPAddress address = IPAddress.Parse(_ip);
            //3.0 创建网络端口包括ip和端口
            IPEndPoint endPoint = new IPEndPoint(address, _port);

连线服务器

            //4.0 建立连接
            _socket.Connect(endPoint);

在此之后,便可以使用该Socket实例的.Send和.Receive实现服务器端的数据的发送与接收。与服务器端不同的是连接完成后不用生成一个专门用于通信的Socket

 /// <summary>
        /// 向服务器发消息
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void SendMsg_Click(object sender, EventArgs e)
        {
            byte[] buffer = new byte[1024 * 1024 * 2];
            buffer =Encoding.UTF8.GetBytes(textBox4.Text);
            _socket.Send(buffer);
        }

与发送不同接收需要实时的接收数据,建议创建一个新线程不停的接收客户端发送的数据

void Recive(object o)
        {
            Socket SeciveRecive = o as Socket;
            byte[] buffer = new byte[1024 * 1024 * 2];
            int r;
            string str;
            while (true)
            {
                r = SeciveRecive.Receive(buffer);
                if (r == 0)
                {
                    break;
                }
                str = Encoding.UTF8.GetString(buffer, 0, r);
                ShowMsg(SeciveRecive.RemoteEndPoint.ToString() + ":" + str);
            }
        }

 

总结:大致可以这样写

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        string _ip = "192.168.1.100";
        int _port = 50000;
        Socket _socket = null;
        

        /// <summary>
        /// 连接服务器
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
            //1.0 实例化套接字(IP4寻址地址,流式传输,TCP协议)
            _socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            //2.0 创建IP对象
            IPAddress address = IPAddress.Parse(_ip);
            //3.0 创建网络端口包括ip和端口
            IPEndPoint endPoint = new IPEndPoint(address, _port);
            //4.0 建立连接
            _socket.Connect(endPoint);
            ShowMsg("连接成功");
            //5.0一直监听服务器发来的消息
            Thread th = new Thread(Recive);
            th.IsBackground = true;
            th.Start(_socket);
        }

        /// <summary>
        /// 接收客户端发送的消息
        /// </summary>
        /// <param name="o"></param>
        void Recive(object o)
        {
            Socket SeciveRecive = o as Socket;
            byte[] buffer = new byte[1024 * 1024 * 2];
            int r;
            string str;
            while (true)
            {
                r = SeciveRecive.Receive(buffer);
                if (r == 0)
                {
                    break;
                }
                str = Encoding.UTF8.GetString(buffer, 0, r);
                ShowMsg(SeciveRecive.RemoteEndPoint.ToString() + ":" + str);
            }
        }



        void ShowMsg(string str)
        {
            textBox3.AppendText(str + "\r\n");
        }

        /// <summary>
        /// 向服务器发消息
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void SendMsg_Click(object sender, EventArgs e)
        {
            byte[] buffer = new byte[1024 * 1024 * 2];
            buffer =Encoding.UTF8.GetBytes(textBox4.Text);
            _socket.Send(buffer);
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            Control.CheckForIllegalCrossThreadCalls = false;
        }
    }

 

posted @ 2023-02-20 09:17  张翔清  阅读(117)  评论(0)    收藏  举报