關于在UDP多線程獲取IP地址無效的問題
public class UDPserver {
? ? /**
? ? ?* @param args the command line arguments
? ? ?*/
? ? public static void main(String[] args) throws SocketException, IOException {
? ? ? ? // TODO code application logic here
? ? ? ? //創建服務器端DatagramSocket,指定端口(大于1024的端口)
? ? ? ? DatagramSocket socket = new DatagramSocket(8800);
? ? ? ? UDPserverThread thread = null;
? ? ? ? DatagramPacket packet = null;
? ? ? ? int count = 0;
? ? ? ? byte[] data = new byte[1024];
? ? ? ? while (true) {
? ? ? ? ? ??
? ? ? ? ? ? packet = new DatagramPacket(data, data.length);
? ? ? ? ? ? System.out.println("服務器端等待ing");
? ? ? ? ? ? ? ?//接收客戶端發送的數據
? ? ? ? ? ? socket.receive(packet);//此方法在接收到數據報之前會一直阻塞
? ? ? ? ? ? thread = new UDPserverThread(socket,packet);
? ? ? ? ? ? thread.start();
? ? ? ? ? ? count++;
? ? ? ? ? ? System.out.println("客戶端的數量:" + count);
// ? ? ? ? ? ?InetAddress address = socket.getInetAddress();
// ? ? ? ? ? ?System.out.println("當前客戶端的IP:" + address.getHostAddress());
// ? ? ? ? ? ?if(socket!=null)
// ? ? ? ? ? ?socket.close();
? ? ? ? }
? ? }
public class UDPserverThread extends Thread {
? ? /**
? ? ?* 通過多線程實現多用戶鏈接
? ? ?* @param args the command line arguments
? ? ?*/
? ? DatagramSocket socket=null;
? ? DatagramPacket packet=null;
? ? public ?UDPserverThread(DatagramSocket socket,DatagramPacket packet){
? ? ? ? this.socket=socket;
? ? ? ? ? ? //創建數據報,用于接收客戶端發送的數據
? ? ? ? this.packet=packet;
? ? }
? ??
? ??
? ??
? ??
? ? @Override
? ? public void run() {
? ? ? ??
? ? ? ??
? ? ? ? try {
? ? ? ? ? ? //接收信息
? ? ? ? ? ??
? ? ? ? ? ??
? ? ? ? ? ? byte[] data=packet.getData();
? ? ? ? ? ??
? ? ? ? ?
? ? ? ? ? ? //讀取數據
? ? ? ? ? ? String info = new String(data, 0, packet.getLength());
? ? ? ? ? ? System.out.println("----服務器端---接收客戶端消息:" + info);
? ? ? ? ? ??
? ? ? ? ? ? //響應信息
? ? ? ? ? ??
? ? ? ? ? ? //定義客戶端的地址、端口號、數據
? ? ? ? ? ? InetAddress address =packet.getAddress();
? ? ? ? ? ? int port=packet.getPort();
? ? ? ? ? ? byte[] data2="歡迎你".getBytes();
? ? ? ? ? ? //創建數據報,包含響應的數據信息
? ? ? ? ? ? DatagramPacket packet2=new DatagramPacket(data2, data2.length, address, port);
? ? ? ? ? ? //響應客戶端
? ? ? ? ? ? socket.send(packet2);
? ? ? ? ? ? //關閉資源
? ? ? ? ? ??
? ? ? ? } catch (SocketException ex) {
? ? ? ? ? ? Logger.getLogger(UDPserverThread.class.getName()).log(Level.SEVERE, null, ex);
? ? ? ? } catch (IOException ex) {
? ? ? ? ? ? Logger.getLogger(UDPserverThread.class.getName()).log(Level.SEVERE, null, ex);
? ? ? ? }
? ? ? ??
? ? }
}
public class UDPClient {
? ? /**
? ? ?* @param args the command line arguments
? ? ?*/
? ? public static void main(String[] args) throws UnknownHostException, SocketException, IOException {
//定義服務器的地址、端口號、數據
? ? ? ? InetAddress address = InetAddress.getByName("localhost");
? ? ? ? int port = 8800;
? ? ? ? byte[] data = "用戶名:admin;密碼:32001".getBytes();
? ? ? ? //創建數據報,包含發送的數據信息
? ? ? ? DatagramPacket packet = new DatagramPacket(data, data.length, address, port);
? ? ? ? //創建DatagramSocket對象
? ? ? ? DatagramSocket socket = new DatagramSocket();
? ? ? ? //向服務器端發送數據報
? ? ? ? socket.send(packet);
? ? ? ? //接收響應的信息
? ? ? ? //創建數據報接收服務器端響應的數據
? ? ? ? byte[] data2 = new byte[1024];
? ? ? ? DatagramPacket packet2 = new DatagramPacket(data2, data2.length);
? ? ? ? socket.receive(packet2);
? ? ? ? String info = new String(data2, 0, packet2.getLength());
? ? ? ? System.out.println("----客戶端---接收服務器端消息:" + info);
? ? ? ? socket.close();
? ? }
}
在服務器端中我打算模仿TCP獲取客戶端的IP,但是那幾句不注釋掉(就是一開始socket.getInetAddress那里4行)就會出現nullpointerException,沒有獲取到IP地址,請問是什么原因呢?除了這幾行之外都能正常運行的
2016-11-06
好吧,把socket換成packet就可以了,我對象理解錯了
還有服務器端的socket不能關閉