Advertisement

UDP和TCP发送接收数据(java)

阅读量:

文章目录

  • 一、协议是什么?

  • 二、UDP协议和TCP协议

    • 1.UDP协议

      • (1)什么是UDP协议
      • (2)UDP发送数据
      • (3) UDP接收数据
    • 2.TCP协议

      • (1)什么是TCP协议
      • (2)TCP发送数据
      • (3)TCP接收数据
  • 总结


一、协议是什么?

计算机网络中,连接和通信的规则被称为协议,它对数据的传输格式,传输速率,传输步骤等做出了统一的规则,通信双方必须同时遵守才能完成数据交换。常用的协议有TCP协议和UDP协议

二、UDP协议和TCP协议

1.UDP协议

(1)什么是UDP协议

  • 用户数据报协议(User Dategram protocol)

  • UDP是无连接通信协议,即在数据传输时,数据接收端和数据接收端不会建立逻辑连接。简单来说,当一台计算机向另一台计算机发送数据时,发送端不会确认接收端是否存在,就会发送数据,同时接收端在收到数据时,也不会向发送端反馈是否接收到数据
    由于使用UDP协议消耗资源少,通讯效率高,所以通常都会用于音频,视频和普通数据的传输(优点)

  • 例如视频会议通常采用UDP协议,因为这种情况即使偶尔丢失一两个数据包,也不会对接收结果产生太大影响。但是在使用UDP协议传送数据时,由于UDP的面向无连接性,不能保证数据的完整性,因此在传输重要文件时不建议使用UDP协议(缺点)

(2)UDP发送数据

发送数据的步骤

  1. 创建发送端的Socket对(DatagramSocket)
    DatagramSocket()

  2. 创建数据,并把数据打包
    DatagramPacket(byte[] buf,int length,InetAddress,int port)

  3. 调用DatagramSocket对象的方法发送数据
    void send(DatagramPacket p)

  4. 关闭发送端
    void close()

代码如下(示例):

复制代码
    import java.io.IOException;
    import java.net.*;
    
    public class SendDemo {
    public static void main(String[] args) throws IOException {
        //创建发送端socket对象
        DatagramSocket ds = new DatagramSocket();
        //创建数据并打包
        byte[] buf ="哦哦哦,哈哈哈".getBytes();
        //调用InetAddress类中的静态方法getByName()
        // port为 1023~65535随便一个整数
        DatagramPacket dp = new DatagramPacket(buf,buf.length, InetAddress.getByName("ip地址或电脑主机名"),10086);
        //调用send()方法,发送数据
        ds.send(dp);
        //关闭发送端
        ds.close();
    }
    }

代码如下(优化)
可通过键盘录入发送的数据,录入“886”可结束发送

复制代码
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetAddress;
    
    
    public class SendDemo01 {
    public static void main(String[] args) throws IOException {
        DatagramSocket ds = new DatagramSocket();
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String line;
        while((line= br.readLine()) !=null){
            if ("886".equals(line)){
                break;
            }
            DatagramPacket dp = new DatagramPacket(line.getBytes(),line.getBytes().length, InetAddress.getByName("10.165.118.135"),10086);
            ds.send(dp);
        }
        ds.close();
    }
    }

(3) UDP接收数据

接收数据步骤

  1. 创建接收端的Socket对象(DatagramSocket)
    DatagramSocket(int port)

  2. 创建一个数据包,用于接收数据
    DatagramPacket(byte[] buf,int length)

  3. 调用DatagramSocket对象方法接收数据
    void receive(Datagrampacket p)

  4. 解析数据包,并把数据在控制太显示
    byte[] getData()
    int getLength()

  5. 关闭接收端
    void close()

代码如下(示例):

复制代码
    import java.io.IOException;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    
    public class ReceiveDemo {
    public static void main(String[] args) throws IOException {
        DatagramSocket ds = new DatagramSocket(10086);
        while(true) {
            byte[] bytes = new byte[1024];
            DatagramPacket dp = new DatagramPacket(bytes, bytes.length);
            ds.receive(dp);
            System.out.println( new String(dp.getData(), 0, dp.getLength()));
        }
    }
    }

2.TCP协议

(1)什么是TCP协议

传输控制协议(Transmission Control Protocol)

TCP协议是面向连接的通信协议,即传输数据之前,在发送端和接收端建立逻辑连接,然后再传输数据,它提供了两台计算机之间可靠无差错 的数据传输。TCP在连接中必须要明确客户端与服务器端,由客户端向服务器发送连接请求,每次连接的创建都需要经过“三次握手”

三次握手:TCP协议中,在发送数据的准备阶段,客户端和服务器之间的三次交互,以保证连接的可靠

复制代码
    第一次:客户端向服务器端发送一个连接请求,等待服务器的确认

    第二次:服务器向客户端发送一个响应,通知客户端收到连接请求
    第三次:客户端向服务器发送一个确认信息,确认连接

(2)TCP发送数据

发送数据的步骤

  1. 创建客户端的Socket对象(Socket)
    Socket(String host,int port)

  2. 获得输出流,写数据
    OutputStream getOutputStream()

  3. 释放资源
    void close()

代码如下(示例):

复制代码
    package com.wei.TCP;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.Socket;
    
    public class ClientDemo {
    public static void main(String[] args) throws IOException {
        //创建客户端Socket对象
        //Socket(String host, int port) 创建流套接字并将其连接到指定主机上的指定端口号。
        Socket socket = new Socket("IP地址", 10011);
        //获得输出流 OutputStream getOutputStream
        //OutputStream getOutputStream() 返回此套接字的输出流。
        OutputStream os = socket.getOutputStream();
        //写数据
        os.write("我是谁,我在哪".getBytes());
        //释放资源
        socket.close();
    }
    }

(3)TCP接收数据

接收数据步骤

  1. 创建服务端的Socket对象(ServerSocket)
    ServerSocket(int port)

  2. 监听客户端连接,返回一个Socket对象
    Socket accept()

  3. 获得输入流,读数据,并把数据显示在控制台

  4. 释放资源
    void close()

代码如下(示例):

复制代码
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    public class ServiceDemo {
    public static void main(String[] args) throws IOException {
        //创建服务器Socket对象
        //ServerSocket(int port) 创建绑定到指定端口的服务器套接字。
        ServerSocket ss = new ServerSocket(10011);
        //Socket accept() 侦听对此套接字的连接并接受它。
        Socket s = ss.accept();
        //获得输入流对象
        //InputStream getInputStream() 返回此套接字的输入流。
        InputStream is = s.getInputStream();
        //获得数据并输出
        byte[] bytes = new byte[1024];
        int len = is.read(bytes);
        String data = new String(bytes,0,len);
        System.out.println("数据是 "+ data);
        ss.close();
    }
    }

总结

提示:这里对文章进行总结:
不管是TCP还是UDP都必须都先启动接收端(服务器),不然会报ConnectException。就这一点需要注意,其他都很简单。

全部评论 (0)

还没有任何评论哟~