第四次过程性考核
.
码云地址:https://gitee.com/haoyuea/projects
使用套接写连接编写一个简单的聊天室程序,客户端主函数放在Client_Main.java文件中,服务器端主函数放在Server_Main.java文件中
要求:
- 1.客户端从控制台进行输入,并将客户端的输出内容和时间保存到“学号.txt”文件中
- 2.服务器端读取到客户端的程序后,给客户端以回应,并将客户端的输入内容与服务端的输出内容、时间保存到文本文件中
- 3.要求服务器端可以实现同时与多个客户端进行通信,与每一个客户端通信的内容,保存为一个“学号_ip.txt”的文件
- 4.4.提交文件结果包括:代码,通信后生成的txt文件
程序设计思路:要求里面是一个多线程通信,所以就找到了书中的使用多线程技术里面的例题,使用多线程技术和套接字写一个聊天室程序,客户可以输入圆的半径并发送给服务器,服务器把计算出的圆的面积返回给客户。因此可以将计算量大的工作放在服务器端,客户端负责计算量小的工作,实现客户--服务器的交互计算,来完成任务。
使用知识点:套接字,客户端套接字,ServerSocket对象与服务器端套接字,使用多线程技术
Client_Main.Java:
import java.io.*; import java.net.*; import java.util.*; public class Client_Main { /** * @param args */
//题是多线程题所以根据书上例题,但是改编后运行不对,所以考试时交的书上的例题
public static void main(String[] args) { // TODO Auto-generated method stub Scanner scanner = new Scanner (System.in); Socket mysocket = null; DataInputStream in = null; DataOutputStream out = null; Thread readData; Read read = null; try { mysocket = new Socket(); read = new Read(); readData = new Thread(read); //负责读取信息的线程 System.out.print("输入服务器的IP:"); String IP = scanner.nextLine(); System.out.print("输入服务器的IP:"); int port = scanner.nextInt(); if(mysocket.isConnected()){} else{ InetAddress address = InetAddress.getByName(IP); InetSocketAddress socketAddress = new InetSocketAddress(address,port); mysocket.connect(socketAddress); in = new DataInputStream(mysocket.getInputStream()); out = new DataOutputStream(mysocket.getOutputStream()); read.setDataInputStream(in); readData.start(); //启动负责读取信息的线程 } } catch(Exception e){ System.out.println("服务器已断开" +e); } System.out.println("输入圆的半径(放弃请输入N):"); while(scanner.hasNext()) { double radius = 0; try { radius = scanner.nextDouble(); } catch(InputMismatchException exp){ System.exit(0); } try { out.writeDouble(radius); //向服务器发送消息 } catch(Exception e) { } } } }
Read_Main.java
import java.io.DataInputStream; import java.io.IOException; public class Read_Main implements Runnable { DataInputStream in; /** * @param args */ public static void setDataInputStream(DataInputStream in) { // TODO Auto-generated method stub this.in = in; } public void run() { double result = 0; while(true) { try { result = in.readDouble(); //读取服务器发送来的信息 System.out.println("圆的面积" +result); System.out.print("输入圆的半径(放弃请输入N):"); } catch (IOException e) { System.out.println("与服务器断开" +e); break; } } } }
Server_Main.java
import java.io.*; import java.net.*; import java.util.*; public class Server_Main { public static void main(String[] args) { ServerSocket server = null; ServerThread thread; Socket you = null; while(true){ try{ server = new ServerSocket(2010); } catch(IOException e1){ System.out.println("正在监听"); // ServerSocket 对象不能重复创建 } try{ System.out.println("等待客户呼叫"); you = server.accept(); System.out.println("客户的地址:"+you.getInetAddress()); } catch(IOException e){ System.out.println("正在等待客户"); } if (you!=null){ new ServerThread(you).start(); // 为每个客户启动一个专门的线程 } } } } class ServerThread extends Thread{ Socket socket; DataOutputStream out = null; DataInputStream in = null; String s = null; ServerThread(Socket t){ socket = t; try{ out = new DataOutputStream (socket.getOutputStream()); in = new DataInputStream (socket.getInputStream()); } catch (IOException e){} } public void run(){ while (true){ try{double r = in.readDouble(); //阻塞状态,除非读取到信息 double area=Math.PI*r*r; out.writeDouble(area); } catch (IOException e){ System.out.println("客户离开"); return; } } } }
运行结果截图:(没做对)
学习总结和对以后的建议:
本学期的四次考核已经结束了,感觉随着学习内容的增加知识的积累,发现学的越多越不知道怎么去应用,只会死记硬背知识点,不会灵活改变思路,光靠上课讲的不能完全理解,做题编程时有思路但是代码量不足,很容易出错所以编写不成功会遇到困难,感觉和平时的努力不够,愿意依靠百度搜索,缺乏思考有很大关系,看书也不能灵活运用代码,感觉编程类的科目一定要有程序思想要勤奋练习多看书多思考更改不足!
代码和博客字数统计:
学习内容 | 代码(行) | 博客(字) |
URL类 | 48 | |
套接字 | 71 | |
第四次过成性考核 | 135 | 562 |
总计 | 291 | 562 |