Socket编程

TCP协议

以下只是进行了一次的收发例子。

客户端和服务器端是两个解决方案。

服务器端
static void main(string[] args){
//1.创建Socket对象
Socket tcpServer=new Socket(AddressFamily.InterNetworl,SocketType.Stream,ProtocolType.Tcp);
 //2.绑定IP和端口号(软件的端口号唯一)
IPAddress ipaddress=new IPAddress(new byte[]{192,168,0,112});
EndPoint point=new EndPoint(ipaddress,7788);
tcpServer.Bind(point);//向操作系统申请一个可用的ip和端口号用来做通信
//3.开始监听(等待客户端连接)
tcpServer.Listen(100);//最大连接数
Socket clientSocket=tcpServer.Accept();//暂停当前线程,直到有一个客户端连接过来,之后进行下面的代码
//使用返回的Socke跟客户端做通信
string message="hello 欢迎你";
byte[] data=Encodeing.UTF8.GetBytes(message);//对字符串做编码,得到一个字符串的字节数组
clientSocket.Send(data):
byte[]data2= new byte[1024];//创建一个字节数组接收客户端发过来的数据
int length=clientSocket.Receive(data2);
string message2=Encoding.UTF8.GetString(data2,0,length);
Console.WriteLine(message2);
}

客户端
static void main(string[] args){
//1.创建Socket对象
Socket tcpClient=new Socket(AddressFamily.InterNetworl,SocketType.Stream,ProtocolType.Tcp);
//2.发起建立连接的请求
IPAddress ipaddress=IPAddress.Parse("192.168.0.112")//可以把一个字符串的ip地址转换成一个ipaddress的对象
EndPoint point=new IPEndPoint(ipaddress,7788);//端口号保持一致
tcpClient.Connect();//通过IP和端口号来定位一个要连接到的服务器端
byte[] data = new byte[1024];
int length=tcpClient.Receive(data);//这里传递一个byte数组,实际上这个data数组用来接收数据
//Length表示返回值接收了多少字节的数据
string message=Encoding.UTF8.GetString(data,0,length);//只把接收到的数据做个转化
Console.WriteLine(message);
//向服务器端发送消息
string message2=Console.ReadLine();//读取用户的输入,把输入的信息发送到服务器端
tcpClient.Send(Encoding.UTF8.GetBytes(message2));//把字符串变为字节。
}

 

 TCP一直收发

Client完成对服务器端的操作 客户端类似

 class Client
    {

        private Socket clientSocket;
        Thread t;
        private byte[] data = new byte[1024];//字节数据容器
        public Client(Socket s)
        {
            clientSocket = s;
            //启动一个线程 处理客户端的数据接收
             t = new Thread(ReceiveMessage);
             t.Start();
        }

        public void ReceiveMessage()
        { 
            //一直接受客户端的数据
            while (true)
            {
                //在接收数据之前 判断一下socket连接是否断开
                if(clientSocket.Poll(10,SelectMode.SelectRead))//第一个参数响应时间,第二个参数选择模式,返回true 则断开连接
                {
                    clientSocket.Close();
                    break;//终止
                }
                int length= clientSocket.Receive(data);
                string message = Encoding.UTF8.GetString(data, 0, length);
                //服务器端接受到数据要把这个数据分发到客户端
                Program.BroadcastMessage(message);
            }
        }
        /// <summary>
        /// 发送消息
        /// </summary>
        /// <param name="message"></param>
        public void SendMessage(string message)
        {
            byte[] data = Encoding.UTF8.GetBytes(message);
            clientSocket.Send(data);
        }

    }
static List<Client> clientlist = new List<Client>(); 
static void Main(string[] args)
        {
Socket tcpServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//创建Socket
            tcpServer.Bind(new IPEndPoint(IPAddress.Parse("10.85.30.167"), 7788));//绑定IP和端口
            tcpServer.Listen(100);//监听
            Console.WriteLine("server runing...");
            while (true)
            {
                Socket clientSocket = tcpServer.Accept();//等待客户端连接
                Console.WriteLine("a client is connected!!");
                Client client = new Client(clientSocket);//把客户端通信逻辑放到class Clinet里面处理
                clientlist.Add(client);
            }}
 /// <summary>
        /// 广播消息
        /// </summary>
        /// <param name="message"></param>
        public static void BroadcastMessage(string message)
        {
            foreach (var client in clientlist)
            {
                client.SendMessage(message);
            }
        }
 

 

UDP 协议

             //服务器端
            //1.创建socket
            Socket udpServer = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);//创建Socket udp 
            //2.绑定IP和端口号
            udpServer.Bind(new IPEndPoint(IPAddress.Parse("10.85.30.167"), 7788));//绑定IP和端口 IPEndPoint为包含IP和端口的节点
            //3.接受数据
            EndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 0);
            byte[] data = new byte[1024];
            int length = udpServer.ReceiveFrom(data, ref remoteEndPoint);//这个方法把数据来源放在第二个参数上
            string message = Encoding.UTF8.GetString(data, 0, length);
            //客户端
            //1.创建socket
            Socket udpClient = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);//创建Socket udp 
            //2.发送数据
            EndPoint serverPoint= new IPEndPoint(IPAddress.Parse("10.85.30.167"),7788);
            string messagesend = Console.ReadLine();
            byte[] dataudp = Encoding.UTF8.GetBytes(messagesend);
            udpClient.SendTo(dataudp, serverPoint);
            //udp无所谓连接是不是关闭,如果需要一直的接收发,只需要while(true)循环的发送和接收消息 用一个线程执行发送和接收方法

两者区别:  UDP不需要建立连接,TCP需要建立连接。

                 UDP对资源要求少,TCP对资源要求多

                 UDP程序结构简单

                 UDP数据报模式,TCP是流模式

                 TCP保证数据正确性,UDP可能丢包,TCP保证数据顺序,UDP不保证。

posted @ 2019-11-25 21:48  最爱吃汤圆27  阅读(214)  评论(0编辑  收藏  举报