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();
        }

    }

}

运行截图:
这里写图片描述
这里写图片描述

  • 2
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值