Java中的简单TCP客户端/服务器程序

时间:2018-02-28 02:26:03

标签: java tcp

您好我的程序有一个小问题,这是一个简单的客户端/服务器。客户端将文本文件的内容发送到服务器。文本文件只是整数,然后服务器假设发送回文本文件中每个int的最大素数(如果它的素数应该只发回素数而什么都不做)。所以比如说文本文件是5 15 28.运行程序后的结果应该是5 13 23。

这是我的客户端代码:

public class TCPClient {



        public static void main(String[] args) throws Exception{
            try{ 
                Socket mySock = new Socket("127.0.0.1", 12001);
                BufferedReader in = new BufferedReader(
                        new InputStreamReader(mySock.getInputStream()));
                PrintStream out = new PrintStream( mySock.getOutputStream());
                Scanner scan = new Scanner(new File(args[0]));
                String msg = scan.nextLine();
                out.println(msg);
                System.out.println(in.readLine());
                mySock.close();

            }catch (Exception e){
            }
        }
    }

这是我的服务器端代码:

public class TCPServer {
    public static void main(String[] args) throws Exception {
        try{
            ServerSocket mySock = new ServerSocket(12001);
            Socket client = mySock.accept();
            BufferedReader in = new BufferedReader(
                    new InputStreamReader(client.getInputStream()));
            PrintStream out = new PrintStream( client.getOutputStream());

            String[] arr = in.readLine().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]);
                }

            }           


            client.close();
            mySock.close();

        }catch (Exception e){

        }
    }

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

        }   
        return true;
    }

}

当我运行此程序时,我的输出只是文本文件中的第一个数字。因此,如果我的文本文件是1 3 5.我的输出只是1.但是,我的主要算法至少有效,因为如果我的文本文件是8,例如,我的程序将返回7.有人知道为什么会发生这种情况吗? / p>

2 个答案:

答案 0 :(得分:0)

将服务器代码更改为简单测试并打印到System.out

    String[] arr = "1 3 5 6".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){
         System.out.println(intarr[i]);

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

你可以看到它工作正常,但在你的代码中,你的输出是用println写的,所以你的客户端需要循环System.out.println(in.readLine());或者改变你的服务器来使用一行和一些分隔符来写

答案 1 :(得分:0)

在TCPServer中,当打印到outputstream时使用print而不是println

  for(int i = 0; i <arr.length; i++){
         intarr[i] = Integer.parseInt(arr[i]);
         if (prim(intarr[i]) == true){
             out.print(intarr[i]); // use print instead of println

            }else{

                while (!prim(--intarr[i])){

                }

                out.print(intarr[i]); // use print instead of println
            }

        }