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通信之计算圆面积的主要内容,如果未能解决你的问题,请参考以下文章