第四次过程性考核

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 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...软件所解决,但是还有部分错误,运行结果也不对

(八)考核总结及其意见

  1. 通过这次考核,发现自己对于单线程展开的问题学习的不到位,导致考试多线程问题没有很好解决
  2. 通过这学期学习java课程,自己学习到很多东西,其中 if 条件分支 ,while,for,do-while循环语句,单线程通信以及SQL结构化语句等等掌握不错,但是有关于类与对象和子类与继承学习的不好,而且自己独自敲写代码很费劲,大部分语句块掌握不好,有的甚至运用不恰当
  3. 希望以后老师对于代码编程方面能够讲解的再详细点,尽量让我们多动手独自编写一些代码
  4. 在实训过程中要努力完善不足,为小组做出贡献,加油

(九)代码和博客字数统计

 

学习内容 代码(行) 博客(字)
java入门 5行 1000字
输入输出数据 65行  
条件分支语句 28行  
循环语句 47行  
常用实用类 86行  
数组 92行  
类与对象,子类与继承 600行  
java多线程,SQL结构化语句 900行  
第一次过程性考核 180行 900字
第二次过程性考核 650行 500字
第三次过程性考核 130行 500字
总计 2783行 2900字
posted @ 2018-12-17 08:31  liuji1  阅读(230)  评论(1编辑  收藏  举报