Java TCP客户端/服务器交互

时间:2018-02-28 22:26:29

标签: java sockets tcp tcpclient tcpserver

大家好,我有一个程序,用于从客户端到服务器交换消息,然后通过TCP交换。消息来自作为文件的命令行参数。该文件每行至少有一个整数,每个整数之间总是有一个空格。

这是一个示例文件:

7 3 21 
23 2 8
3 

每一行都被视为一条消息,因此上面的示例共有3条消息。

我的程序所做的是客户端向服务器发送一条消息(一行整数),然后服务器发回一条消息,其中包含每个数字下面的最大素数(如果数字为素数,它什么也不做,并返回该数字)。这适用于我的程序。我的问题是,在发送每一行之后,客户端必须在发送另一条消息(即文件中的另一行)之前等待服务器的响应。我无法找到如何做到这一点的解决方案,坦率地说,我不知道如何判断我的程序是否正在执行此操作(我正在使用eclipse)。我怀疑地雷没有这样做,因为我的输出全部打印在同一行,而不是像文本文件那样在单独的行上打印。这就是我的意思。

示例文件:

8 3 21
5 2 31 3

我的输出:

7 3 19 5 2 31 3

预期产出:

7 3 19
5 2 31 3

正如您所看到的,一切正常,直到发送另一行。

以下是我的3个班级的代码:

public class TCPClient {

    public static void main(String[] args) throws Exception{
        try{ 
            int port = (new Integer(args[1])).intValue();
            Socket mySock = new Socket(args[0], port);
            Scanner in = new Scanner(
                    new InputStreamReader(mySock.getInputStream()));
            PrintStream out = new PrintStream( mySock.getOutputStream());
            Scanner scan = new Scanner(new File(args[2]));

            while(scan.hasNextLine()){
                String msg = scan.nextLine();
                out.println(msg);

            }

            while(in.hasNextLine()){    
            System.out.println(in.nextLine());
            }

            mySock.close();

        }catch (Exception e){
        }
    }
}

更多代码:

public class TCPServer {
    public static void main(String[] args) throws Exception {

        int port = (new Integer(args[0])).intValue();
        ServerSocket socket = new ServerSocket(port);

        while(true){
            Socket connection = socket.accept();

            PrimeFunction request = new PrimeFunction(connection);

            Thread thread = new Thread(request);

            thread.start();

        }
    }
}

最后一点代码:

final class PrimeFunction implements Runnable {
    Socket socket;

    public PrimeFunction (Socket socket) throws Exception{
        this.socket = socket;

    }

    public void run() {
        try{
            processRequest();
        }catch (Exception e){
            System.out.println(e);
        }
    }

    private void processRequest() throws Exception {
        Scanner in = new Scanner(
                new InputStreamReader(socket.getInputStream()));
        PrintStream out = new PrintStream(socket.getOutputStream(), true);
        while(in.hasNextLine()){
            String[] arr = in.nextLine().split(" ");
            int[] intarr = new int[arr.length];

            for(int i = 0; i <arr.length; i++){
                intarr[i] = Integer.parseInt(arr[i]);

                if (prim(intarr[i]) == true){
                    out.println(intarr[i] + " ");

                }else{

                    while (!prim(--intarr[i])){
                    }
                    out.println(intarr[i] + " ");
                }
            }           



        }
        in.close();
        out.close();
        socket.close();
    }

    public static boolean prim(int m){
        int n = m;
        for(int i = 2; i< n/2; i++){
            if(n % i == 0){
                return false;
            }
        }   
        return true;
    }


}

最后的想法:我不确定如何判断我的客户端在发送另一条消息之前是否等待响应。

更新了PrimeFunction类,它现在以正确的格式打印。但是,仍然不知道客户端是否正在等待。

新代码(在ProcessRequest中添加了String输出):

final class PrimeFunction implements Runnable {
    Socket socket;

    public PrimeFunction (Socket socket) throws Exception{
        this.socket = socket;

    }

    public void run() {
        try{
            processRequest();
        }catch (Exception e){
            System.out.println(e);
        }
    }

    private void processRequest() throws Exception {
        Scanner in = new Scanner(
                new InputStreamReader(socket.getInputStream()));
        PrintStream out = new PrintStream(socket.getOutputStream(), true);
        while(in.hasNextLine()){
            String[] arr = in.nextLine().split(" ");
            int[] intarr = new int[arr.length];
            String output = "";

            for(int i = 0; i <arr.length; i++){
                intarr[i] = Integer.parseInt(arr[i]);

                if (prim(intarr[i]) == true){
                    output += intarr[i] + " ";
                    //out.println(intarr[i] + " ");

                }else{

                    while (!prim(--intarr[i])){
                    }
                    output += intarr[i] + " ";
                    //out.println(intarr[i] + " ");
                }
            }           

            out.println(output);
            output = "";

        }

        in.close();
        out.close();
        socket.close();
    }

    public static boolean prim(int m){
        int n = m;
        for(int i = 2; i < n / 2; i++){
            if(n % i == 0){
                return false;
            }
        }   
        return true;
    }


}

0 个答案:

没有答案