问答详情
源自:4-2 编程实现基于 UDP的 Socket 通信之服务器端

为何在客户端创建多个DatagramSocket对象,会出现阻塞呢

package com.test;
/*
 * 客户端类
 */
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.UnknownHostException;

public class UDPclient {

	public static void main(String[] args) throws IOException {
		/*
		 * 向服务端发送信息
		 */
		//定义客户端地址、端口和数据
		InetAddress address=InetAddress.getLocalHost();
		int port=8800;
		byte[] data="user:tom;key:123".getBytes();
		//创建DatagramPacket对象,包含数据信息
		DatagramPacket packet=new DatagramPacket(data, data.length, address, port);
		//创建DatagramSocket对象
		DatagramSocket socket=new DatagramSocket();
		//发送数据
		socket.send(packet);
		/*
		 * 接收服务端信息
		 */
		//创建另一个DatagramSocket对象
		DatagramSocket socket2=new DatagramSocket();
		//创建数据报,用于接收信息
		byte[] data2=new byte[1024];
		DatagramPacket packet2=new DatagramPacket(data2, data2.length);
		//接收信息
		socket2.receive(packet2);
		//输出信息
		String reply=new String(data2);
		System.out.println("我是客户端,服务器说:"+reply);
		//关闭资源
		socket.close();
		socket2.close();

	}

}


提问者:夜还没黑 2016-07-02 17:24

个回答

  • bigfire
    2016-07-02 22:50:10

    刚刚有点问题,应该是在37行代码之前加一句socket2.send(packet)

  • bigfire
    2016-07-02 22:47:11

    我没有实际运行你的代码,只是猜测一下:是否阻塞在代码的第37行了呢?

    第37行socket2.receive(packet2);是在接受服务端的响应,但是你的这个socket2并没有向服务端发消息,所以也就不会收的服务端的响应。

    可以尝试在37行代码之前加一句socket2.send(packet2);  看看是否还阻塞。