簡體   English   中英

執行使用Java套接字的多個單元測試

[英]Executing multiple unit tests that use Java socket

我有兩個使用套接字的單元測試。 問題是,當我在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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM