Socket通信之计算圆面积

求三角形面积,利用Socket编程实现 服务器客户端实现求三角形面积,利用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();
        }

    }

}

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

自考JAVA语言实践试题 福大自考JAVA语言程序设计(一)实践试题 立即下载

相关推荐

JAVA实现C_S.rar

编写一个客户/服务器程序,服务器的功能是计算圆的面积。客户端将圆的半径发送给服务器端,服务器端计算得出的圆面积发送给客户端,并在客户端显示。

Java 网络编程

一、概述 java.net.InetAddress类 一个该类的对象就代表一个IP地址对象 成员方法: - public static InetAddress getLocalHost():获取本地IP地址对象 - public sstatic InetAddress getByName(String host):根据ip地址字符串或主机名称获得对应的ip地址对象 ...

m0_60489526的博客 232

利用Socket界面实现计算三角形面积

利用Socket,实现三角形面积的计算,并支持一台服务器,多个客户端的能力

linux中线程求圆的面积,编写一个客户/服务器程序,服务器的功能是计算圆的面积。客户端将圆的半径发送给服务器端,服务器端计算得出的圆面积发送给客户端,并在客户端显示。...

packagework11;importjava.io.*;importjava.net.*;public classclient {staticSocketsocket;public static voidmain(String[] args)throwsUnknownHostException,IOException{socket=newSocket("127.0.0.1",20000);Da...

weixin_42491751的博客 416

超详细网安学习路线(Day1-Day2)

渗透测试(Penetration Testing),就是一种通过模拟恶意攻击者的技术与方法,挫败目标系统安全控制措施,取得访问控制权,并发现具备业务影响后果安全隐患的一种安全测试与评估方法。简单来说,就是合法去入侵别人的系统,来帮助其找出漏洞,增强防护能力。

aobulaien001的博客 3390

第1章:Zephyr 开发环境搭建与 Hello World

📝【摘要】本文是Zephyr RTOS开发入门指南的第一章,详细介绍了从环境搭建到首个应用运行的完整流程。主要内容包括:1️⃣ Zephyr项目结构解析与west工具链部署;2️⃣ 开发环境配置(Linux/WSL)及SDK安装;3️⃣ 两种实践路径——官方HelloWorld样例与自定义应用开发;4️⃣ 实际硬件部署方法(nRF/STM32)及常用west命令速查;5️⃣ 典型问题解决方案。通过qemu_x86模拟器演示了基础打印功能实现,为后续深度开发奠定基础。

hemoparrot的专栏 1361

一个简单的客户-服务器的Socket通信程序

在本程序中,客户端从命令行输入一个半径值,并传送至服务器,服务器根据这个半径值计算出圆的面积发送给客户端。客户端可以继续输入半径值得到圆的面积,知道输入了bye,结束通信。 本程序仅仅支持一个客户端的连接,一对一模式。 Client.java package com.leo.socketcom; import java.io.BufferedReader; import java.

没心没肺之熬夜不洗澡 918

零基础学习CANoe Panel(5)——改变变量的值,控件图像也改变,这是怎么回事?

Panel 中控件的图像随着值变化,是怎么回事?

蚂蚁小兵 2146

实验十 网络程序设计

一、实验目的1、掌握网络通信的基础知识及Java对网络通信的支持2、学习URL 和InetAddress类的应用3、掌握基于底层Scoket的有连接和无连接的网络通信方法二、实验内容1、客户端向服务器发送请求,而服务器将接收发送给它的请求并将其写入文件。完成客户端的步骤如下:(1) 创建一个具有服务器IP地址和端口号的Socket对象。 Socket soc=new Socket("localhost",4001);(2) 客户端接受输入。BufferedReader br=new Buffe

qq_61727355的博客 1016

11、改进的加权轮询调度算法

本文详细介绍了对传统加权轮询(WRR)调度算法的改进方法,包括动态权重调整、优先级调度和预测机制,旨在提升系统的公平性、响应速度和适应性。通过设计与实现改进算法,并结合实验验证其在响应时间、资源利用率和公平性方面的显著提升,同时列举了该算法在数据中心、云服务平台、CDN及电商平台等实际场景中的应用案例。

day7的博客 190

Pointnet++改进90:2025最新改进模块-EVA模块

本教程提出了一种改进PointNet++特征提取模块的方法,通过在PointNetSetAbstraction模块中加入NAMAttention注意力机制,显著提升了模型性能。具体改进包括:1)新建eva.py文件,实现了包含SDLSKA、CKS等关键组件的EVA模块;2)在pointnet2_utils.py中添加Conv和PointNetSetAbstractionAttention类,整合注意力机制;3)修改pointnet2_sem_seg.py模型结构。这种改进方法降低了实现难度,同时保持了33F

AIcurator的博客 361

圆面积

/* 问题描述 给定圆的半径r,求圆的面积。 输入格式 输入包含一个整数r,表示圆的半径。 输出格式 输出一行,包含一个实数,四舍五入保留小数点后7位,表示圆的面积。 说明:在本题中,输入是一个整数,但是输出是一个实数。 对于实数输出的问题,请一定看清楚实数输出的要求,比如本题中要求保留小数点后7位,则你的程序必须严格的输出7位小数,输出过多或者过少的小数位数都是不行的,都会被认为

shaguabufadai的博客 867

Arduino与震动马达模块握手

震动马达模块采用采用高品质手机震动马达,适用于震动感互动产品的制作,可穿戴智能设备震动提醒,适合作为非可听指示器的小型振动马达。当输入为高电平时电动机会震动,就像你的静音模式的手机一样。

vor234的博客 5847

socket编程源码

package socket; import java.awt.BorderLayout; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket;...

excuse_ft的博客 259

[24] cuda 应用之 nppi 实现图像颜色通道变换

[24] cuda 应用之 nppi 实现图像颜色通道变换

yohnyang的博客 343

优化点列图(RMS半径)的操作数

优化点列图(RMS半径)的操作数

weixin_72050316的博客 2259

29.1 Java进阶之网络IP,DNS,TCP,UDP,客户端服务器通信过程,套接字

IP是一种互联网协议地址,用它我们可以唯一的标识互联网上的计算机。它由四段用点隔开的0~225的十进制数组成,例如:130.254.204.31。

c1776167012的博客 688

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

【Java学习笔记】58:多线程Socket通信的demo

多线程Socket通信 对于服务端来说,可能有多个客户端连接进来,从平衡上考虑就应当为每个客户端的连接单独开启一个线程,并且在main进程中继续用accept()等待其它用户连接。 对于客户端来说,虽然不涉及多个服务端问题,但是数据输入流的readXxx()方法会引起阻塞,所以可以单独放到子线程中,不影响主线程的执行。 书上的例子,改了改,这个例子有挺多细节值得考虑的。 服务端Thread...

大桔骑士的学习笔记 412

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

简单Socket通信

本项目是一个基于Socket通讯的例子源码,实现了一个简单的交互功能:安卓客户端发送“半径”值给服务端,服务器计算出圆面积,再发送回客户端。有兴趣的朋友可以研究一下。本项目默认编译版本4.4.2编码GBK

452

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

tcp 通信---ServerThread

package n07.wlyd; import java.io.*; import java.net.*; public class ServerThread extends Thread{   private Socket connectToClient;   private DataInputStream inFromClient;   private DataOutputStr

西_北 1515

python电脑编程求圆的面积案例_学Python划重点七 网络编程(UPD Socket编程、上传文件实例、计算圆的面积实例)...

一、UPD Socket 编程socket 对象中与UDP Socket 服务器编程有关的方法是bind() ,注意不需要listen() 和accept() , 这是因为UDP 通信不需要像TCP 一样监听端口,建立连接。socket.recvfrom(buffsize) : 接收UDP Socket 数据,该方法返回 二元组对象(data,address) ,data 是接收的字节序列对象;a...

weixin_39637285的博客 246

学Python划重点七 网络编程(UPD Socket编程、上传文件实例、计算圆的面积实例)

一、UPD Socket 编程 socket 对象中与UDP Socket 服务器编程有关的方法是bind() ,注意不需要listen() 和accept() , 这是因为UDP 通信不需要像TCP 一样监听端口,建立连接。 socket.recvfrom(buffsize) : 接收UDP Socket 数据,该方法返回 二元组对象(data,address) ,data 是接收的字节序列对象;address 是发送数据的远程Socket 地址。参数buffsize 指定一次接收的最大字节数,因此如果要

程序员战胜 476

课本上一个很好的java多线程服务器程序

服务端: import java.io.DataOutputStream; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; public class Server { public static void main(String args[]){ ServerSocket

花开冬季 385

圆计算

/* Copyright (c) 2012, 烟台大学计算机学院    * All rights reserved.    * 作    者:王俊  * 完成日期:2012 年 10 月 22 日    * 版 本 号:v1.0    * 输入描述:请输入半径,高:r,H   * 问题描述:根据给定的半径和高求出相应的圆、球、圆柱、圆锥的相关数据     * 程序输出:略

wangjun的专栏 649

客户端/服务器-计算

基础知识点: TCP(传输控制协议):确保数据的传输,也确保数据包以它们发送的顺序正确发送。(流套接字) UDP(用户数据报协议):用在IP上标准的,低代价,无连接,主机对主机的协议。(数据套接字) 套接字:两个主机之间连接的端点,用于发送和接收数据。 常出现的异常: java.net.BindException:端口使用冲突 java.net.UnknownHostException...

Bruce_try的博客 1082
上一篇: Socket通信机制(学习总结)
下一篇: Java输入输出之文件
Yienfong_Chueng
博客等级 码龄12年 187粉丝 30原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值