https://gitee.com/liuji1/fourth_process_assessment
(一) 问题:使用套接写连接编写一个简单的聊天室程序,客户端主函数放在Client_Main.java文件中,服务器端主函数放在Server_Main.java文件中
(二) 要求:
- 1.客户端从控制台进行输入,并将客户端的输出内容和时间保存到“学号.txt”文件中
- 2.服务器端读取到客户端的程序后,给客户端以回应,并将客户端的输入内容与服务端的输出内容、时间保存到文本文件中
- 3.要求服务器端可以实现同时与多个客户端进行通信,与每一个客户端通信的内容,保存为一个“学号_ip.txt”的文件
- 4..提交文件结果包括:代码,通信后生成的txt文件
(三) 程序设计思路:
看到题首先想到的张三李四单线程通信问题,后来展开到多线程问题时怎么都不对,在书上P404多线程例题上抄写下来的,但是其中还是有很多问题,运行结果也不对
例题思路:客户输入圆的半径并发送给服务器,服务器把计算出的圆的面积返回给客户。因此可以将计算量大的工作放在服务器端,客户端负责计算量小的工作,实现客户-服务器交互计算,来完成某项任务。
(四) 代码片段:
Client_Main 代码:
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 stubScanner scanner = new Scanner (System.in);Socket mysocket = null;DataInputStream in = null;DataOutputStream out = null;Thread readData;Read_Main read = null;try {mysocket = new Socket();read = new Read_Main();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 代码:
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 stubthis.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 代码:
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;}}} }
(五)使用到的知识点
- 多线程技术
- 套接字基本原则:服务器应当启动一个专门的线程,在该线程中和客户的套接字建立连接;由于套接字的输入流在读取信息时可能发生阻塞,客户端和服务器端都需要在一个单独的线程中读取信息
- if 条件分支语句,while 循环语句,try...catch语句块等等
(六)运行结果
(七)在编程中出错的过程,及解决问题的过程
- Read_Main 代码中 this.in = in; this有问题,代码参照P404多线程敲写的命令,在考核过程中未解决此问题,将会在实训时问老师;
- 考核过程编写代码时,首先想到老师上课所讲有关于张三李四单线程通信问题,后来参照书上多线程的题进行抄写的,有些代码问题已用es...软件所解决,但是还有部分错误,运行结果也不对
(八)考核总结及其意见
- 通过这次考核,发现自己对于单线程展开的问题学习的不到位,导致考试多线程问题没有很好解决
- 通过这学期学习java课程,自己学习到很多东西,其中 if 条件分支 ,while,for,do-while循环语句,单线程通信以及SQL结构化语句等等掌握不错,但是有关于类与对象和子类与继承学习的不好,而且自己独自敲写代码很费劲,大部分语句块掌握不好,有的甚至运用不恰当
- 希望以后老师对于代码编程方面能够讲解的再详细点,尽量让我们多动手独自编写一些代码
- 在实训过程中要努力完善不足,为小组做出贡献,加油
(九)代码和博客字数统计
学习内容 | 代码(行) | 博客(字) |
java入门 | 5行 | 1000字 |
输入输出数据 | 65行 | |
条件分支语句 | 28行 | |
循环语句 | 47行 | |
常用实用类 | 86行 | |
数组 | 92行 | |
类与对象,子类与继承 | 600行 | |
java多线程,SQL结构化语句 | 900行 | |
第一次过程性考核 | 180行 | 900字 |
第二次过程性考核 | 650行 | 500字 |
第三次过程性考核 | 130行 | 500字 |
总计 | 2783行 | 2900字 |