⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 form1.cs

📁 用C#编的基于socket的基础通信程序
💻 CS
字号:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Threading;


namespace LsxwClient
{
    public partial class form : Form
    {
        Socket ClientSocket;
        //connectReset 连接服务器控制
        private static ManualResetEvent connectReset = new ManualResetEvent(false);
        //sendReset 向服务器发送数据控制
        private static ManualResetEvent sendReset = new ManualResetEvent(false);
        string ip = "10.14.110.229";
        IPEndPoint myServer;

        //private bool conn = false;
        //用于界面文本框显示的委托
        delegate void invokeclientReceive(string netMessage);
        delegate void invokeclientInfo(string netMessage);
        delegate void invokeclientSend();


        public form()
        {
            InitializeComponent();
            //this.Closing += new CancelEventHandler(Form1_closing);
        }

        private void btnSend_Click(object sender, EventArgs e)
        {
            //conn = false;
            if (clientSend.Text == "")
            {
               MessageBox.Show("请输入要发送的内容!", "提示", MessageBoxButtons.OK);
            }
            else
            {
            try
            {
                //初始化服务器地址和端口
                IPAddress ServerIP = IPAddress.Parse(ip);
                int ServerPort = Int32.Parse("5257");

                 myServer= new IPEndPoint(ServerIP, ServerPort);

                //新建客户端套接字实例
                ClientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            }
            catch (Exception ee)
            { MessageBox.Show(ee.ToString()); }
            //连接控制开启,开始异步连接,阻塞当前线程
            try
            {
            connectReset.Reset();
            ClientSocket.BeginConnect(myServer, new AsyncCallback(ConnectCallback), ClientSocket);
            connectReset.WaitOne();
            }
            catch (Exception ee)
            { 
                MessageBox.Show(ee.ToString());
            }
            }
        }

       //客户端异步连接回调处理
        private void ConnectCallback(IAsyncResult ar)
        {
            try
            {
            //获取状态,连接完毕
            Socket Client = (Socket)ar.AsyncState;
            Client.EndConnect(ar);

            //conn = true;
            //新开客户端发送数据线程
            Thread SendThread = new Thread(new ThreadStart(Client_Send));
            SendThread.Start();
            //连接控制关闭
            connectReset.Set();

            Invoke(new invokeclientInfo(InfoShow), "与服务器连接成功!\r\n");
            }
            catch (Exception ee)
            { MessageBox.Show(ee.ToString()); }

            
        }

        private void Client_Send()
        {
          
                string cs = clientSend.Text.ToString();
                Invoke(new invokeclientSend(SendClear));
                try
                {
                    //异步发送数据
                    byte[] BytesSendData = System.Text.Encoding.BigEndianUnicode.GetBytes(cs );
                    ClientSocket.BeginSend(BytesSendData, 0, BytesSendData.Length, 0, new AsyncCallback(ClientSendCallback), ClientSocket);
                }
                catch (Exception ee)
                { MessageBox.Show(ee.ToString()); }

            

        }

        //客户端异步发送数据回调处理
        private void ClientSendCallback(IAsyncResult ar)
        {
            try
            {
            //获取状态,结束异步发送
            ClientSocket = (Socket)ar.AsyncState;
            int ClientSendNumber = ClientSocket.EndSend(ar);
            //新开客户端异步接受数据线程
            Thread ReceiveThread = new Thread(new ThreadStart(Client_Receive));
            ReceiveThread.Start();
            //发送控制关闭
            sendReset.Set();

            }
            catch (Exception ee)
            { MessageBox.Show(ee.ToString()); }
            
        }


        private void Client_Receive()
        {
            try
            {
            StateObject clientState = new StateObject();
            clientState.workSocket = ClientSocket;
            //客户端异步接受数据
            ClientSocket.BeginReceive(clientState.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ClientReadCallback), clientState);
            }
            catch (Exception ee)
            { MessageBox.Show(ee.ToString()); }
        }
        //异步接受数据回调处理
        private void ClientReadCallback(IAsyncResult ar)
        {
            
            try
            {
                StateObject clientState = (StateObject)ar.AsyncState; 

                Socket ServerTemp=clientState.workSocket;


                int ClientReadNumber = ServerTemp.EndReceive(ar);

                clientState.sb.Append(System.Text.Encoding.BigEndianUnicode.GetString(clientState.buffer, 0, ClientReadNumber));

                string t = clientState.sb.ToString();
                clientState.sb.Remove(0,t.Length);
                //MessageBox.Show(t);
               //进行显示接受到的信息                               
                //clientReceive.AppendText(t + "\r\n");
                Invoke(new invokeclientReceive(ReceiveShow), t);
                //如果客户端接收到的数据与服务器发送的数据相同,则表示客户端已发送数据成功,可关闭套接字
                if (t == "ok!")
                {
                    ClientSocket.Close();
                    Invoke(new invokeclientInfo(InfoShow), "发送完毕,客户端关闭!");
                }
                else 
                {
                    MessageBox.Show(t, "错误", MessageBoxButtons.OK);
                    //ServerTemp.BeginReceive(clientState.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ClientReadCallback), clientState);
                }
            }
             
            catch (Exception ee)
            { MessageBox.Show(ee.ToString()); }
                       

        }

        private void ReceiveShow(string netMessage)
        {
            clientReceive.AppendText(netMessage + "\r\n");
        }

        private void InfoShow(string netMessage)
        {
            clientInfo.AppendText(netMessage + "\r\n");
        }

        private void SendClear()
        {
            clientSend.Clear();
        }

        //private void Form1_closing(object sender, System.ComponentModel.CancelEventArgs e)
        //{
        //    DialogResult result = MessageBox.Show("确定退出本系统?", "确认退出系统", MessageBoxButtons.OKCancel);
        //    if (result == DialogResult.OK)
        //    {
         //       if (conn == true)
         //       {
                    
         //           ClientSocket.Close();
         //       }
        //        Application.Exit();
        //    }
        //    else
        //    {
        //        e.Cancel = true;
        //    }

        //}
    }

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -