java udp 发送 接收数据_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();

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值