A19_Soket编程TCP协议通讯

来源:互联网 发布:算法工程师 年薪400 编辑:程序博客网 时间:2024/06/07 22:00


/* * Socket(套接字)编程 * 设备之间的识别依靠IP地址 * 设备中进程之间的是别的靠端口号 * TCP/IP协议 用于距离较远的,对精准度要求高的信息传输 * UDP协议用于距离较近,对信息精准度要求较低但要求速度快的信息传输 *  *  * **/using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Threading;using System.Net;using System.Net.Sockets;namespace A18_SocketProgram{    class Server    {        private Socket _SockServer;                    //服务器监听套接字        private bool _IsListenContecion = true;         //是否在监听(目的是方便退出)        public Server()        {            Console.WriteLine("---------------服务端启动-----------------");            //定义网络终结点(封装IP与端口)            IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"),1000);            //实例化套接字            _SockServer = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);            //服务器端绑定地址            _SockServer.Bind(endPoint);                        //开始监听            //.......            _SockServer.Listen(10); //10表示服务器监听队列最大长度                        try            {                while (_IsListenContecion)                {                    //Accept()接收客户端的链接,这个方法会阻断当前线程的运行                    Socket sockMsgServer = _SockServer.Accept();                    Console.WriteLine("有一个客户端连接");                    //开启后台线程进行与客户端的会话                    Thread thClientMsg = new Thread(ClientMsg);                    thClientMsg.IsBackground = true; // 定义会话线程为后台线程。                    thClientMsg.Name = "thClientMsg";                    thClientMsg.Start(sockMsgServer);                }            }            catch (Exception)            {            }        }        //服务器与客户端的通讯后台线程        [Obsolete("这个方法有瑕疵")]        private void ClientMsgOld(object sockMsg)        {            Socket socketMsg = sockMsg as Socket; //通讯Socket            //准备一个“数据缓存”            while (true)            {                byte[] msgArray = new byte[1024 * 1024]; //1M空间                //接收客户端发来的数据,返回真实的长度                int trueClinetMsgLength = socketMsg.Receive(msgArray);                //byte数组转String                string strMsg = Encoding.UTF8.GetString(msgArray, 0, trueClinetMsgLength);                //显示客户端发来的数据                Console.WriteLine("客户端发来的数据:" + strMsg);            }        }        //服务器与客户端的通讯后台线程        private void ClientMsg(object sockMsg)        {            Socket socketMsg = sockMsg as Socket; //通讯Socket            //准备一个“数据缓存”            while (true)            {                byte[] msgArray = new byte[1024 * 1024]; //1M空间                //接收客户端发来的数据,返回真实的长度                int trueClinetMsgLength = socketMsg.Receive(msgArray);                //byte数组转String                string strMsg = Encoding.UTF8.GetString(msgArray,0,trueClinetMsgLength);                //接到断开连接的信息                if (strMsg == "gm_exit")                {                    Console.WriteLine("客户端断开连接");                    break;                }                //显示客户端发来的数据                Console.WriteLine("客户端发来的数据:" + strMsg);            }        }        static void Main(string[] args)        {            Server obj = new Server();        }    }}


using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Threading;using System.Net;using System.Net.Sockets;namespace A19_SocketdProgram_Client{    class Client    {        private Socket _SockClient;         //客户端通讯套接字        private IPEndPoint serverEndPoint;  //连接到的服务器IP与端口信息        public Client()        {            //通讯地址端口号            serverEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 1000);            //建立客户端的Sockte            _SockClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);            try            {                _SockClient.Connect(serverEndPoint);            }            catch (Exception)            {            }            Console.WriteLine("连接服务器成功!!");        }        //向服务器发送信息        [Obsolete("这个方法有瑕疵")]        public void SendMsgOld()        {            while (true)            {                //输入信息                string strMsg = Console.ReadLine();                //退出                if (strMsg == "gm_exit")                {                    break;                }                //字节转换                Byte[] byteArray = Encoding.UTF8.GetBytes(strMsg);                //发送数据                _SockClient.Send(byteArray);                Console.WriteLine("我: " + strMsg);            }            //关闭连接            _SockClient.Shutdown(SocketShutdown.Both);            //清理连接的资源            _SockClient.Close();        }        //向服务器发送信息        public void SendMsg()        {            while (true)            {                //输入信息                string strMsg = Console.ReadLine();                //字节转换                Byte[] byteArray = Encoding.UTF8.GetBytes(strMsg);                //发送数据                _SockClient.Send(byteArray);                //退出                if (strMsg == "gm_exit")                {                    break;                }                Console.WriteLine("我: " + strMsg);            }            //关闭连接            _SockClient.Shutdown(SocketShutdown.Both);            //清理连接的资源            _SockClient.Close();        }        static void Main(string[] args)        {            Client obj = new Client();            obj.SendMsg();            //obj.SendMsg();        }    }}


Server类和Client类分别在不同的启动项中



原创粉丝点击