第四次过程性考核
Posted zhaoyurong
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第四次过程性考核相关的知识,希望对你有一定的参考价值。
码云仓库的地址:https://gitee.com/zyr16012001/codes
(一) 问题:使用套接写连接编写一个简单的聊天室程序,客户端主函数放在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 stub
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) { }
}
}
}
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 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 代码:
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字 |
以上是关于第四次过程性考核的主要内容,如果未能解决你的问题,请参考以下文章