Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
执行使用Java套接字的多个单元测试_Java_Unit Testing_Sockets - Fatal编程技术网

执行使用Java套接字的多个单元测试

执行使用Java套接字的多个单元测试,java,unit-testing,sockets,Java,Unit Testing,Sockets,我有两个使用套接字的单元测试。问题是,当我在eclipse中执行它们时,在第二个客户机/服务器测试中总是出现连接拒绝错误。第一个单元测试使用端口9091,第二个单元测试使用端口9092 java.net.ConnectException: Connection refused at java.net.PlainSocketImpl.socketConnect(Native Method) 快速的解决方案是在第二个单元测试开始时添加Thread.sleep(500)。它主要起作用,但并不总是如此

我有两个使用套接字的单元测试。问题是,当我在eclipse中执行它们时,在第二个客户机/服务器测试中总是出现连接拒绝错误。第一个单元测试使用端口9091,第二个单元测试使用端口9092

java.net.ConnectException: Connection refused
at java.net.PlainSocketImpl.socketConnect(Native Method)
快速的解决方案是在第二个单元测试开始时添加
Thread.sleep(500)
。它主要起作用,但并不总是如此

这个错误是怎么回事?如何安全地执行使用套接字的多个单元测试

@Test(timeout = 2000)
public void testBareTest9092() {

    PingerThread pinger = new PingerThread();
    pinger.start();

    String serverAddress = "localhost";
    String testString = "ABCDEF-Hellowrolds";
    try {
        Socket s = new Socket(serverAddress, 9092);

        PrintWriter output = new PrintWriter(s.getOutputStream(), true);
        output.println(testString);

        BufferedReader input = new BufferedReader(new InputStreamReader(
                s.getInputStream()));
        String answer = input.readLine();
        System.out.println(answer);
        System.out.println(testString);
        assertTrue(answer.equals(testString));

        s.close();
        input.close();
        output.close();
    } catch (UnknownHostException e) {
        e.printStackTrace();
        fail("ERROR!");
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        fail("ERROR!");
    }
    pinger.cancel();
}

public class PingerThread extends Thread {
    public int id;

    @Override
    public void run() {
        try {
            ServerSocket listener = new ServerSocket(9092);
            long startTime = System.nanoTime();
            while (!Thread.currentThread().isInterrupted()) {
                try {
                    while (true) {
                        Socket socket = listener.accept();
                        try {
                            BufferedReader in = new BufferedReader(
                                    new InputStreamReader(
                                            socket.getInputStream()));
                            String input = in.readLine();

                            System.out.println("Received:" + input);

                            PrintWriter out = new PrintWriter(
                                    socket.getOutputStream(), true);
                            out.println(input);
                        } finally {
                            socket.close();
                            listener.close();
                        }
                    }
                } finally {
                }
            }
        } catch (Exception consumed) {
        }
    }

    public void cancel() {
        interrupt();
    }
}

出现错误时重试似乎可以解决此问题

Socket s;
try {
    s = new Socket(serverAddress, 9092);
}
catch (IOException e)
{
    // when error, try again after some delay
    Thread.sleep(500);
    s = new Socket(serverAddress, 9092);
}