Socket通信之计算圆面积

Posted Yienfong_Chueng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Socket通信之计算圆面积相关的知识,希望对你有一定的参考价值。

之前课堂上学习java时老师主要讲的是java基础,面向对象特性、java高级特征,异常处理以及输入输出流。其中面向对象特性讲的尤为重点,课时最多。(其实在学java之前我们还开了一门C#课,当时也讲了面向对象的特征,类什么的,也讲得蛮详细的,后面的课也就没来得及讲就期末了);然后学java也是重点讲前面的课,导致后面的线程,套接字,JDBC等没有讲,老师说自己想学习的就自己学吧。我也有把java前面的知识巩固过,把教科书看了好几遍,就是后面老师没讲的自己看也是懵懵懂懂的;现在就认认真真看教科书以及学习,需要补充的就参考下别人的博客文章以及看一下视频教学。
哈哈,突然发现,我没有看过《java编程思想》之类的书,就单单看学校这本教科书,一遍又一遍,还是觉得学到很多东西,而且每看一遍就有不同的领悟。真是应了一句话:书不在于厚,在于你能读薄。
言归正传,我看到教科书后面有一道习题,就是编写一个客户端/服务器端程序,服务器端的功能是计算圆的面积。客户端将圆的半径发送给服务器端,服务器端将计算得出的圆面积返回给客户端,并在客户端显示。
当时写出来后出错,后来我参考了别人的例子,发现用的输入输出流是DataInputStream和DataOutputStream;

服务器线程处理:

public class ServerThread extends Thread
/*
 * 服务器线程处理类*/
    Socket socket;和本线程相关的socket
    DataInputStream dis;
    DataOutputStream dos;   
    public ServerThread(Socket socket) throws IOException      
        this.socket = socket;
        //获取数据输入流
        dis=new DataInputStream(socket.getInputStream());
        //获取数据输出流
        dos=new DataOutputStream(socket.getOutputStream());
        //启动run()方法
        start();
    
    //线程执行的操作,响应客户端的请求
    public void run()
        try        
            boolean flag=true;
            while(flag)
                //读取客户端发送到数据
                String req=dis.readUTF();//从socket中读取数据
                System.out.println("###服务器接收到客户端的数据为(圆的半径):"+req);
                if(req.equals("end")==false)
                    String area=Cal(req);//计算圆面积
                    dos.writeUTF(area);//向socket dos写数据
                    dos.flush(); //清空缓冲区,立即发送
                    System.out.println("客户端您好,返回给您的答案是"+area);
                else
                    flag=false;
                    dos.writeUTF("end");//向socket dos写数据
                    dos.flush();//清空缓冲区,立即发送
                    System.out.println("S服务结束!");
                

                       
            socket.close();
            dis.close();
            dos.close();    

         catch (IOException e) 

            e.printStackTrace();
        
    

    //计算圆面积的功能
    private String Cal(String req) 
        double r=0.0;
        try 
            r=Double.parseDouble(req);//将String类型的半径转换为double型
         catch (NumberFormatException e) 
            return "输入的数据格式不对!";
        
        if(r<0) return "输入数据不能小于0";
        double S=r*r*Math.PI;
        return Double.toString(S);//将double型转化成String类型返回
    


服务器端:

public class Server 
    static ServerSocket server;
    public static void main(String[] args) 
        try 
            //创建一个服务器端ServerSocket,指定绑定端口,并监听
            server=new ServerSocket(8855);
            Socket socket=null;
            //记录客户端的数量
            int count=0;
            System.out.println("####服务器即将启动,等待客户端的连接####");
            //循环监听等待客户端的连接
            while(++count!=0)
                socket=server.accept();//调用accept()方法开始监听。等待客户端的连接
                //每次请求都启动一个线程来处理
                new ServerThread(socket);
                //thread.start();//启动线程             
                //count++;//统计客户端连接数量
                System.out.println("客户端的数量"+count);
                InetAddress addr=socket.getInetAddress();
                System.out.println("当前客户端IP:"+addr);
            

         catch (IOException e) 

            e.printStackTrace();
        
        try 
            server.close();
         catch (IOException e) 

            e.printStackTrace();
        
    


客户端:

public class Client 


    public static void main(String[] args) 
        try 
            //1.创建客户端Socket,指定服务器地址和端口
            Socket socket=new Socket("localhost",8855);
            //2.获取数据输入流连接到socket上,并读取服务器端的响应信息
            DataInputStream dis=new DataInputStream(socket.getInputStream());
            //3.获取数据输出流连接到socket上,向服务器端发送信息
            DataOutputStream dos=new DataOutputStream(socket.getOutputStream());
            System.out.println("请输入圆的半径,输入'end'结束!");
             //数据从终端输入
            BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
            boolean flag=true;
            String result;
            //反复读用户的数据并计算
            while(flag)                                
                String sin=br.readLine();//数据从终端输入
                dos.writeUTF(sin);//写到Socket dos中
                dos.flush();//清空缓存,立即发送给服务器端
                result=dis.readUTF();//从socket中读取服务器返回来的数据
                if(!result.equals("end"))
                System.out.println("服务器返回来的答案:"+result);
                else
                    flag=false;
                    System.out.println("C服务结束");
                
            
            socket.close();
            dis.close();
            dos.close();
         catch (IOException e)        
            e.printStackTrace();
        

    


运行截图:

以上是关于Socket通信之计算圆面积的主要内容,如果未能解决你的问题,请参考以下文章

C语言 输入半径 求圆的面积和周长

创建一个圆类Circle的对象,分别设置圆的半径计算并分别显示圆半径圆面积圆周长。

如何用C语言计算圆的周长和面积

如何用C语言计算圆的面积

Java作业 输入圆的半径计算输出圆的周长和面积

编写程序,解析在命令行输入的圆的半径,计算圆的周长和面积(结果保留两位小数)?