java基础之网络编程UDP传输

目录

一:UDP传输步骤

二:UDP发送端和接收端

1:UDP传输-发送端思路

2:UDP传输-接收端思路

3:例子

4:注意

三:练习


一:UDP传输步骤

DatagramSocket与DatagramPacket

建立发送端,接收端。 建立数据包。

调用Socket的发送接收方法。

关闭Socket。

发送端与接收端是两个独立的运行程序。

二:UDP发送端和接收端

1:UDP传输-发送端思路

1:建立udp的socket服务

DatagramSocket /建立UDP发送端的Socket对象,构造数据报套接字并将其绑定到本地主机上的任何可用端口

2:将要发送的数据封装成数据包

DatagramPacket(byte[] buf, int length, InetAddress address, int port) //创建数据,构造用于发送长度的分组的数据报包 length指定主机上到指定的端口号。

3:通过udp的socket服务,将数据包发送出

send()方法

4:关闭资源

2:UDP传输-接收端思路

1:建立udp的socket服务.

DatagramSocket(int port) //创建接收端的Socket对象,构造数据报套接字并将其绑定到本地主机上的指定端口。

2:通过receive方法接收数据

DatagramPacket(byte[] buf, int length) //构造一个 DatagramPacket用于接收长度的数据包 length 。

3:将收到的数据存储到数据包对象中

public void receive(DatagramPacket p)调用Socket的接收方法接收数据

4:通过数据包对象的功能来完成对接收到数据进行解析.

5:可以对资源进行关闭

3:例子

发送端

package day34;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class SendTest {
    public static void main(String[] args) throws  Exception{
        //创建发送方对象
        DatagramSocket datagramSocket = new DatagramSocket();
        //将发送信息打包
        byte[] bytes = "hello".getBytes();
        DatagramPacket localhost = new DatagramPacket(bytes,
                bytes.length, InetAddress.getByName("127.0.0.1"), 8888);
        //发送消息
        datagramSocket.send(localhost);
        //关闭资源
        datagramSocket.close();
    }
}

接收端

package day34;

import java.net.DatagramPacket;
import java.net.DatagramSocket;


public class ReceiveTest {
    public static void main(String[] args) throws Exception{
        //创建接收方对象
        DatagramSocket datagramSocket = new DatagramSocket(8888);
        //接收对象
        byte[] b =new byte[1024];
        DatagramPacket datagramPacket = new DatagramPacket(b, b.length);
        //接收数据
        datagramSocket.receive(datagramPacket);
        //将接收数据进行解析
        String s = new String(datagramPacket.getData(), 0, datagramPacket.getLength());
        System.out.println(datagramPacket.getAddress()+":"+s);
        //关闭资源
        datagramSocket.close();

    }
}

 4:注意

记得关闭资源,关闭资源后就不能发送消息

要先运行接收端信息再运行发送端,否则会收不到消息

三:练习

从键盘录入数据进行发送,如果输入的是886那么客户端就结束输入数据。

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

/*
        从键盘录入数据进行发送
        如果输入的是886那么客户端就结束输入数据。

 */
public class SendDemo3 {
    public static void main(String[] args) throws Exception{
        //创建发送端的Socket对象
        DatagramSocket ds = new DatagramSocket();

        //字符缓冲输入流接收数据
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String line = null;
        while ((line=br.readLine())!=null){
            if("886".equals(line)){
                break;
            }

            //如果输入的不是886,就封装到数据包中,发送出去
            DatagramPacket dp = new DatagramPacket(line.getBytes(), line.getBytes().length,
                    InetAddress.getByName("localhost"), 12345);

            ds.send(dp);
        }

        ds.close();


    }
}
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

/*
    UDP接收端一致接收数据
 */
public class ReceviceDemo3 {
    public static void main(String[] args) throws Exception{
        //创建接收端的Socket对象
        DatagramSocket ds = new DatagramSocket(12345);

        while (true){
            //创建一个数据接收容器
            byte[] bytes = new byte[1024];
            DatagramPacket dp = new DatagramPacket(bytes, bytes.length);

            ds.receive(dp);

            //解析数据
            InetAddress ip = dp.getAddress();//获取发送人的IP
            byte[] data = dp.getData();

            String s = new String(data, 0, dp.getLength());
            System.out.println(ip + ":" + s);
        }



    }
}

 

 

おすすめ

転載: blog.csdn.net/weixin_50691399/article/details/121244234