【问题标题】:Java socketserver how to test?Java socketserver如何测试?
【发布时间】:2016-04-27 03:11:56
【问题描述】:

我想通过 Java 中的套接字连接接收文本文件,我设置了服务器端,但在继续使用客户端之前,我想知道我制作的代码是否有效,除了我不知道如何测试它.

任何帮助将不胜感激..

编辑:我知道端口已打开并正在侦听请求,我想要测试如果它收到任何内容会发生什么,它是否会从输入创建一个文件,我可以通过模拟来测试它(发送文件或字节我不知道)?

public class Server {

    private static int port = 8080;
    private static int maxConnections = 100000;

    // Listen for incoming connections and handle them
    public static void startServer() {
        int i = 0;

        try {
            ServerSocket listener = new ServerSocket(port);
            Socket server;

            System.out.println("Started server on port:" + port);

            while ((i++ < maxConnections) || (maxConnections == 0)) {
                RunServer connection;

                server = listener.accept();
                RunServer conn_c = new RunServer(server);
                Thread t = new Thread(conn_c);
                t.start();

                System.out.println("Created new thread");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

class RunServer implements Runnable {
    private Socket server;

    RunServer(Socket server) {
        this.server = server;
    }

    public void run() {
        int bytesRead;
        int current = 0;
        BufferedOutputStream bufferedOutputStream = null;
        FileOutputStream fileOutputStream = null;
        DataInputStream clientData = null;
        File file = null;

        try {
            // creating connection.
            System.out.println("connected.");

            // receive file
            byte[] byteArray = new byte[6022386];
            System.out.println("Please wait downloading file");

            // reading file from socket
            InputStream inputStream = server.getInputStream();
            file = new File("toread.txt");
            clientData = new DataInputStream(inputStream);
            fileOutputStream = new FileOutputStream(file);
            bufferedOutputStream = new BufferedOutputStream(fileOutputStream);
            bytesRead = inputStream.read(byteArray, 0, byteArray.length);

            current = bytesRead;
            do {
                bytesRead = inputStream.read(byteArray, current, (byteArray.length - current));
                if (bytesRead >= 0)
                    current += bytesRead;
            } while (bytesRead > -1);

            bufferedOutputStream.write(byteArray, 0, current);
            bufferedOutputStream.flush();

            ReaderHelper.readTextFile(file);

        } catch (IOException e) {
            e.printStackTrace();
        } catch (NumberFormatException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                if (fileOutputStream != null)
                    fileOutputStream.close();
                if (bufferedOutputStream != null)
                    bufferedOutputStream.close();
                if (clientData != null)
                    clientData.close();
                if (server != null)
                    server.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

【问题讨论】:

  • 您是否想对这段代码进行单元测试?

标签: java multithreading sockets server text-files


【解决方案1】:

一开始你可能在阅读循环中有一个错误

byte[] byteArray = new byte[6022386];
//some code
do {
    bytesRead = inputStream.read(byteArray, current, (byteArray.length - current));
    if (bytesRead >= 0)
        current += bytesRead;
} while (bytesRead > -1);

如果文件长度可能大于byteArray.length,则(byteArray.length - current) 将为负数。

我建议您使用较小的数组,例如byte[] byteArray = new byte[8192]; 并像这样读取文件

while ((bytesRead = in.read(byteArray)) > 0 ) {
    current += bytesRead;
    bufferedOutputStream.write(byteArray, 0, bytesRead);
}

将其逐块存储到磁盘中。并且在退出while循环后current将保持读取的字节总数。

从另一个线程发送文件,该线程将连接到服务器

Socket clientSocket = new Socket("localhost", Server.port);
BufferedReader input = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
DataOutputStream output = new DataOutputStream(clientSocket.getOutputStream());
FileInputStream fileInput = new FileInputStream("fileName");
byte[] buffer = new byte[8192];
while(fileInput.read(buffer) != -1){
    output.write(buffer, 0, length);
}
//close resources

【讨论】:

    【解决方案2】:

    那么,您的套接字将在端口 8080 上启动,对吗?

    您可以打开浏览器并输入:http://localhost:8080。浏览器将创建一个连接和行

    server = listener.accept();

    将“解锁”。如果您只想测试套接字是否正在侦听,它会做。阅读流,您将看到 HTTP 协议的第一条消息。

    【讨论】:

    • 我知道端口已打开并正在侦听请求,我想要测试如果它收到任何内容会发生什么,它是否会从输入创建一个文件,我可以通过模拟来测试它(发送一个文件或字节我不知道如何模拟这个)?
    猜你喜欢
    • 2011-12-04
    • 2015-08-19
    • 2011-01-28
    • 2019-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-06
    • 2011-07-14
    相关资源
    最近更新 更多