udp协议 服务器

发布于:2024-06-28 ⋅ 阅读:(18) ⋅ 点赞:(0)

1 TCP和UDP基本概念

TCP:(Transmission Control Protocol)是一种面向连接、可靠的基于字节流的传输层通信协议。并且提供了全双工通信,允许两个应用之间建立可靠的链接以进行数据交换

 udp:(User Datagram Protocol):是一种无链接、不可靠、基于数据报文传输层协议,他不提供数据包的分组排序和组装功能,也不提供可靠性的保证

2 udp协议特点

1 udp基于IP 的简单的协议,不可靠的协议
2 优点就是简单 轻量化  传输速度快,要求可靠性不太高
3 缺点:没有流量控制没有应答确认机制。不能解决丢包重发顺序问题 

3 udp使用的场景

当应用程序对传输的可靠性要求不高,但是对传输速度和延迟要求较高时可以使用udp协议
例如语音和视频聊天。主要在这些场景如果丢了一两个数据包,不会产生太大的影响。

4 tcp和udp区别? 

1 TCP是基于连接的 而udp基于非链接的
2 tcp传输数据稳定可靠,适用于对网络通信质量要求高的场景,需要准确无误的发给对方,例如 传输文件 发送文件浏览网页。
3 udp优点是速度快,轻量级。但是有可能会产生丢包问题,所以适用于实时性要求较高的的但是对丢包没有要求太高场景
例如域名查询语音通话、视频直播等

服务器

搭建服务器页面

代码
       // 先讲socket进行客户端和服务器的书写
    Socket socket;
    private void button1_Click(object sender, EventArgs e)
    {
        //参数1 ip地址类型 ipv4的类型
        //参数2 传递数据类型 数据报文类型
        //参数3 协议类型 udp协议
        //1 创建socket套接字作为服务器对象
        socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

        // 2绑定ip和端口
        IPAddress iPAddress = IPAddress.Parse(“端口号");
        socket.Bind(new IPEndPoint(iPAddress,8081));
       
       
        //3 接受消息
        startReceive();
    }
  
    void startReceive()
    {
        //创建线程 开启线程
        new Thread(() =>
        {
            byte[] body = new byte[1024];
            while (true)
            {
                
                int count =   socket.Receive(body); //接受数据
                string s = Encoding.UTF8.GetString(body, 0, count);
                richTextBox1.Invoke((Action)(() =>
                {
                    richTextBox1.AppendText(s + "\t\n");
                    richTextBox1.SelectionStart=richTextBox1.Text.Length;
                    richTextBox1.ScrollToCaret();
                }));
            }

        }).Start() ;
    }

    //发消息的方法 给指定的人发消息
    string[] ips = new string[] {"端口号",  };
    private void button2_Click(object sender, EventArgs e)
    {
        socket.SendTo(Encoding.UTF8.GetBytes(this.textBox1.Text),
            new IPEndPoint(IPAddress.Parse("端口号"), 8082)
            );
    }
}

客户端:

搭建界面

代码:
void f1()
{
    byte[] body = new byte[1024];
    while (true)
    {
        int count = socket.Receive(body); //接受数据
        string s = Encoding.UTF8.GetString(body, 0, count);
        richTextBox1.Invoke((Action)(() =>
        {
            richTextBox1.AppendText(s + "\t\n");
            richTextBox1.SelectionStart = richTextBox1.Text.Length;
            richTextBox1.ScrollToCaret();
        }));
    }
}
// 打开连接
Socket socket;
private void button1_Click(object sender, EventArgs e)
{
    try
    {
        //1创建客户端对象
        socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
        //bind 如果前后端写的端口一致的时候 出现错误,端口号只能使用一次
        //2 绑定ip和端口号
       socket.Bind(new IPEndPoint(IPAddress.Parse("192.168.107.83"), 8082));
        Thread th = new Thread(f1);
        th.Start();
    }
    catch (Exception ex)
    {
        MessageBox.Show("端口号被占用");
    }

}

//发送消息
private void button2_Click(object sender, EventArgs e)
{
  
    if (socket != null)
    {
      
        //参数1 发送的字符串转成字节数组
        //参数2 发送数据的远程终端 new IPEndPoint(IPAddress.Parse("192.168.107.83"), 8081)
        socket.SendTo(Encoding.UTF8.GetBytes("倒反天罡"), new IPEndPoint(IPAddress.Parse("192.168.107.83"), 8081));
   }
}

//关闭
private void button3_Click(object sender, EventArgs e)
{
    socket.Close();//关闭
    socket = null;
}

效果如下:

打开服务器,客户链接并发送消息

服务器向客户端发送消息