用戶端代碼
package com.imooc;
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 UDPClient {
public static void main(String[] args) throws IOException {
//1.定義伺服器 的位址,端口号,資料
InetAddress address=InetAddress.getByName("localhost");
int port=8800;
byte[] data="使用者名:admin,密碼:123".getBytes();//儲存到位元組數組中
//2.建立資料報包含發送的資料資訊
DatagramPacket packet=new DatagramPacket(data, data.length, address, port);
//3.建立DatagramSocket對象
DatagramSocket socket=new DatagramSocket();
//4.向伺服器端發送資料報
socket.send(packet);
//1.建立資料報,用于接受伺服器端發送過來的資料
byte[] data2=new byte[1024];
DatagramPacket packet2=new DatagramPacket(data2, data2.length);
//2.接收伺服器響應資料
socket.receive(packet2);
//3.讀取資料
String reply=new String(data2, 0, packet.getLength());
System.out.println("我是用戶端,伺服器說:"+reply);
//4.關閉資源
socket.close();
}
}
伺服器端代碼
package com.imooc;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
public class UDPLianxiServer {
public static void main(String[] args) throws IOException {
//1.建立伺服器端DatagramSocket,指定端口
DatagramSocket socket=new DatagramSocket(8800);
// //2.建立資料報,用于接受用戶端發送過來的資料
// byte[] data=new byte[1024];
// DatagramPacket packet=new DatagramPacket(data, data.length);
// //3.接收用戶端發送的資料
// System.out.println("伺服器端已經啟動,等待用戶端發送資料");
// socket.receive(packet);//此方法在接收到資料前會一直阻塞狀态
int count=0;
while (true) {
byte[] data=new byte[1024];
DatagramPacket packet=new DatagramPacket(data, data.length);
//3.接收用戶端發送的資料
System.out.println("伺服器端已經啟動,等待用戶端發送資料");
socket.receive(packet);//此方法在接收到資料前會一直阻塞狀态
count++;
System.out.println("目前登入使用者:"+count);
LianxiThread lianxiThread =new LianxiThread(packet, socket);
lianxiThread.start();
}
// //4.讀取資料 //擷取packet的長度
// String info=new String(data, 0, packet.getLength());
// System.out.println("我是伺服器,用戶端說"+info);
//
//
// //1.定義用戶端的位址,端口号,資料
// InetAddress address=packet.getAddress();//通過資料報來擷取
// int port=packet.getPort();
// byte[] data2="歡迎你!".getBytes();
// //2.建立資料報,包含響應的資料
// DatagramPacket packet2=new DatagramPacket(data2, data2.length, address, port);
// socket.send(packet2);
// //關閉資源
// socket.close();
}}
建立Thread線程類,需要繼承Thread 在接收用戶端發送的資料時出現了問題,接收不到用戶端發的資訊,但用戶端可以接收到伺服器端的資訊,把(data, 0, packet.getLength())裡的data換成packet.getData()就能擷取到
//String info=new String(data, 0, packet.getLength());
//4.讀取資料 //擷取packet的長度
String info=new String( packet.getData(), 0, packet.getLength());
package com.imooc;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class LianxiThread extends Thread{
DatagramPacket packet=null;
DatagramSocket socket=null;
public LianxiThread(DatagramPacket packet,DatagramSocket socket){
this.packet=packet;
this.socket=socket;
}
public void run(){
// byte[] data=new byte[1024];
//String info=new String(data, 0, packet.getLength());
//4.讀取資料 //擷取packet的長度
String info=new String(packet.getData(), 0, packet.getLength());
System.out.println("我是伺服器,用戶端說"+info);
//1.定義用戶端的位址,端口号,資料
InetAddress address=packet.getAddress();//通過資料報來擷取
int port=packet.getPort();
byte[] data2="歡迎你!".getBytes();
//2.建立資料報,包含響應的資料
DatagramPacket packet2=new DatagramPacket(data2, data2.length, address, port);
try {
socket.send(packet2);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//關閉資源
// socket.close();
}
}
測試結果:首先運作伺服器,再運作用戶端
伺服器端:

我們修改一下用戶端發送的内容再看:
這時伺服器就顯示有兩個使用者登入
用戶端: