黑马程序员技术交流社区

标题: 创建套接字时当被指定的端口被专用时换成新端口的问题 [打印本页]

作者: 黑马罗坚    时间: 2012-5-13 00:18
标题: 创建套接字时当被指定的端口被专用时换成新端口的问题
创建套接字时当被指定的端口被专用时跟换端口直到不专用为止该端口为旧端口顺延而成  但问题是当第一次给一个程序发送数据时如何知道接收线程所监听的套接字服务的端口
  我下面的代码中给8888端口和8889端口发送了数据  线程停止5分钟停止完了UdpSend类里datagramSocket的receive()方法照样能接收到UdpSend类里的datagramSocket的send()方法发送的数据 是不是意味着 当用套接字的发送方法时 只要在套接字关闭资源之前 接收端程序打开了就可以接收到发给自己数据?

package aa;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
class UdpSend{
static int port=8888;
public static void main(String[] args) throws InterruptedException {
  //需要注册DatagramSocket服务
  DatagramSocket datagramSocket=null;
  try {
   datagramSocket=new DatagramSocket(port);
   //需要定义发送的数据并按照一定格式封装成数据包
   byte[] data="发送数据完毕".getBytes();
   DatagramPacket datagramPacket=new DatagramPacket(data,data.length,InetAddress.getLocalHost(),8888);
   //通过DatagramSocket服务的send()方法把数据包发送到数据包中的目标IP和 port
   System.out.println("开始发送数据.....");
   datagramSocket.send(datagramPacket);
   datagramPacket.setPort(8889);
//   datagramSocket.send(datagramPacket);
   System.out.println("发送完毕");
   
   
   System.out.println("UdpSend监听"+port+"端口");
   System.out.println("开始接收数据....");
   
   datagramSocket.receive(datagramPacket);
   System.out.println("接收完毕");
   
   //处理接收到的数据
   String ip=datagramPacket.getAddress().getHostAddress();
   int port;
   port=datagramPacket.getPort();
   String dataStr=new String(datagramPacket.getData(),0,datagramPacket.getLength());
   System.out.println("UdpSend类 :发送方ip地址:"+ip+",发送方端口号:"+port+"接收端口号:"+UdpSend.port+"发送的数据:"+dataStr);
  } catch (SocketException e) {
   System.out.println(port+"端口号占用了哦,等待从新分配端口。。。");
   port++;
   main(null);
   //创建数据报文包的时候抛此异常
  } catch (UnknownHostException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
   //接收和发送时发生此异常证明receive()和send()方法掉用了IO资源
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }finally{
   //关闭资源
   if (datagramSocket!=null){
    //这句话在注销套接字服务所开辟的UDP端口和接收发送方法参数的IO资源
    datagramSocket.close();
   
    /*
     * 只有在端口注销前暂停线程才能让后来要监听此端口的程序抛Soceket异常
     * 如果通过循环把1到65535剩余没监听的端口都监听 出现异常捕获不处理
     *  并且不释放资源 不让退出程序 会不会
     * 让通过使用本机端口通讯的程序都打不开
     */
//    try {
//     Thread.sleep(3000);
//    } catch (InterruptedException e) {
//     // TODO Auto-generated catch block
//     e.printStackTrace();
//    }
   
   }
  }
  
  
}
}
class UdpReceive{
static int port=8888;
public static void main(String[] args) {
  //创建一个用户数据报文套接字服务监听port端口
  DatagramSocket datagramSocket=null;
  try {
   datagramSocket=new DatagramSocket(port);
   //指定一个用户数据报文包用来存储用户数据报文套接字服务receive()方法接收到的数据
   DatagramPacket datagramPacket=new DatagramPacket(new byte[1024],1024);
   //从用户数据报文数据包中获取要的数据打印到控制台
   System.out.println("UdpReceive监听"+UdpReceive.port+"端口");
   System.out.println("UdpReceive开始接收数据。。。。。");
   datagramSocket.receive(datagramPacket);
   String ip=datagramPacket.getAddress().getHostAddress();
   int port=datagramPacket.getPort();
   String data=new String(datagramPacket.getData(),0,datagramPacket.getLength());
   System.out.println("接收完毕");
   System.out.println("UDPReceive类:发送方ip地址:"+ip+",发送方端口号:"+port+"接收端口号:"+UdpReceive.port+"发送的数据:"+data);
   
   System.out.println("UdpReceive开始发送数据。。。。。");
   datagramPacket.setAddress(InetAddress.getLocalHost());
   datagramPacket.setPort(port);
   datagramSocket.send(datagramPacket);
   System.out.println("发送完毕");
  } catch (SocketException e) {
   // TODO Auto-generated catch block
   System.out.println(port+"端口冲突");
   port++;
   main(null);
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }finally{
   //关闭资源
   datagramSocket.close();
  }
}
}





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2