你是要建立ServerSocket吧,你try catch一次就可以啦
try {
   Server socket = new ServerSocket(1111);
}catch(IOexception ioe) {
   //不能建立断口(可能是你没有权限或者已经被占用了)
}

解决方案 »

  1.   

    我是采用udp数据包,浏览器端applet监听由服务器发送数据的一个端口,如果由系统分配端口,得在二者间多传送一次数据。要是能在监测到该端口被占用的同时,关闭这个端口,重新建立连接就好了。
      

  2.   

    除非已经打开的端口是自己用程序来打开的.
    现在还不知道java能不能如此实现你所说的功能。
      

  3.   

    to gja106:是的,是我自己写的网络程序,运行第一遍后,就占用了端口,后来再次运行这个程序的时候就提示address in use:can't bind.
    怎么解决?
      

  4.   

    那你把端口关闭不就行了吗,DatagramSocket不是有个close方法。
    我现在不点不理解你的要求了。
    是运行两次同一程序,还是两个不同的程序要用同一端口,还是?
      

  5.   

    两种情况都有,对于第一种如果判断到端口占用,怎么实现close方法?
    注:程序是applet嵌入网页中,源程序如下:
    package hjq;import java.awt.*;
    import java.applet.*;
    import java.net.*;
    import java.sql.*;
    import java.util.*;
    import javax.swing.*;
    import java.io.*;public class hjApplet extends java.applet.Applet implements Runnable{
      String userID=null,sfbs=null;
      String servernm;
      Statement stmt;
      ResultSet rs=null;
      Connection conn;
      String ip;
      final static int DGram_Port=1090;
      DatagramSocket s=null;  public hjApplet() {
      }  public void init(){
        userID=getParameter("userID");
        ip=getParameter("userIP");
        try{
          servernm=getDocumentBase().getHost();//"210.42.147.52";
          DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
          String url="jdbc:oracle:thin:@210.42.147.52:1521:Oradb";
          conn=DriverManager.getConnection(url,"admin","admin");
          stmt=conn.createStatement();
          String sql="select user_sfbs from user_table where user_id='"+userID+"'";
          rs=stmt.executeQuery(sql);
          while(rs.next())
            sfbs=rs.getString(1);
          rs.close();
          stmt.close();
        }catch(Exception eurl){
          eurl.printStackTrace();
        }
        new Thread(this).start();
      }  public void run(){
        try{
          s=new DatagramSocket(DGram_Port);
          while(true){
          try{
            byte[] recbuf=new byte[50];
            DatagramPacket dp=new DatagramPacket(recbuf,recbuf.length);
            s.receive(dp);
            String recstr=new String(dp.getData(),0,dp.getLength());
            String appip=dp.getAddress().toString();
            dealdp(recstr);
          }catch(Exception rexcept){
            rexcept.printStackTrace();
          }
          }
        }catch(Exception rexcept1){
            rexcept1.printStackTrace();
        }
      }  void dealdp(String recstr){
        String sendstr=new String();
        sendDatagram("6#"+recstr);
        
      }
      void sendDatagram(String sendstr){
        DatagramSocket socket=null;
        try{
                socket=new DatagramSocket();
                byte[] buf=new byte[20];
                buf=sendstr.getBytes();
                InetAddress ip=InetAddress.getByName(servernm);
                DatagramPacket dp=new DatagramPacket(buf,buf.length,ip,DGram_Port);
                socket.send(dp);
                socket.close();
        }catch(Exception dperr){
        }
      }  public void dispose(){
        try{
       s.close();
        }catch(Exception closes){}
      }
    }
    请指教,谢谢!
      

  6.   

    如果能关闭别人的端口,java就成了最不安全的语言了.....
    谁打开的端口就应该由谁去关闭.
      

  7.   

    1.打开端口之前,尝试去连接你认为已经打开的本地端口,根据返回的异常来决定该端口的使用情况(捕捉到该端口已经打开的异常才要往下走,否则得...);如果连接成功,发一个关闭该端口的信息(这要在你的程序中自己定义协议了)。
    2.jvm有没有实现共享内存。如果实现也就好办了。
      

  8.   

    try{
          s=new DatagramSocket(DGram_Port);
    }catch(Exception rexcept1){
            rexcept1.printStackTrace();
            try{s.close();}catch(Exception e){}
    }
    如果DGram_Port端口被占用,则捕捉到异常,这时关闭socket,然后再连接一次这个端口,是吗?
      

  9.   

    如果这个端口对DatagramSocket只是发送,你怎么办?
    用个简单的笨拙办法吧,建个文件(xx.loc)里边放一个标志信息。要用某个端口必需到该文件去登记,如果端口占用标志已经有,你再放一个强迫该端口关闭的标志信息到文件上去。占用端口的程序测试到关闭标志信息就自动关闭释放端口。有共享内存就好了。
      

  10.   

    共享内存在Java中的实现和应用
    http://www-900.ibm.com/developerWorks/java/l-memshare/index.shtml
      

  11.   

    没关闭的port交给了操作系统管理,除非用native代码,否则可能无法实现。