发送Send
- 创建DatagramSocket, 随机端口号,也可以指定端口号
- 创建DatagramPacket, 指定数据, 长度, 地址, 端口
- 使用DatagramSocket发送DatagramPacket
-
接收Receive
创建DatagramSocket, 指定端口号
- 创建DatagramPacket, 指定数组, 长度
- 使用DatagramSocket接收DatagramPacket
- 关闭DatagramSocket
-
接收方获取ip和端口号
String ip = packet.getAddress().getHostAddress();
- int port = packet.getPort();
UDP传输
```java package cn.giteasy.socket;
import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress;
/*
- UDP传输之Send(发送) *
- 创建DatagramSocket, 随机端口号
- 创建DatagramPacket, 指定数据, 长度, 地址, 端口
- 使用DatagramSocket发送DatagramPacket
- 关闭DatagramSocket */ public class Demo01Send {
public static void main(String[] args) throws Exception {//要发送的数据String str = "how are you?";//接收消息的主机String host = "localhost";//接收数据的程序端口号int port = 8888;//创建Socket,使用随机端口,也可以构造方法中传入端口DatagramSocket socket = new DatagramSocket();//创建Packet,用于存放数据DatagramPacket packet =new DatagramPacket(str.getBytes(), str.getBytes().length, InetAddress.getByName(host), port);//发送socket.send(packet);//关闭socketsocket.close();}
}
```java
package cn.giteasy.socket;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
/**
* UDP传输之Receive(接收)
* 创建DatagramSocket, 指定端口号
* 创建DatagramPacket, 指定数组, 长度
* 使用DatagramSocket接收DatagramPacket
* 关闭DatagramSocket
* 从DatagramPacket中获取数据
*/
public class Demo01Receive {
public static void main(String[] args) throws Exception {
//当前接收端程序监听的端口
int port = 8888;
//创建Socket相当于创建码头,需指定端口号用于接收数据
DatagramSocket socket = new DatagramSocket(port);
//创建Packet,存放接收到的数据
DatagramPacket packet = new DatagramPacket(new byte[1024], 1024);
//阻塞:接收数据
socket.receive(packet);
//从Packet中获取数据
byte[] arr = packet.getData();
//获取有效的字节个数
int len = packet.getLength();
System.out.println(new String(arr,0,len));
socket.close();
}
}
UDP传输优化
可不间断发送消息和接收消息
package cn.giteasy.socket;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Scanner;
/**
* 可持续发送,用户输入的数据
*/
public class Demo02Send {
public static void main(String[] args) throws Exception {
String host = "localhost";
int port = 8888;
DatagramSocket socket = new DatagramSocket();
Scanner scanner = new Scanner(System.in);
while (true){
String str = scanner.nextLine();
if("exit".equals(str)){
break;
}
DatagramPacket packet =
new DatagramPacket(str.getBytes(), str.getBytes().length, InetAddress.getByName(host), port);
socket.send(packet);
}
socket.close();
}
}
package cn.giteasy.socket;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
/**
* 可持续接收发送端的消息
*/
public class Demo02Receive {
public static void main(String[] args) throws Exception {
int port = 8888;
DatagramSocket socket = new DatagramSocket(port);
DatagramPacket packet = new DatagramPacket(new byte[1024], 1024);
while(true){
socket.receive(packet);
byte[] arr = packet.getData();
int len = packet.getLength();
String hostAddress = packet.getAddress().getHostAddress();
int sendPort = packet.getPort();
System.out.println(hostAddress+":" + sendPort + " => " +new String(arr,0,len));
}
}
}
UDP传输多线程
使用多线程实现:发送和接收在同一进程内进行
class Send extends Thread {
private String host;
private int port;
Send(String host,int port){
this.host = host;
this.port = port;
}
@Override
public void run() {
try {
DatagramSocket socket = new DatagramSocket();
Scanner scanner = new Scanner(System.in);
while (true){
System.out.print(host + ":" + port + " <= 请输入要发送的消息:");
String str = scanner.nextLine();
if("exit".equals(str)){
break;
}
DatagramPacket packet =
new DatagramPacket(str.getBytes(), str.getBytes().length, InetAddress.getByName(host), port);
socket.send(packet);
try {
//等待接收端打印完成,最好的办法是使用线程间通信实现,wait 和 notify
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
class Receive extends Thread {
private int port;
Receive(int port){
this.port = port;
}
@Override
public void run() {
try {
DatagramSocket socket = new DatagramSocket(port);
DatagramPacket packet = new DatagramPacket(new byte[1024], 1024);
while(true){
socket.receive(packet);
byte[] arr = packet.getData();
int len = packet.getLength();
String hostAddress = packet.getAddress().getHostAddress();
int sendPort = packet.getPort();
System.out.println(hostAddress+":" + sendPort + " => " +new String(arr,0,len));
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 使用多线程实现:发送和接收在同一进程内进行
*/
public class Demo03SendAndReceive {
public static void main(String[] args) {
//接收端线程
Receive receive = new Receive(8888);
//发送端线程
Send send = new Send("localhost", 8888);
receive.start();
send.start();
}
}
