UDP
1、使用UDP协议聊天实现_DOME
发起端
package com.wuzhy.UDP;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class UDP_Soket_A {
public static void main(String[] args) throws Exception {
//Java使用DatagramSocket代表UDP协议的Socket,建立连接
DatagramSocket socket=new DatagramSocket(6666);
//可以在控制台中一直发送消息,但如果发送了goodbye就结束
while (true){
InetAddress inet=InetAddress.getByName("localhost");
//获取控制台输入的流,缓冲区读取内容
BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));
//每次都读一行
String str=reader.readLine();
//转换成字节数组
byte [] bytes=str.getBytes();
//发送包,包含了(要发送的内容,内容从下标0开始,到下标最大长度,ip地址,端口号)
DatagramPacket packet=new DatagramPacket(bytes,0,bytes.length,inet,9100);
//send(),以该DatagramSocket对象向外发送数据报
socket.send(packet);
if (packet.getData().equals("goodbye")){
break;
}
}
//关闭连接
socket.close();
}
}
接收端
package com.wuzhy.UDP;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class UDP_Soket_B {
public static void main(String[] args) throws Exception {
//建立连接地址
DatagramSocket socket=new DatagramSocket(9100);
while (true){
//建立接收包
byte [] bytes=new byte[1024];
DatagramPacket packet=new DatagramPacket(bytes,0,bytes.length);
//receive(),从该DatagramSocket中接收数据报
socket.receive(packet);
/**
* 注意下:
* DatagramPacket.getData()获取的数据的长度不是自己发送的数据长度
* DatagramPacket.getLength()获取的数据的长度才是自己发送的数据长度
*/
//
byte [] data=packet.getData();//getData()获取数据
String str=new String(data,0,packet.getLength());
System.out.println(str);
if (str.equals("goodbye")){
break;
}
}
//关闭连接
socket.close();
}
}
以上demo是完成一个发起和接收端的实现,下面运用UDP协议,模拟一个在线咨询的demo
2、UDP+多线程,实现在线咨询Demo
1、创建发送类
package com.wuzhy.UDP;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.*;
public class TalkSend implements Runnable{
DatagramSocket socket=null;
BufferedReader reader=null;
private int formPost; //来源端口
private String toIP; //要发送的IP
private int toPort; //要发送的端口
//有参构造器中赋值socket、reader
public TalkSend(int formPost,String toIP,int toPort) {
this.formPost=formPost;
this.toIP=toIP;
this.toPort=toPort;
try {
socket= new DatagramSocket(formPost);
reader= new BufferedReader(new InputStreamReader(System.in));
} catch (SocketException e) {
e.printStackTrace();
}
}
@Override
public void run() {
//循环进行发送消息,直到发送goodbye结束
while (true){
InetAddress inet= null;
try {
String str=reader.readLine();
byte [] bytes=str.getBytes();
DatagramPacket packet=new DatagramPacket(bytes,0,bytes.length,InetAddress.getByName(toIP),toPort);
//send(),以该DatagramSocket对象向外发送数据报
socket.send(packet);
if (packet.getData().equals("goodbye")){
break;
}
} catch (Exception e) {
e.printStackTrace();
}
}
socket.close();
}
}
2、创建接收类
package com.wuzhy.UDP;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class TalkReceive implements Runnable{
DatagramSocket socket=null;
private int post; //接收的端口号
private String msgFrom; //发送人名称
public TalkReceive(int post,String msgFrom) {
this.post=post;
this.msgFrom=msgFrom;
try {
socket=new DatagramSocket(post);
} catch (SocketException e) {
e.printStackTrace();
}
}
@Override
public void run() {
//循环接收消息,直到接收到goodbye结束
while (true){
try {
//建立接收包
byte [] bytes=new byte[1024];
DatagramPacket packet=new DatagramPacket(bytes,0,bytes.length);
//receive(),从该DatagramSocket中接收数据报
socket.receive(packet);
byte [] data=packet.getData();
String str=new String(data,0,packet.getLength());
System.out.println(msgFrom+":"+str);
if (str.equals("goodbye")){
break;
}
} catch (IOException e) {
e.printStackTrace();
}
}
socket.close();
}
}
3、创建Student类,和Teacher类,使用多线程同时启动发送和接收类,模拟在线咨询
两人都可以是发送放,也都可以是接收方
package com.wuzhy.UDP;
public class TalkTeacher {
public static void main(String[] args) {
//注意:发送类TalkSend的toPort要与接收类TalkReceive的post对应
new Thread(new TalkSend(9966,"localhost",9900)).start();
new Thread(new TalkReceive(8800,"学生")).start();
}
}
package com.wuzhy.UDP;
public class TalkStudent {
public static void main(String[] args) {
//注意:发送类TalkSend的toPort要与接收类TalkReceive的post对应
new Thread(new TalkSend(8700,"localhost",8800)).start();
new Thread(new TalkReceive(9900,"学生")).start();
}
}