UDP编程,使用多线程的时候为什么在run方法中获取不到值?
如图:我将接受到的packet传过来后,在构造方法中能够获取对应的值(可以看到通过构造方法获取到的port是55419),但是如果要在run方法中获取端口号(第三个红框标记部分)等信息,就获取不到,程序变成阻塞中,没有其他报错信息~
我的代码如下:
Server:
package com.socket.socketsender.UDPSoceket; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; public class UDPServer { public static void main(String[] args) throws IOException { //接收请求 DatagramSocket socket = new DatagramSocket(8110);//指定服务器端口 byte[] data = new byte[1024]; DatagramPacket packet = new DatagramPacket(data, data.length);//创建数据报,用于接收客户端发送的数据 System.out.println("========服务器已启动,正在等待客户端发送数据======"); while (true) { socket.receive(packet);//此方法在接收到客户端数据之前会一直阻塞 new Thread(new ThreadUDPServer(socket, packet)).start(); } } private static class ThreadUDPServer implements Runnable { private DatagramPacket packet; private String info; private DatagramSocket socket; private InetAddress address; private int port; public ThreadUDPServer(DatagramSocket socket, DatagramPacket packet) { this.socket = socket; this.packet = packet; this.info = new String(packet.getData(), 0, packet.getLength());//在run方法中获取不到info??? this.address=packet.getAddress(); this.port=packet.getPort(); } @Override public void run() { int test = packet.getPort(); System.out.println("接收到客户端的消息是:" + info); //发送响应信息 byte[] data2 = "这是服务器的响应信息:登录成功".getBytes(); DatagramPacket packet2 = new DatagramPacket(data2, data2.length, address, port); try { socket.send(packet2); } catch (IOException e) { e.printStackTrace(); } } } }
client:
package com.socket.socketsender.UDPSoceket; import java.io.IOException; import java.net.*; public class UDPClient { public static void main(String[] args) throws IOException { try (DatagramSocket socket = new DatagramSocket()) { //发送请求 InetAddress addresses = InetAddress.getByName("localhost"); byte[] data = "用户名:小王;密码:123456".getBytes(); int port = 8110; DatagramPacket packet = new DatagramPacket(data, data.length, addresses, port); byte[] data2 = new byte[1024]; socket.send(packet); //接收响应信息 DatagramPacket packet2 = new DatagramPacket(data2, 0, data2.length); socket.receive(packet2); String info = new String(data2,0,packet2.getLength()); System.out.println("接收到服务器的响应信息:"+info); } } }