手记

Socket编程-UDP协议发送和接收数据

不知道什么是Socket编程和UDP协议的自己去查资料。

UDP协议发送和接收数据的步骤:
    发送:
        创建UDP发送端的Socket对象
        创建数据并把数据打包
        发送数据
        释放资源

    接收:
        创建UDP接收端的Socket对象
        创建数据包用于接收数据
        接收数据
        解析数据包
        释放资源

快速获取本机IP地址的方法:打开dos命令窗口,输入ipconfig,回车

使用多线程的目的是实现发送和接收都在一个窗口显示

//这是发送类
package UdpThreadPro;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.util.Dictionary;
import java.util.Scanner;

public class UdpSend implements Runnable {
    public void run() {
        try {
            //创建数据报包Socket对象,DatagramSocket这个类表示用来发送和接收数据报包的套接字
            DatagramSocket ds=new DatagramSocket();
            System.out.println("开始聊天吧");
            while(true){
            //从键盘输入
            Scanner s=new Scanner(System.in);
            //将键盘输入的值存入字符串a
            String a=s.nextLine();
            //如果键盘输入886,则退出循环,结束聊天
            if(a.equals("886")){
                break;
            }
            //将字符串转化成字节数组
            byte bytes[]=a.getBytes();
            //创建ip地址对象
            //InetAddress类没有任何构造方法,但是调用它的getByName方法可以返回一个InetAddress类对象
            InetAddress iar = InetAddress.getByName("192.168.1.128");
            //创建数据报包,包含要发送的字节组数,字节数组长度,发送端的ip地址对象以及端口
            DatagramPacket p=new DatagramPacket(bytes, bytes.length, iar, 2048);
            //发送数据报包
            ds.send(p); 
            //清空字节数组,防止数据重叠
            bytes=null;
            }
            } catch (Exception e) {
                e.printStackTrace();
            }
    }
}
//这是接收类
package UdpThreadPro;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;

public class UdpReceive implements Runnable{
    @Override
    public void run() {
        try {
            //创建IP地址对象
            //InetAddress类没有任何构造方法,但是调用它的getByName方法可以返回一个InetAddress类对象
            InetAddress laddr = InetAddress.getByName("192.168.1.128");
            //创建数据报包Socket对象,指定该Socket的接口和IP地址,这样发送端才能找到指定的接收端
            DatagramSocket ds=new DatagramSocket(2048, laddr);
            while(true){
            //创建字符数组
            byte bytes[]=new byte[1024*1024];
            //创建数据报包接收数据
            DatagramPacket p=new DatagramPacket(bytes, bytes.length);
            //接收数据报包,包含收到的字节数组,实际长度,和发送方的 IP地址以及端口号**注意:此方法在接收到数据报包前一直阻塞
            ds.receive(p);
            //创建一个带长度的字节数组,p.getLength()表示接收到的数据的实际长度
            byte bytes2[]=new byte[p.getLength()];
            //解析数据
            bytes2=p.getData();
            //将字符数组转化成字符串,p.getLength()表示接收到的数据的实际长度
            String b=new String(bytes2, 0,p.getLength());
            //p.getAddress().getHostAddress()表示发送端的IP地址
            String a=p.getAddress().getHostAddress();
            //输出接收到的数据和发送端的ip地址
            System.out.println("from "+a+":"+b);
            //清空字节数组,防止数据重叠
            bytes2=null;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}
//这是测试类
package UdpThreadPro;
public class Test {
    public static void main(String[] args) throws InterruptedException {
        //创建接收端对象
        UdpReceive ur=new UdpReceive();
        //创建发送端对象
        UdpSend us=new UdpSend();
        //创建发送和接收线程
        Thread t1=new Thread(ur);
        Thread t2=new Thread(us);
        //启动线程
        t1.start();
        t2.start();

    }
}
2人推荐
随时随地看视频
慕课网APP