3

我有一个类是套接字客户端,我正在尝试对其方法进行单元测试。测试要求我在每次测试之前启动一个套接字服务器,所以我使用:

@Before
public void setUp() {
    if (myServerSocket == null) {
    Thread myThread = new Thread() {
        public void run() {
            DataInputStream dis = null;
            DataOutputStream dos = null;
            try {
                ServerSocket myServer = new ServerSocket(port);
                myServerSocket = myServer.accept();
                dis = new DataInputStream(myServerSocket.getInputStream());
                dos = new DataOutputStream(myServerSocket.getOutputStream());
                byte[] bytes = new byte[10];
                dis.read(bytes);
                boolean breakLoop = false;
                do {
                    if (new String(bytes).length() != 0) {
                        dos.writeBytes(serverMessage + "\n");
                        dos.flush();
                        breakLoop = true;
                        dos.writeBytes("</BroadsoftDocument>" + "\n");
                        dos.flush();
                    }
                } while (!breakLoop);
            } 
            catch (IOException e) {
                e.printStackTrace();
            }
        }
    };
    myThread.start();
    }
} 

每次测试后,我都会尝试关闭服务器套接字,以便重新打开服务器套接字以进行下一次测试:

@After
public void tearDown() throws IOException, BroadsoftSocketException {
    System.out.println("@After");
    if (myServerSocket != null) {
        myServerSocket.close();
        myServerSocket = null;
            try {
                Thread.sleep(5000);
            } 
            catch (InterruptedException e) {
                // do nothing.
            }
    }
}

但是,在从第二个测试开始的每个测试之前,我都会收到“java.net.BindException:地址已在使用:JVM_Bind”。我意识到我正在尝试为每个测试使用相同的端口,但不应该关闭套接字以释放端口?

4

2 回答 2

4

TIME_WAIT当您尝试重新连接时,您的套接字很可能仍处于状态。我建议模拟这种外部依赖项,但如果您确实发现自己想要继续使用真正的套接字,那么请尝试设置重新绑定选项。在您的设置功能中,而不是ServerSocket myServer = new ServerSocket(port);do :

final ServerSocket myServer = new ServerSocket();
myServer.setReuseAddress(true);
myServer.bind(new java.net.InetSocketAddress(port));
于 2013-02-06T15:39:32.167 回答
1
  1. 你已经在“setUp”中关闭了你的服务器套接字,你真的应该在一个finally块中完成它。
  2. 端口可能不会立即释放。ServerSocket您可以通过将'reuseAdress设置为 来避免这种情况true。请参阅setReuseAddress

我是第二个 SimonC:也许你最好一开始就避开插座。

于 2013-02-06T15:35:36.540 回答