【C#】-局域网下用Socket实现通信

前言

听起局域网下聊天是不是很难,很高大上的样子,怎么样让两台电脑,在同一局域网下实现聊天呢,先说一下思路吧,一会直接上代码。

1. 首先我们先要创建一个服务器,也就是说两台电脑有一台要当着服务器,供客户端链接。
2. 服务器创建好,服务器还要时时刻刻的接受客户端的链接。
3. 客户端连接上之后,服务器还要时时刻刻接受客户端发来的信息。
4. 客户端发送消息,当然要以字节的形式传给服务器,这中间就会有一个转化的过程。
5. 当然服务器和客户端都要有接受发送消息
6. 最后把客户端发来消息追加上去

思路就是这个样子听起来好像还可以哈!

建立服务器

            //Socket服务器端的逻辑
            //1、创建Socket对象
            //第一个参数设置网络寻址的协议   第二个参数设置数据传输的方式  第三个参数数据设置通信的协议
            Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
			
			//追加到文本
            this.txtLog.Text = "创建服务器端Socket对象\r\n" + this.txtLog.Text;

            //2、绑定IP和端口
            IPAddress ip = IPAddress.Parse("192.168.20.240");
            IPEndPoint ipEndpoint = new IPEndPoint(Administrator.frmAdministratorMain.ip, int.Parse("51000"));
            Administrator.frmAdministratorMain.serverSocket.Bind(Administrator.frmAdministratorMain.ipEndpoint);

            serverSocket.Bind(ipEndpoint);

            3、开启侦听
            Administrator.frmAdministratorMain.serverSocket.Listen(10);  //等待链接的队列

            4、开始接受客户端的链接
            this.txtLog.Text = "开始接受客户端链接\r\n" + this.txtLog.Text;

            ThreadPool.QueueUserWorkItem(new WaitCallback(this.StatAcceptClient), Administrator.frmAdministratorMain.serverSocket);
        public void StatAcceptClient(object state)
        {
            var serverSocket = (Socket)state;
            this.AppendTextToTextlog("服务器端开始接受客户端的链接");

            while (true)
            {
                Socket proxSocket = serverSocket.Accept();

                this.txtLog.Text = string.Format("一个客户端:{0}链接上\r\n{1}", proxSocket.RemoteEndPoint.ToString(), txtLog.Text);

                clientProxSocketList.Add(proxSocket);

                //服务器端接受客户端的消息

                ThreadPool.QueueUserWorkItem(new WaitCallback(this.RecieveData), proxSocket);
            }
        }
        private void RecieveData(object obj)
        {
            var proxSocket = (Socket)obj;
            byte[] data = new byte[1024 * 1024];
            //方法的返回值代表实际上接受的数据的长度(字节数)
            while (true)
            {
                int realLen = 0;
                try
                {
                    realLen = proxSocket.Receive(data, 0, data.Length, SocketFlags.None);
                }
                catch (Exception ex)
                {

                    this.txtLog.Text = string.Format("客户端:{0}非正常退出", proxSocket.RemoteEndPoint.ToString());

                    StopConnetct(proxSocket);
                }

                if (realLen == 0)
                {
                    this.txtLog.Text = string.Format("客户端:{0}正常退出", proxSocket.RemoteEndPoint.ToString());

                    //对方退出
                    //proxSocket.Shutdown(SocketShutdown.Both);
                    //proxSocket.Close();
                    //clientProxSocketList.Remove(proxSocket);

                    StopConnetct(proxSocket);
                    return;
                }
                string strClientMsg = Encoding.Default.GetString(data, 0, realLen);

                AppendTextToTextlog(string.Format("接受到客户端:{0}的消息:{1}\r\n{2}", proxSocket.RemoteEndPoint.ToString(), strClientMsg, txtLog.Text));
            }
        }
    private void StopConnetct(Socket proxSocket)
        {
            try
            {
                if (proxSocket.Connected)
                {
                    proxSocket.Shutdown(SocketShutdown.Both);
                    proxSocket.Close(100);
                }
            }
            catch (Exception ex)
            {

            }
        }

客户端连接

  //客户端裂解服务器端
            //1、创建Socket对象
            Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            ClientSocket = socket;

            //2、连接服务器端
            try
            {
                socket.Connect(IPAddress.Parse("192.168.20.240"), int.Parse("50000"));
            }
            catch (Exception ex)
            {
                return;
            }

            //3、发送消息,接受消息
            Thread thread = new Thread(new ParameterizedThreadStart(RecieveData));
            thread.IsBackground = true;
            thread.Start(ClientSocket);
  private void RecieveData(object obj)
        {
            var proxSocket = (Socket)obj;
            byte[] data = new byte[1024 * 1024];
            //方法的返回值代表实际上接受的数据的长度(字节数)
            while (true)
            {
                int realLen = 0;
                try
                {
                    realLen = proxSocket.Receive(data, 0, data.Length, SocketFlags.None);
                }
                catch (Exception ex)
                {

                    this.txtLog.Text = string.Format("服务器端:{0}非正常退出", proxSocket.RemoteEndPoint.ToString());
                    StopContnet(); //停止连接
                }

                if (realLen == 0)
                {
                    this.txtLog.Text = string.Format("服务器端:{0}正常退出", proxSocket.RemoteEndPoint.ToString());

                    StopContnet(); //停止连接
                    return;
                }
            }
        public string ProcessRecieveString(byte[] data,int reallen)
        {
            string str = Encoding.Default.GetString(data, 1, reallen-1);
            return str;
        }
        private void StopContnet()
        {
            try
            {
                if (ClientSocket.Connected)
                {
                    ClientSocket.Shutdown(SocketShutdown.Both);
                    ClientSocket.Close(100);
                }
            }
            catch (Exception ex)
            {

            }
        }

总结

刚开始接触不太好搞懂,然后出错也解决不了,这种情况可以去上网百度深入了解Socket怎么实现双向的通信连接数据的交换,小生是通过一遍一遍的走代码,通过看里面的参数变化,弄懂了点皮毛!

猜你喜欢

转载自blog.csdn.net/ywq1016243402/article/details/85951367