Crazy Learning for Day 19

来源:互联网 发布:瞻博网络工厂 编辑:程序博客网 时间:2024/05/18 19:19

1、简易客户端和服务端的聊天

  • 实现客户端和服务端的消息请求和收发
  • 实现多台客户端的连接,消息的异步发送
  • 实现客户端的正常退出和异常退出检测

服务器端

using System;using System.Collections.Generic;using System.Linq;using System.Net;using System.Net.Sockets;using System.Text;using System.Threading.Tasks;namespace TCPServer{    class Program    {        static void Main(string[] args)        {            StartServerASync();            Console.ReadKey();        }        //同步发送消息,只能一条一条发送,需要采用异步的方式,持续不断的收发消息        static void StartServerASync()        {            Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);            IPAddress ipAddress = IPAddress.Parse("192.168.0.124");            IPEndPoint ipEndPoint = new IPEndPoint(ipAddress, 88);            serverSocket.Bind(ipEndPoint);//绑定ip和端口号            serverSocket.Listen(0);//开始监听端口号            //Socket clientSocket = serverSocket.Accept();//接收一个客户端连接            //为了实现和多个客户端的连接,接收客户端的连接也需要使用异步的方式            serverSocket.BeginAccept(AcceptCallBack, serverSocket);        }        static void AcceptCallBack(IAsyncResult ar)        {            Socket serverSocket = ar.AsyncState as Socket;            Socket clientSocket = serverSocket.EndAccept(ar);            string msg = "Hello Client! 你好...";            byte[] data = System.Text.Encoding.UTF8.GetBytes(msg);            clientSocket.Send(data);            clientSocket.BeginReceive(dataBuffer, 0, 1024, SocketFlags.None, ReceiveCallBack, clientSocket);            serverSocket.BeginAccept(AcceptCallBack, serverSocket);        }        static byte[] dataBuffer = new byte[1024];        static void ReceiveCallBack(IAsyncResult ar)        {            Socket clientSocket = null;            try            {                clientSocket = ar.AsyncState as Socket;                int count = clientSocket.EndReceive(ar);                if (count == 0)                {                    clientSocket.Close();                    return;                }                string msg = Encoding.UTF8.GetString(dataBuffer, 0, count);                Console.WriteLine("从客户端接收到数据:" + msg);                clientSocket.BeginReceive(dataBuffer, 0, 1024, SocketFlags.None, ReceiveCallBack, clientSocket);//回调            }            catch (Exception e)            {                Console.WriteLine(e);                if (clientSocket != null)                {                    clientSocket.Close();                }            }        }    }}

客户端

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Net.Sockets;using System.Net;namespace TCPClient{    class Program    {        static void Main(string[] args)        {            Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);            clientSocket.Connect(new IPEndPoint(IPAddress.Parse("192.168.0.124"), 88));            //客户端接收消息,收发顺序与服务器端相反            byte[] data = new byte[1024];            int count = clientSocket.Receive(data);//Receive执行后才继续执行下面代码            string msg = Encoding.UTF8.GetString(data, 0, count);            Console.Write(msg);            while (true)            {                string s = Console.ReadLine();                //Console.Write(s);                if (s == "exit")                {                    clientSocket.Close();return;                }                clientSocket.Send(Encoding.UTF8.GetBytes(s));            }            Console.ReadKey();            clientSocket.Close();        }    }}

客户端和服务端之间数据的传输以数据包的形式,当短时间内每个包都很小的时候,会采用粘包的方式传输(合并再发送);当包太大的时候,会采用分包的方式进行传输。