1、利用UDP协议进行发送端和接收端的消息传递
//UDPSend.java
package UDP;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
public class UDPSend {
public static void main(String[] args) throws IOException {
System.out.println("发送端启动……");
// 创建UDP传输的发送端
// 思路:
// 1 建立udp的socket服务,因为接收数据 要明确端口号
// 2 将要发送的数据封装到数据包中
// 3 通过udp的socket服务将数据包
// 4 关闭socket服务
//1 updatesocket服务 使用DatagramSocket对象
DatagramSocket ds = new DatagramSocket();
//2 将要发送的数据封装到数据包中
String str = "love guoguo";
//使用DatagramPacket将数据封装到该对象包中
byte[] buf = str.getBytes();
DatagramPacket dp =
new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.1.130"),8888);
//3 通过udp的socket服务将数据包发送出去,使用send方法
ds.send(dp);
//4 关闭资源
ds.close();
}
}
//UDPReceive.java
package UDP;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class UDPReceive {
public static void main(String[] args) throws IOException {
System.out.println("接收端启动……");
// 建立UDP接收端的思路
// 1.建立UDP socket服务
// 2.创建数据包,用于存储接受到的数据,方便用户数据包的方法解析这些数据
// 3.使用socket服务的receive方法将接收的数据存储到数据包中
// 4.通过数据包的方法解析数据包中的数据
// 5.关闭资源
//1 建立UDP socket服务
DatagramSocket ds = new DatagramSocket(8888);
//2 建立数据包
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf,buf.length);
//3 使用接收方法将数据存储到数据包中
ds.receive(dp);
//4 通过数据包的方法解析数据包中的数据 解析其中的数据,比如,地址、端口、数据内容
String ip = dp.getAddress().getHostAddress();
int port = dp.getPort();
String text= new String(dp.getData(),0,dp.getLength());
dp.getData();
System.out.println(ip+":"+port+":"+text);
//5 关闭资源
ds.close();
}
}
也可通过CMD进行运行.class
cmd进行运行
E:\eclipse-workspace\CS\bin>java UDP.UDPReceive
E:\eclipse-workspace\CS\bin>java UDP.UDPSend
2、利用UDP协议的 发送端和接收端 加上 多线程 实现 聊天室
//Chatmain.java
package Chatroom;
import java.net.DatagramSocket;
import java.net.SocketException;
public class Chatmain {
public static void main(String[] args) throws SocketException {
DatagramSocket send = new DatagramSocket();
DatagramSocket rece = new DatagramSocket(8888);
new Thread(new ChatClient(send)).start();
new Thread(new ChatServer(rece)).start();
}
}
//ChatClient.java
package Chatroom;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class ChatClient implements Runnable{
private DatagramSocket ds;
public ChatClient(DatagramSocket ds){
this.ds=ds;
}
@Override
public void run() {
// TODO Auto-generated method stub
try {
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
String line = null;
while((line=bufr.readLine())!=null){
byte[] buf = line.getBytes();
//使用DatagramPacket将数据封装到该对象包中
DatagramPacket dp =
new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.1.255"),8888);
ds.send(dp);
if("over".equals(line))
break;
}
} catch (Exception e) {
// TODO: handle exception
}
}
}
//ChatServer.java
package Chatroom;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class ChatServer implements Runnable{
private DatagramSocket ds;
public ChatServer(DatagramSocket ds){
this.ds = ds;
}
@Override
public void run() {
// TODO Auto-generated method stub
try {
while(true){
//2 建立数据包
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf,buf.length);
//3 使用接收方法将数据存储到数据包中
ds.receive(dp);
//4 通过数据包的方法解析数据包中的数据 解析其中的数据,比如,地址、端口、数据内容
String ip = dp.getAddress().getHostAddress();
int port = dp.getPort();
String text= new String(dp.getData(),0,dp.getLength());
dp.getData();
System.out.println(ip+":"+port+":"+text);
if(text.equals("over")){
System.out.println(ip+"退出聊天室");
}
//5 关闭资源
//ds.close();
}
} catch (Exception e) {
// TODO: handle exception
}
}
}