版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_40301026/article/details/88623692
首先明白UDP相关知识:
https://blog.csdn.net/qq_40301026/article/details/88623353
https://blog.csdn.net/qq_40301026/article/details/88605688
首先先实现一方接受,一方发送的能力:
这是发送方:
思路:
1.使用DatagramSocket指定端口,创建接收端
2.准备要发送的数据(最后要转化为字节,不要超过60k)
3.创建并封装DatagramPacket包裹 (需指明目的地IP和端口)
4.发送包裹seed(DatagramPacket p)
5.释放资源
package cn.liu.loc;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
public class UdptalkClient01 {
public static void main(String[] args) throws Exception {
DatagramSocket client = new DatagramSocket(8832);//创建发送端
System.out.println("正在发送中。。。。。");
while(true) {
//准备要发送的数据,并处理为字节
BufferedReader dis = new BufferedReader(new InputStreamReader(System.in));
byte[] datas = new byte[1024*60];
String str = dis.readLine();//拿到流中的数据
datas = str.getBytes();//String转为字节,存入字节数组
//将数据打包并发送
DatagramPacket packet = new DatagramPacket(datas,0,datas.length,new InetSocketAddress("Dick",8888));
client.send(packet);
if(str.equals("结束")) {
break;
}
}
//关闭服务端口
client.close();
}
}
这是接受方:
思路:
1.使用DatagramSocket指定端口,创建接收端
2.准备字节数组用来存放包裹数据
3.阻塞式接受包裹receive(Datagrampacket p)
4.将字节数组中数据转换或处理
5.释放资源
package cn.liu.loc;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
/**
* 接收端
* @author Administrator
*
*/
public class UdptalkServer01 {
public static void main(String[] args) throws Exception {
System.out.println("正在接收中。。。。。。");
DatagramSocket server = new DatagramSocket(8888);//创建接收端
byte[] datas = new byte[1024*60];//准备接收数组
//循环的去接受包,并处理
while(true) {
//写明地址,并接收包
DatagramPacket packet = new DatagramPacket(datas,0,datas.length);//创建接收包
server.receive(packet);
//拿到包的字节数据
datas = packet.getData();
int len = packet.getLength();
//转换数据类型
String str = new String(datas,0,len);
System.out.println(str);
if(str.equals("结束")) {
break;
}
}
//关闭服务端口
server.close();
}
}
运行之后,实现如图效果。
-------------------------------------------------------------------------------------------------------------------------------------->
这只实现了一方发送数据,一方只能接受数据。如何能实现想qq那样你一句我一句呢???即:一边发一边收,那就要加入多线程。
对上面代码进行封装,并且加入多线程。
发送方:
package cn.liu.loc;
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 Administrator
*
*/
public class UdptalkClient02 implements Runnable{
private DatagramSocket client ;
private int Port;
private String otherIP;
private int otherPort;
public UdptalkClient02(int Port,String otherIP,int otherPort) {
this.Port = Port;
this.otherIP = otherIP;
this.otherPort = otherPort;
try {
this.client = new DatagramSocket(Port);//创建发送端
} catch (SocketException e) {
e.printStackTrace();
}
}
@Override
public void run() {
while(true) {
//准备要发送的数据,并处理为字节
BufferedReader dis = new BufferedReader(new InputStreamReader(System.in));
byte[] datas = new byte[1024*60];
try {
String str = dis.readLine();//拿到流中的数据
datas = str.getBytes();//String转为字节,存入字节数组
//将数据打包并发送
DatagramPacket packet = new DatagramPacket(datas,0,datas.length,new InetSocketAddress(otherIP,otherPort));
client.send(packet);
if(str.equals("结束")) {
break;
}
} catch (IOException e) {
e.printStackTrace();
}
}
client.close();
}
}
接收方:
package cn.liu.loc;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class UdptalkServer02 implements Runnable{
private DatagramSocket server;
private int Port;
private String role;
public UdptalkServer02(int Port,String role) {
this.Port = Port;
this.role = role;
try {
this.server = new DatagramSocket(Port);//创建接收端
} catch (SocketException e) {
e.printStackTrace();
}
}
@Override
public void run() {
byte[] datas = new byte[1024*60];//准备接收数组
//循环的去接受包,并处理
while(true) {
//写明地址,并接收包
DatagramPacket packet = new DatagramPacket(datas,0,datas.length);//创建接收包
try {
server.receive(packet);
} catch (IOException e) {
e.printStackTrace();
}
//拿到包的字节数据
datas = packet.getData();
int len = packet.getLength();
//转换数据类型
String str = new String(datas,0,len);
System.out.println(role+":"+str);
if(str.equals("结束")) {
break;
}
}
server.close();
}
}
测试,启动:
package cn.liu.loc;
public class UdptalkClient02Test {
public static void main(String[] args) {
//一个发送端对应对方一个接收端
//发送端8888
new Thread(new UdptalkClient02(8888,"Dick", 5535)).start();
//接收端7753
new Thread(new UdptalkServer02(7753,"小红")).start();
}
}
package cn.liu.loc;
public class UdptalkServer02Test {
public static void main(String[] args) {
//一个发送端对应对方一个接收端
//接收端5535
new Thread(new UdptalkServer02(5535,"小明")).start();
//发送端6634
new Thread(new UdptalkClient02(6634,"Dick", 7753)).start();
}
}
现在基于控制台比较简陋,但是基于UDP传输的思想基本表达明白: