亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

關于在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地址,請問是什么原因呢?除了這幾行之外都能正常運行的

正在回答

1 回答

好吧,把socket換成packet就可以了,我對象理解錯了

還有服務器端的socket不能關閉

0 回復 有任何疑惑可以回復我~

舉報

0/150
提交
取消

關于在UDP多線程獲取IP地址無效的問題

我要回答 關注問題
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號