關(guān)于在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
? ? ? ? //創(chuàng)建服務(wù)器端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("服務(wù)器端等待ing");
? ? ? ? ? ? ? ?//接收客戶端發(fā)送的數(shù)據(jù)
? ? ? ? ? ? socket.receive(packet);//此方法在接收到數(shù)據(jù)報(bào)之前會(huì)一直阻塞
? ? ? ? ? ? thread = new UDPserverThread(socket,packet);
? ? ? ? ? ? thread.start();
? ? ? ? ? ? count++;
? ? ? ? ? ? System.out.println("客戶端的數(shù)量:" + count);
// ? ? ? ? ? ?InetAddress address = socket.getInetAddress();
// ? ? ? ? ? ?System.out.println("當(dāng)前客戶端的IP:" + address.getHostAddress());
// ? ? ? ? ? ?if(socket!=null)
// ? ? ? ? ? ?socket.close();
? ? ? ? }
? ? }
public class UDPserverThread extends Thread {
? ? /**
? ? ?* 通過多線程實(shí)現(xiàn)多用戶鏈接
? ? ?* @param args the command line arguments
? ? ?*/
? ? DatagramSocket socket=null;
? ? DatagramPacket packet=null;
? ? public ?UDPserverThread(DatagramSocket socket,DatagramPacket packet){
? ? ? ? this.socket=socket;
? ? ? ? ? ? //創(chuàng)建數(shù)據(jù)報(bào),用于接收客戶端發(fā)送的數(shù)據(jù)
? ? ? ? this.packet=packet;
? ? }
? ??
? ??
? ??
? ??
? ? @Override
? ? public void run() {
? ? ? ??
? ? ? ??
? ? ? ? try {
? ? ? ? ? ? //接收信息
? ? ? ? ? ??
? ? ? ? ? ??
? ? ? ? ? ? byte[] data=packet.getData();
? ? ? ? ? ??
? ? ? ? ?
? ? ? ? ? ? //讀取數(shù)據(jù)
? ? ? ? ? ? String info = new String(data, 0, packet.getLength());
? ? ? ? ? ? System.out.println("----服務(wù)器端---接收客戶端消息:" + info);
? ? ? ? ? ??
? ? ? ? ? ? //響應(yīng)信息
? ? ? ? ? ??
? ? ? ? ? ? //定義客戶端的地址、端口號(hào)、數(shù)據(jù)
? ? ? ? ? ? InetAddress address =packet.getAddress();
? ? ? ? ? ? int port=packet.getPort();
? ? ? ? ? ? byte[] data2="歡迎你".getBytes();
? ? ? ? ? ? //創(chuàng)建數(shù)據(jù)報(bào),包含響應(yīng)的數(shù)據(jù)信息
? ? ? ? ? ? DatagramPacket packet2=new DatagramPacket(data2, data2.length, address, port);
? ? ? ? ? ? //響應(yīng)客戶端
? ? ? ? ? ? socket.send(packet2);
? ? ? ? ? ? //關(guān)閉資源
? ? ? ? ? ??
? ? ? ? } 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 {
//定義服務(wù)器的地址、端口號(hào)、數(shù)據(jù)
? ? ? ? InetAddress address = InetAddress.getByName("localhost");
? ? ? ? int port = 8800;
? ? ? ? byte[] data = "用戶名:admin;密碼:32001".getBytes();
? ? ? ? //創(chuàng)建數(shù)據(jù)報(bào),包含發(fā)送的數(shù)據(jù)信息
? ? ? ? DatagramPacket packet = new DatagramPacket(data, data.length, address, port);
? ? ? ? //創(chuàng)建DatagramSocket對(duì)象
? ? ? ? DatagramSocket socket = new DatagramSocket();
? ? ? ? //向服務(wù)器端發(fā)送數(shù)據(jù)報(bào)
? ? ? ? socket.send(packet);
? ? ? ? //接收響應(yīng)的信息
? ? ? ? //創(chuàng)建數(shù)據(jù)報(bào)接收服務(wù)器端響應(yīng)的數(shù)據(jù)
? ? ? ? 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("----客戶端---接收服務(wù)器端消息:" + info);
? ? ? ? socket.close();
? ? }
}
在服務(wù)器端中我打算模仿TCP獲取客戶端的IP,但是那幾句不注釋掉(就是一開始socket.getInetAddress那里4行)就會(huì)出現(xiàn)nullpointerException,沒有獲取到IP地址,請(qǐng)問是什么原因呢?除了這幾行之外都能正常運(yùn)行的
2016-11-06
好吧,把socket換成packet就可以了,我對(duì)象理解錯(cuò)了
還有服務(wù)器端的socket不能關(guān)閉