1. 入门
1.1. 发送端
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
/**
* 测试udp通讯(发送端)
* @date 2018年2月5日
*/
public class Sender {
/**
* udp面向无连接
* 用到的类:DatagramSocket,DatagramPacket
* @param args
* @throws SocketException
*/
public static void main(String[] args) throws Exception {
//1.建立udp连接
DatagramSocket datagramSocket = new DatagramSocket();
//2.封装数据包
String data = "第一个socket例子";
byte datas[] = data.getBytes();
DatagramPacket datagramPacket = new DatagramPacket(datas, datas.length, InetAddress.getLocalHost(), 9090);
//3.调用udp的服务发送数据
datagramSocket.send(datagramPacket);
//4.关闭资源(释放端口号)
datagramSocket.close();
}
}
1.2. 接收端
import java.net.DatagramPacket;
import java.net.DatagramSocket;
/**
* 测试udp通讯(接收端)
* @date 2018年2月5日
*/
public class Receive {
public static void main(String[] args) throws Exception {
//1.建立udp连接,监听9090端口
DatagramSocket socket = new DatagramSocket(9090);
//2.准备一个空的数据包
byte buf[] = new byte[1024];
DatagramPacket packet = new DatagramPacket(buf,buf.length);
//3.调用udp的服务接收数据
socket.receive(packet);//receive是非阻塞性的,如果接收不到数据会一直等待
System.out.println("接收端接收到的数据: "+new String(buf,0,packet.getLength()));//getLength()接收到的数据长度
//4.关闭资源
socket.close();
}
}
2.给通讯软件发送信息
Java udp可以给通讯软件发送消息,如FeiQ,只需要满足FeiQ发送数据格式就可以。但是像给微信、QQ比较成熟的聊天软件则需要集成内部SDK才能发送消息。
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
/**
* 给FeiQ发送信息
* @date 2018年2月5日
*/
public class SendFeiQ {
public static void main(String[] args) throws Exception {
DatagramSocket socket = new DatagramSocket();
//封装数据包
byte buf[] = getFeiQData("Hi FeiQ!").getBytes();
DatagramPacket packet = new DatagramPacket(buf, buf.length, InetAddress.getLocalHost(), 2425);
socket.send(packet);
socket.close();
}
/**
* 任何网络通讯软件都会有自己的处理数据格式,不符合格式就当垃圾数据处理
* feiQ处理数据格式:
* version:time:sender:ip:flag:content
* 版本号:时间:发送人:IP地址:标识符(32):真正的内容;
* @param data
* @return
*/
public static String getFeiQData(String centent){
StringBuilder data = new StringBuilder();
data.append("1.0:");
data.append(System.currentTimeMillis()+":");
data.append("张三:");
data.append("192.168.0.107:");
data.append("32:");
data.append(centent);
return data.toString();
}
}
3.多人聊天的实现
3.1. 发送端
/**
* udp多人聊天(发送端)
* @date 2018年2月5日
*/
public class CharSender extends Thread{
@Override
public void run() {
DatagramSocket socket = null;
BufferedReader reader = null;
try {
socket = new DatagramSocket();
//键盘录入
reader = new BufferedReader(new InputStreamReader(System.in));
String line = null;
DatagramPacket packet = null;
while ((line = reader.readLine()) != null) {//群聊地址(局域网前面3位.255)
packet = new DatagramPacket(line.getBytes(), line.getBytes().length,InetAddress.getByName("192.168.0.255"),9090);
socket.send(packet);
}
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
socket.close();
}
}
}
}
3.2. 接收端
import java.net.DatagramPacket;
import java.net.DatagramSocket;
/**
* udp多人聊天(接收端)
* @date 2018年2月5日
*/
public class CharRecevice extends Thread{
@Override
public void run() {
DatagramSocket socket = null;
try {
socket = new DatagramSocket(9090);
byte buf[] = new byte[1024];
DatagramPacket packet = new DatagramPacket(buf,buf.length);
while (true) {
socket.receive(packet);
System.out.println(packet.getAddress().getHostAddress()+"说:"+new String(buf,0,packet.getLength()));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
socket.close();
}
}
}
3.3. 调用端
public class ChatMain {
public static void main(String[] args) {
//之所以用线程是让一条线程跑接收端,一条线程跑发送端
ChatRecevice recevice = new ChatRecevice();
ChatSender sender = new ChatSender();
recevice.start();
sender.start();
}
}