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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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.有人知道为什么会发生这种情况吗?

答案

通过将您的服务器代码更改为简单的测试并打印到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());或更改您的服务器使用一行和一些分隔符写入

另一答案

在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
            }

        }           

以上是关于Java中的简单TCP客户端/服务器程序的主要内容,如果未能解决你的问题,请参考以下文章

Java 通过实现简单的TCP通信程序来理解TCP通信

Java案例:基于TCP的简单聊天程序

Java实现一个简单的网络聊天程序

编写Java程序,实现一个简单的echo程序(网络编程TCP实践练习)

Java回顾之网络通信

异常和TCP通讯