1、对于TCP协议下的Socket通信并不难,只要静下心来去理解服务端和客户端的连接机制即可,最重要的是沉下心体会

客户端相对简单,写好Receive()和Send()方法即可:

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 Socket客户端
{
    public partial class Client : Form
    {
        public Client()
        {
            InitializeComponent();
        }
        Socket socket;
        private void Client_Load(object sender, EventArgs e)
        {
            Control.CheckForIllegalCrossThreadCalls = false;
        }
        private void btnConnect_Click(object sender, EventArgs e)
        {
            socket=new Socket(AddressFamily.InterNetwork,SocketType.Stream, ProtocolType.Tcp);
            socket.Connect(new IPEndPoint(IPAddress.Parse("192.168.1.3"), 80));
            AppendMsg("连接成功");
            //接收消息,使用线程池
            ThreadPool.UnsafeQueueUserWorkItem(new WaitCallback(ReceiveMsg), socket);

        }

        public void ReceiveMsg(object o)
        {
            Socket serverSocket = o as Socket;
            byte[] data = new byte[1024 * 1024];
            while (true)
            {
                int len = serverSocket.Receive(data,0,data.Length,SocketFlags.None);    //接收服务端消息
                string str = Encoding.UTF8.GetString(data,0,len);
                AppendMsg(str);
            }
        }

        public void AppendMsg(string str)
        {
            txtMsg.AppendText(">>>" + str + "\r\n");
        }

        private void btnSend_Click(object sender, EventArgs e)
        {
            if (socket.Connected)
            {
                byte[] data = Encoding.UTF8.GetBytes(this.txtSend.Text);
                socket.Send(data, 0, data.Length,SocketFlags.None);             //发送消息
                AppendMsg(txtSend.Text);
                txtSend.Text = "";
                
            }
        }

        private void txtSend_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == '\r')
            {
                btnSend_Click(sender, e);
                e.Handled= true;
            }
        }
    }
}

 

2、IP地址可以设置自动获取

 

 

 3、附上原始版代码

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
            {

            }
            
        }
        /// <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
            {

            }


        }

        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);
            }
        }

    }


}

 

posted on 2023-02-28 14:17  漂乎兮乎  阅读(111)  评论(0)    收藏  举报