使用ServerSockets和Sockets进行多线程JUnit测试

时间:2013-04-16 02:55:06

标签: java multithreading

我正在尝试为我编写的服务器/客户端编写JUnit测试,因此我创建了充当服务器的Runnable,并且我当前的线程充当客户端。在尝试写入客户端套接字的输出流之前,我在服务器Runnable上调用start()。但是,我的程序总是在Socket client = new Socket("hostname", 0);之后终止,我不知道为什么。我的猜测是因为我试图在同一个测试中创建套接字和客户端?因此,将ip绑定为客户端并同时侦听该ip会导致不正常的行为?它是否正确?我该如何解决这个难题?

public void test() {
        int result;
        String strMsg = "dasda";
        try {
            Thread serverThread = new Thread(new ServerRunnable());
            serverThread.start();
            Socket client = new Socket("hostname", 0);
            OutputStream os = client.getOutputStream();
            os.write(strMsg.getBytes());
            InputStream is = client.getInputStream();
            while (true){
                result = is.read();
                ByteBuffer bb = ByteBuffer.allocate(4);
                bb.putInt(result);
                String input = new String(bb.array());
                if (input=="Success") return;
            }
        } catch (IOException e1){
            fail("IOException on client");
        }

    }

    class ServerRunnable implements Runnable {
        ServerSocket server;
        public ServerRunnable(){
            server = new ServerSocket(0);
        }
        public void run(){
            try {
                active = true;
                    while (active) {
                     Socket sock = server.accept();
                    }
            } catch (IOException e1){
                fail("IOException in Server");
            }
        }
    }

1 个答案:

答案 0 :(得分:6)

new ServerSocket(0)将创建一个侦听任何空闲端口的服务器,每次运行测试时该端口都会发生变化。 new Socket("hostname", 0)虽然试图专门连接到将失败的端口0。

由于您首先初始化服务器,然后可以在getLocalPort()上调用ServerSocket以获取服务器正在侦听的端口,然后在创建客户端时使用此端口号{{1} }。

您可能还需要将主机从Socket更改为"hostname",以便它可以连接到本地计算机上的端口。

以下是根据您的代码改编的示例。要查看的主要项目是"localhost"

Socket client = new Socket("localhost", sr.getPort());