c#Socket通信

网络通信的基本知识:

首先应该确定IP地址和端口号,端口号为了确定计算机的哪个进程,比如同一主机是微信还是qq通信

要进行通信首先应该确定一种协议,通常用TCP可靠和UDP不可靠协议,当然带来的速度也会不同,多数游戏中采用TCP协议。

面向连接套接字通信步骤:

服务端:

先申请一个Socket,绑定一个IP地址和端口,开始接听,等待接受连接。

客户端:

申请一个Socket,连接服务器且指定IP和端口号

值得注意的是,服务端有两个Socket,一个用于监听,另一个和客户端进行通信。

服务器端代码:

using System.Net.Sockets;
using System.Net;
using System.Threading;

namespace Socket套接字
{
    class SocketT
    {
        private Socket _ServerSocket;                       //服务器监听套接字
        private bool _IsListionContect;                     //是否在监听

        public SocketT()
        {
            //定义网络终节点(封装IP和端口)
            IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"),1000);
            //实例化套接字
            _ServerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            //服务端绑定地址
            _ServerSocket.Bind(endPoint);

            //开始监听
            _ServerSocket.Listen(10);                       //监听的最大长度
            Console.WriteLine("服务器已经启动...");

            try
            {
                while (_IsListionContect)
                {
                    //Accept()方法接受客户端的连接,这个方法会阻断当前线程的运行
                    Socket sockMsgSever = _ServerSocket.Accept();
                    Console.WriteLine("有一个客户端连接...");

                    //开启后台线程,进行客户端会话
                    Thread thClientMsg = new Thread(ClientMsg);
                    thClientMsg.IsBackground=true;          //设置为后台线程
                    thClientMsg.Name = "thClientMsg";
                    thClientMsg.Start(sockMsgSever);

                }

            }
            catch (Exception)
            {
                
                throw;
            }
        }

        /// <summary>
        /// 服务器端和客户端通信的后天线程
        /// </summary>
        /// <param name="?"></param>
        private void ClientMsg(object sokMsg)
        {
            Socket socketMsg = sokMsg as Socket; //将object类型转换为Socket通信

            while (true)
            {
                //准备一个数据缓存
                byte[] msyArray = new byte[0124 * 0124];
                //接受客户端发来的请求,返回真实的数据长度
                int TrueClientMsgLenth = socketMsg.Receive(msyArray);
                //byte数组转字符串
                string strMsg = Encoding.UTF8.GetString(msyArray, 0, TrueClientMsgLenth);
                //显示客户端数据
                Console.WriteLine("客户端数据:"+strMsg);
            }
        }


        static void Main(string[] args)
        {
            SocketT obj = new SocketT();
        }
    }
}

 客户端:

using System.Threading;
using System.Net;
using System.Net.Sockets;

namespace Socket套接字_客户端
{
    class Client
    {
        private Socket _ClientSocket;                       //客户端通讯套接字
        private IPEndPoint SeverEndPoint;                   //连接到服务器端IP和端口

        public Client()
        {
            //服务器通信地址
            SeverEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 1000);
            //建立客户端Socket
            _ClientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            try
            {
                _ClientSocket.Connect(SeverEndPoint);
            }
            catch (Exception)
            {
            }
            Console.WriteLine("连接服务器端成功!");
        }

        //连接服务器
        public void SendMsg()
        {
            while (true)
            {
                //输入信息
                string strMsg = Console.ReadLine();
                //退出
                if (strMsg == "exit")
                {
                    break;
                }

                //字节转换
                Byte[] byeArray = Encoding.UTF8.GetBytes(strMsg);
                //发送数据
                _ClientSocket.Send(byeArray);
                Console.WriteLine("我:" + strMsg);
            }
            //关闭连接
            _ClientSocket.Shutdown(SocketShutdown.Both);
            //清理连接资源
            _ClientSocket.Close();
        }

        static void Main(string[] args)
        {
            Client obj = new Client();
            obj.SendMsg();
        }
    }
}
原文地址:https://www.cnblogs.com/Optimism/p/10512903.html