1

我的任务是首先编写一个多线程客户端服务器应用程序,然后用大量客户端(100 个客户端每个发送 1000 条消息)对其进行测试。所以我有正常工作的控制台客户端服务器。客户端有两个线程,一个用于输入,另一个用于输出。现在我开始编写测试。在我看来,它的工作模式应该是:执行应该等待接受新客户端的服务器线程,然后我将执行 InputThreads(将其连接到服务器)并在循环中写入测试协议。我对吗?

所以我写了这样的东西:

public class ServerLoadTest {
    private static final Logger LOG = Logger.getLogger(ServerLoadTest.class);
    private ExecutorService clientExec = Executors.newFixedThreadPool(100);
    private ExecutorService serverExec = Executors.newFixedThreadPool(100);

    @Test
    public void test() throws IOException, JAXBException, XMLStreamException, ParserConfigurationException, SAXException, InterruptedException {        
        LOG.trace("Start testing");     
        serverExec.execute(new TestServerThread());     

        for (int i = 0; i < 100; i++) { 
            clientExec.execute(new TestClientThread());
        }

        Assert.assertTrue(true);
        LOG.trace("All working fine");
        clientExec.shutdown();
    }

}


class TestClientThread implements Runnable {
    private static final Logger LOG = Logger.getLogger(TestClientThread.class);
    private ExecutorService outputExec = Executors.newFixedThreadPool(2);

    public TestClientThread() {
        new Thread(this);
    }

    @Override
    public void run() {

        try {
            LOG.trace("Starting Socket");
            Socket s = new Socket("localhost", 4444);
            OutputThread spamming = new OutputThread(s, new PrintWriter(s.getOutputStream(), true), new BufferedReader(
                    new InputStreamReader(s.getInputStream())));
            exec.execute(spamming);

            spamming.getOut().println("HO HO Ho HO HO");

            InputThread getSpamAnswer = new InputThread(s, new BufferedReader(new InputStreamReader(s.getInputStream())));
            outputExec.execute(getSpamAnswer);

        } catch (IOException | JAXBException | XMLStreamException | ParserConfigurationException | SAXException e) {
            e.printStackTrace();
        }
    }
}

class TestServerThread implements Runnable {
    private Server king = mock(Server.class);

    public TestServerThread() {
        new Thread(this);
    }

    @SuppressWarnings("static-access")
    @Override
    public void run() {
        try {
            king.main(null);
        } catch (IOException | JAXBException | ParserConfigurationException | SAXException e) {
            Assert.assertFalse(false);
        }
    }
}

首先,服务器上有很多 LOG.trace,但我在控制台中没有,当我调试时收到客户端无法连接的异常(我认为它没有时间这样做) . 我应该如何同步这个?

PS Server 是多线程的,并且支持许多客户端。现在我只想从源头测试它。

4

1 回答 1

0

您的防火墙是否打开,允许该端口上的传入连接?

此外,您并没有真正复制客户端-服务器架构,因为只有一个套接字被所有“客户端”线程共享。这可能是您的错误的来源(多个线程访问同一个对象 - 在本例中为流)。

请参阅 Oracle 的此文档,了解如何使用单独的进程和套接字正确设置客户端/服务器演示:http: //docs.oracle.com/javase/tutorial/networking/sockets/clientServer.html这将允许您模拟什么实际上会发生,并且对代码进行了很好的解释。

于 2012-06-14T17:53:47.347 回答