使用Java的DatagramSocket实现客户端和服务器端通信
示例:
代码如下:
客户端
package udp;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
/**
* 客户端
*/
public class Cilent {
public void start(){
try{
/**
* 向服务端发送数据的步骤:
* 1.创建好Socket(一次就行)
* 2.准备数据
* 3.创建数据包
* 4.将数据存入包中(2、3是一步完成的)
* 5.将数据包通过socket发送给服务端
*/
DatagramSocket socket = new DatagramSocket();
String str = "你好!服务端!";
byte[] data = str.getBytes("UTF-8");
//打包:准备包裹,填写地址,装入数据
InetAddress address = InetAddress.getByName("localhost");
int port = 8088;
//创建发送包
DatagramPacket sendPacket =
new DatagramPacket(data, data.length, address, port);
//将包发送出去
socket.send(sendPacket);
//接收服务端的信息
byte[] buf = new byte[50];
DatagramPacket re = new DatagramPacket(buf, buf.length);
socket.receive(re);
byte[] b = re.getData();
int len = re.getLength();
String info = new String(b,0,len,"UTF-8");
System.out.println("服务端说:"+info);
}catch(Exception e){
e.printStackTrace();
}
}
public static void main(String[] args) {
Cilent c = new Cilent();
c.start();
}
}
服务端:
package udp;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
/**
* 服务端
*/
public class Server {
//服务端的启动方法
public void start(){
try{
/**
* 接受包的步骤:
* 1.创建Socket(一次)
* 2.创建一个合适大小的包
* 3.通过socket接受数据到包中
* 4.拆包取数据
*/
DatagramSocket socket = new DatagramSocket(8088);
byte[] data = new byte[100];
DatagramPacket recePacket =
new DatagramPacket(data, data.length);
//接收数据到包中,该方法是一个阻塞方法,当接收到数据时才执行
socket.receive(recePacket);
//拆包拿数据
byte[] d = recePacket.getData();
//有效数据长度
int dlen = recePacket.getLength();
/**
* String (byte[] buf,int offset,int len,String charsetName)
* 将给定的字节数组中,从offset处开始连续len个字节,再根据给定的字符集转换为字符串
*/
String info = new String(d,0,dlen,"UTF-8");
System.out.println("客户端说:"+info);
//回复客户端
String str = "你好!客户端!";
byte[] buf = str.getBytes("UTF-8");
//在恢复发包人时,通过接受包的对象获取发包人的地址和端口(这是区别)
//按照发包人的地址和端口回复
InetAddress address = recePacket.getAddress();
int port = recePacket.getPort();
DatagramPacket sendPacket =
new DatagramPacket(buf, buf.length, address, port);
socket.send(sendPacket);
}catch(Exception e){
e.printStackTrace();
}
}
public static void main(String[] args) {
Server s = new Server();
s.start();
}
}