第四次过程性考核

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


 

以上是关于第四次过程性考核的主要内容,如果未能解决你的问题,请参考以下文章

第四次过程性考核

第四次过程性考核

第四次过程性考核

第四次过程性考核

第四次过程性考核

第四次过程性考核