网络(TCP)

来源:互联网 发布:好莱坞黑帮电影知乎 编辑:程序博客网 时间:2024/06/06 03:14

服务器

using System;using System.Net;using System.Net.Sockets;using System.Threading;using System.Text;using System.Net.NetworkInformation;using System.Collections.Generic;namespace TCPServer{    class Program    {        static void Main(string[] args)        {            Server server = new Server();            server.ServerSetUp();            while (true)            {                string str = Console.ReadLine();                server.SendALL(str);            }        }    }    public class Server    {        //配置相关        private string _ip ="192.168.30.28";        private int _port = 10000;        //服务器套接字        private Socket _server;        //接收客户端连接的线程,因为Accept是一个阻塞现成的方法,而且此方法还需要循环执行        private Thread _acceptServerClientThread;        //所有已经连接的客户端        private List<Socket> _clientList = new List<Socket>();        //启动服务器=建立流式套接字+配置本地地址        public void ServerSetUp()        {            try            {                //建立套接字,                _server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);                //配置本地地址                EndPoint endpooint = new IPEndPoint(IPAddress.Parse(_ip), _port);                _server.Bind(endpooint);                //监听和接受客户端请求                _server.Listen(30);                //开启一个接受连接的线程                _acceptServerClientThread = new Thread(AcceptClientConnect);                _acceptServerClientThread.Start();                Console.WriteLine("{0}:{1} ServerSetUp...", _ip, _port);            }            catch (Exception e)            {                Console.WriteLine(e.Message);            }        }        //接受客户端连接        public void AcceptClientConnect()        {             while (true)             {                try                {                    //接受客户端连接                    Socket clientSocket = _server.Accept();                    //维护一个客户端在线列表                    _clientList.Add(clientSocket);                    //获取客户端的网络标识                    IPEndPoint clientEndPoint = clientSocket.RemoteEndPoint as IPEndPoint;                    //输出一下地址和端口                    Console.WriteLine("{0}:{1} Connect....", clientEndPoint.Address.ToString(), clientEndPoint.Port);                    //接受客户端消息的线程                     Thread acceptClientMsg = new Thread(AcceptMsg);                    acceptClientMsg.Start(clientSocket);                }                catch (Exception e)                {                    Console.WriteLine(e.Message);                }            }        }        //接收消息        public void AcceptMsg(object obj)        {            //强转为Socket类型            Socket client = obj as Socket;            //字节数组 接受传来的的信息 1024*64            byte[] buffer = new byte[client.ReceiveBufferSize];            //获取客户端的网络地址标识            IPEndPoint clientEndPoint = client.RemoteEndPoint as IPEndPoint;            try            {                while (true)                {                    //接收消息存储                    int len = client.Receive(buffer);                    string str = Encoding.UTF8.GetString(buffer, 0, len);                    Console.WriteLine("{0}:{1}:{2}", clientEndPoint.Address, _port, str);                }            }            catch (Exception e)            {                Console.WriteLine(e.Message);                _clientList.Remove(client);            }        }        //给某个客户端发消息        public void Send(string str,Socket client)        {            try            {                //string=>byte[]                byte[] strBytes = Encoding.UTF8.GetBytes(str);                client.Send(strBytes);            }            catch (Exception e)            {                Console.WriteLine(e.Message);            }        }        //发给所有人        public void SendALL(string str)        {            for (int i = 0; i < _clientList.Count; i++)            {                Send(str, _clientList[i]);            }        }        //获取IP地址        public IPAddress GetTpv4(NetworkInterfaceType type)        {           NetworkInterface[] networkinterface=  NetworkInterface.GetAllNetworkInterfaces();            for (int i = 0; i < networkinterface.Length; i++)            {                Console.WriteLine(networkinterface[i].Name + "------" + networkinterface[i].ToString());                //无线网操作                if (type == networkinterface[i].NetworkInterfaceType && networkinterface[i].OperationalStatus == OperationalStatus.Up)                {                    UnicastIPAddressInformationCollection ips = networkinterface[i].GetIPProperties().UnicastAddresses;                    foreach (UnicastIPAddressInformation item in ips)                    {                        if (item.Address.AddressFamily == AddressFamily.InterNetwork)                        {                            return item.Address;                        }                    }                }            }            return null;        }        //关闭套接字        public void Close()        {            if (_clientList.Count > 0)            {                for (int i = 0; i < _clientList.Count; i++)                {                    _clientList[i].Close();                }                _clientList.Clear();                _server.Close();                _acceptServerClientThread.Abort();            }        }    }}

客户端

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Net;using System.Net.Sockets;using System.Threading;namespace TCPClient{    class Program    {        static void Main(string[] args)        {            Client client = new Client();            client.ClientConnect();            while (true)            {                string str = Console.ReadLine();                client.Send(str);            }        }    }    public class Client    {        private Socket clientsocket;        private Thread _acceptServerMsg;        public void ClientConnect()        {            try            {                clientsocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);                clientsocket.Connect("192.168.30.28", 10000);                //接受消息的 线程                _acceptServerMsg = new Thread(AcceptServerMsg);                _acceptServerMsg.Start();            }            catch (Exception e )            {                Console.WriteLine(e.Message);            }        }        public void AcceptServerMsg()        {            byte[] buffer = new byte[1024 * 64];            while (true)            {                try                {                    int len = clientsocket.Receive(buffer);                    string str = Encoding.UTF8.GetString(buffer,0,len);                    Console.WriteLine("Reveice Msg From Server:{0}",str);                }                catch (Exception e)                {                    Console.WriteLine(e.Message);                }            }        }        //发送消息        public void Send( string str)        {            try            {                //string=>byte[]                byte[] strBytes = Encoding.UTF8.GetBytes(str);                clientsocket.Send(strBytes);            }            catch (Exception e)            {                Console.WriteLine(e.Message);            }        }        //关闭套接字        public void Close()        {            if (clientsocket.Connected)            {                clientsocket.Close();            }            _acceptServerMsg.Abort();        }    }}