Udp协议 发送端和接受端的代码实现(socket编程)
发送端:
构造方法:
DatagramSocket datagramSocket = new DatagramSocket();
发送:
datagramSocket.send(数据报包);
创建数据报包的方法:
DatagramPacket datagramPacket = new DatagramPacket(byte[] length,address,port);
参数1:将内容转换为字节数组
参数2:字节数组长度
参数3:ip地址对象
参数4:端口号
接受端:
构造方法:
DatagramSocket datagramSocket = new DatagramSocket();
接受:
datagramSocket.receive( datagramPacket );
创建接受器:
DatagramPacket datagramPacket = new DatagramPacket( bytes, bytes.length );
接受真实数据:
byte[] data = datagramPacket.getData();
接受实际字节数组的长度
int length = datagramPacket.getLength();
获取发送的ip地址
String ip=datagramPacket.getAddress().getHostAddress();
那么在这些基础上,去写出一个既可以接受也可以发送的,那么可以考虑使用多线程的方法,来进行操作,具体如下:
package com.bxq.demo1.udpjieshou;
import java.io.IOException;
import java.net.*;
import java.util.Scanner;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
public class Test {
public static void main(String[] args) throws IOException {
ExecutorService executorService = Executors.newFixedThreadPool( 2 );
//建立线程池,线程池可以放两个线程,一个发送线程,一个接受线程
Future<?> submit = executorService.submit( new Test1() );
Future<?> submit1 = executorService.submit( new Test2() );
}
}
class Test1 implements Runnable{
public void run() {
DatagramSocket datagramSocket = null;
try {
datagramSocket = new DatagramSocket();//创建发送的构造器
} catch (SocketException e) {
e.printStackTrace();
}
Scanner scanner = new Scanner(System.in);
while(true){
String s = scanner.next();
byte[] b=s.getBytes(); //吧输入的字符串转换为字节数组
InetAddress byName = null;
try {
byName = InetAddress.getByName( "xx.xx.xxx.xx" );//填上想要发送的对象的ip地址
} catch (UnknownHostException e) {
e.printStackTrace();
}
DatagramPacket datagramPacket = new DatagramPacket(b,b.length,byName,10086);
//创建数据报包,内容为发送内容,发送内容大小,发送的地址,以及端口号
try {
datagramSocket.send( datagramPacket );
//吧数据包发送出去
} catch (IOException e) {
e.printStackTrace();
}
if(s.equals( "886" )){
break;
}
}
datagramSocket.close();
}
}
class Test2 implements Runnable{
public void run() {
DatagramSocket ds = null;
try {
ds = new DatagramSocket(10086);//创建接受构造器
} catch (SocketException e) {
e.printStackTrace();
}
byte[] bts = new byte[1024];
int length = bts.length;
DatagramPacket dp = new DatagramPacket(bts,length); 创建接受的包
while(true){
try {
ds.receive (dp); //在构造器中放入包
} catch (IOException e) {
e.printStackTrace();
}
byte[] bts2 = dp.getData(); //获取实际的对方发送的内容
int length2 = dp.getLength();//获取对方实际发送的大小
String receiveMes = new String(bts2,0,length2);//接受对方发送的内容,并转换为字符串
String ip = dp.getAddress().getHostAddress();
System.out.println(receiveMes+"ip:"+ip);
}
}
}