类似于发短信,不用连接,只需要知道接收端的地址
发送消息
发送端
package com.network.lesson03;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
/**
* @Author suaxi
* @Date 2020/11/23 11:03
* UDP发送消息,不需要连接服务器
*/
public class UpdClientDemo01 {
public static void main(String[] args) throws Exception {
//1、建立一个socket
DatagramSocket datagramSocket = new DatagramSocket();
//2、建立包
String mgs = "故乡的樱花开了!";
InetAddress localhost = InetAddress.getByName("localhost");
int port = 8888;
//数据 数据的长度起始 要发送给谁
DatagramPacket datagramPacket = new DatagramPacket(mgs.getBytes(), 0, mgs.length(),localhost,port);
//3、发送包
datagramSocket.send(datagramPacket);
//4、关闭流
datagramSocket.close();
}
}
接收端
package com.network.lesson03;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
/**
* @Author suaxi
* @Date 2020/11/23 11:18
* UDP接收端,还是要等待客户端的连接
*/
public class UpdServerDemo01 {
public static void main(String[] args) throws Exception {
//开放端口
DatagramSocket datagramSocket = new DatagramSocket(8888);
//接收数据包
byte[] bytes = new byte[1024];
DatagramPacket datagramPacket = new DatagramPacket(bytes, 0, bytes.length);
datagramSocket.receive(datagramPacket); //阻塞接收
System.out.println(datagramPacket.getAddress().getHostAddress()); //接收地址
System.out.println(new String(datagramPacket.getData(),0,datagramPacket.getLength())); //数据包消息
//关闭连接
datagramSocket.close();
}
}
循环发送消息
package com.network.chat;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.InetSocketAddress;
/**
* @Author suaxi
* @Date 2020/11/23 11:34
* 发送消息
*/
public class UdpSenderDemo01 {
public static void main(String[] args) throws Exception {
DatagramSocket datagramSocket = new DatagramSocket(8888);
//准备数据,控制台读取输入的数据System.in
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
while (true){
String data = bufferedReader.readLine();
byte[] bytes = data.getBytes();
DatagramPacket packet = new DatagramPacket(bytes, 0, bytes.length, new InetSocketAddress("localhost", 8889));
datagramSocket.send(packet);
if (data.equals("bye")){
break;
}
}
datagramSocket.close();
}
}
package com.network.chat;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
/**
* @Author suaxi
* @Date 2020/11/23 11:34
* UDP聊天咨询Demo(循环接收)
*/
public class UdpReciverDemo01 {
public static void main(String[] args) throws Exception {
DatagramSocket datagramSocket = new DatagramSocket(8889);
while (true){
//准备接收包裹
byte[] bytes = new byte[1024];
DatagramPacket datagramPacket = new DatagramPacket(bytes, 0, bytes.length);
datagramSocket.receive(datagramPacket); //阻塞式接收包裹
byte[] data = datagramPacket.getData();
String reciveData = new String(data, 0, data.length);
System.out.println(reciveData);
//断开连接
if (reciveData.equals("bye")){
break;
}
}
datagramSocket.close();
}
}
在线咨询,两者都是发送方,也都可以是接收方
发送端
package com.network.chat;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketException;
/**
* @Author suaxi
* @Date 2020/11/23 14:37
*/
public class TalkSend implements Runnable{
DatagramSocket datagramSocket = null;
BufferedReader bufferedReader = null;
private int fromPort;
private String toIP;
private int toPort;
public TalkSend(int fromPort, String toIP, int toPort) {
this.fromPort = fromPort;
this.toIP = toIP;
this.toPort = toPort;
try {
datagramSocket = new DatagramSocket(fromPort);
bufferedReader = new BufferedReader(new InputStreamReader(System.in));
} catch (SocketException e) {
e.printStackTrace();
}
}
@Override
public void run() {
while (true){
try {
String data = bufferedReader.readLine();
byte[] bytes = data.getBytes();
DatagramPacket packet = new DatagramPacket(bytes, 0, bytes.length, new InetSocketAddress(this.toIP, this.toPort));
datagramSocket.send(packet);
if (data.equals("bye")){
break;
}
} catch (IOException e) {
e.printStackTrace();
}
}
datagramSocket.close();
}
}
接收端
package com.network.chat;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
/**
* @Author suaxi
* @Date 2020/11/23 14:43
*/
public class TalkRecive implements Runnable{
DatagramSocket datagramSocket = null;
private int port;
private String mgsFrom;
public TalkRecive(int port,String mgsFrom) {
this.port = port;
this.mgsFrom = mgsFrom;
try {
datagramSocket = new DatagramSocket(port);
} catch (SocketException e) {
e.printStackTrace();
}
}
@Override
public void run() {
while (true){
try {
//准备接收包裹
byte[] bytes = new byte[1024];
DatagramPacket datagramPacket = new DatagramPacket(bytes, 0, bytes.length);
datagramSocket.receive(datagramPacket); //阻塞式接收包裹
byte[] data = datagramPacket.getData();
String reciveData = new String(data, 0, data.length);
System.out.println(mgsFrom+":"+reciveData);
//断开连接
if (reciveData.equals("bye")){
break;
}
} catch (IOException e) {
e.printStackTrace();
}
}
datagramSocket.close();
}
}
具体实现:
package com.network.chat;
/**
* @Author suaxi
* @Date 2020/11/23 14:46
*/
public class TalkStudent {
public static void main(String[] args) {
//开启两个线程
new Thread(new TalkSend(7777,"localhost",8888)).start();
new Thread(new TalkRecive(9999,"老师")).start();
}
}
package com.network.chat;
/**
* @Author suaxi
* @Date 2020/11/23 14:48
*/
public class TalkTeacher {
public static void main(String[] args) {
new Thread(new TalkSend(7778,"localhost",9999)).start();
new Thread(new TalkRecive(8888,"学生")).start();
}
}
评论 (0)