第四次过程性考核
Posted smrr
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第四次过程性考核相关的知识,希望对你有一定的参考价值。
第四次过程性考核——多线程通信
码云仓库地址:https://gitee.com/smr_777/16012021_assessment_iv/tree/master
使用套接写连接编写一个简单的聊天室程序,客户端主函数放在Client_Main.java文件中,服务器端主函数放在Server_Main.java文件中
要求:
- 1.客户端从控制台进行输入,并将客户端的输出内容和时间保存到“学号.txt”文件中
- 2.服务器端读取到客户端的程序后,给客户端以回应,并将客户端的输入内容与服务端的输出内容、时间保存到文本文件中
- 3.要求服务器端可以实现同时与多个客户端进行通信,与每一个客户端通信的内容,保存为一个“学号_ip.txt”的文件
- 4.4.提交文件结果包括:代码,通信后生成的txt文件
考试思路:看到是一个多线程通信首先想到的是课堂时练习的单线程,然后找书看到了一个多线程的例子是求圆的半径。看到类似就一直按照书上的代码打,打完后排错想着如何将圆的半径内容,以及如何将通信内容转化为TXT文档。
代码如下:
客户端
import java.io.*; import java.net.*; import java.util.*; public class Client_Main { /*根据书上例题找出和考核题比较相像的代码,但还是有所不同不知道如何更改*/ public static void main(String[] args) { Scanner 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) { } } } }
服务器
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("正在监听"); } 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; } } } }
read
import java.io.DataInputStream; import java.io.IOException; public class Read_Main implements Runnable { DataInputStream in; /** 读入端 */ 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; } } } }
运行结果:
总结反思:
没有实现通信,客户端显示服务器已断开,找不到该如何解决问题。Java课程也快要结束了,看看自己的博客园与码云发现在这一学期的学习努力程度还是不够,大多数的学习都是被动学习,课上学习的知识点总是不能熟练的掌握,课后学习花费的时间也不够,导致我每一次考核都是在翻书,寻找书上例子和考核类似的代码在那基础上再做修改,一遇到难题就懒得思考这个毛病导致了思维定式,需要努力的改正,在Java实训中我要认真思考减少百度借鉴这样的事情。
学习内容 | 代码行数 | 博客字数 |
第四次考核 | 131 | 267 |
课堂练习四码云地址:https://gitee.com/smr_777/learn4/tree/master
以上是关于第四次过程性考核的主要内容,如果未能解决你的问题,请参考以下文章