实验一

实验要求:

脑筋急转弯1.0版
编程要求:
1.服务器出5~10道脑筋急转弯题目,客户机回答。服务器要能判断客户机回答的正确与否。
2.服务器和客户机均采取java控制台编程模式。无论是输入流还是输出流,都使用三层复合流。
3.服务器端编程时,将5道脑筋急转弯题目放置于数组内,并通过循环方式向客户机发出问题和判断客户机回答的正确与否。
4.客户机编程时,回答问题采取循环方式,当接到服务器发出的“问答结束”信息后结束循环并退出问答。
5.采用客户机/服务器一对一通信模型,所编写的程序必须在组内的成员之间通过单独一台主机做服务器,另外一台主机做客户机的方式通过测试。

客户端:

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;

public class client {
    public static void main(String[] args) {
        try (
                //1.请求连接服务器
                Socket socket = new Socket("127.0.0.1", 2020);

                //2.初始化三个信息流:从键盘输入的输入流,从服务器传送过来的输入流,向服务器发送的输出流
                //2.1 从键盘读取的输入流
                BufferedReader kbdin = new BufferedReader(new InputStreamReader(System.in)); //keyboard input
                //2.2 从服务器传送过来的输入流
                BufferedReader srvin = new BufferedReader(new InputStreamReader(socket.getInputStream())); //server input
                //2.3 向服务器发送的输出流
                BufferedWriter srvout = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); //server output
        ) {
            //3.连接成功
            System.out.println("与服务器连接成功!");

            //4.开始回答
            System.out.println("请直接输入你的回答,不用理会光标的位置!");
            while (true) {
                //4.1 从服务器读取问题
                String question=srvin.readLine();
                if(question.equals("问答结束")) {
                    System.out.println("回答问题结束喽!");
                    break; //回答问题结束,则跳出循环
                }
                System.out.println(question); //显示问题

                //4.2 循环回答每一个问题
                String answer=kbdin.readLine(); //从键盘读取回答
                srvout.write(answer); //把答案向服务器发出去
                srvout.newLine();  //结束一行信息
                srvout.flush();  //推送缓冲区内容

                //4.3 接收服务器发来的对错结果
                String result=srvin.readLine();
                System.out.print("服务器发送的判断结果:");
                System.out.println(result);
            }
        } catch (IOException e) {
            System.out.println("亲,服务器不理我:(..." + e);
        }
    }

}

客户端的代码并没有改动,因为实验的要求主要是让我们改动服务器端的代码,那让我们看服务端的代码。

服务端:

原始代码:

package server;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class AskServer {
    public static void main(String args[]) {
        try(
                //1.服务器端口建立并开始监听
                ServerSocket server = new ServerSocket(2020); //在2020端口建立连接            
                Socket socket = server.accept(); //服务器阻塞 
                
                //2.初始化两个信息流:从客户机传送过来的输入流,向客户机发送的输出流                
                //2.1 从客户机传送过来的输入流
                BufferedReader cltin = new BufferedReader(new InputStreamReader(socket.getInputStream())); //client input
                //2.2 向客户机发送的输出流
                BufferedWriter cltout = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); //client output
        ){
            System.out.println("已经和客户机建立连接!!!");            
            //3.1 提出第一个问题
            cltout.write("问题1:你所在的学校?");
            cltout.newLine();  //结束一行信息
            cltout.flush();  //清空缓冲区,其实就是将缓冲区的数据推送出去
            //3.2 接收第一个回答
            String answer=cltin.readLine(); //阻塞,等待输入流
            System.out.println("问题1:你所在的学校?");
            System.out.println("客户机的回答:"+answer);
            
            String response;
            if(answer.equals("宁夏大学")) {
                response="答对啦!";
            }
            else {
                response="错喽!!!";
            }
            //3.3 返回对第一个问题的判断
            cltout.write(response);
            cltout.newLine(); 
            cltout.flush();
            
            //4.1 提出第二个问题
            cltout.write("问题2:你所在的学院?");
            cltout.newLine();  
            cltout.flush();  
            //4.2 接收第二个回答
            answer=cltin.readLine();          
            System.out.println("问题2:你所在的学院?");
            System.out.println("客户机的回答:"+answer);
            
            if(answer.equals("信息工程学院")) {
                response="答对啦!";
            }
            else {
                response="错喽!!!";
            }
            //4.3 返回对第二个问题的判断
            cltout.write(response);
            cltout.newLine(); 
            cltout.flush();
            
            //5.1 提出第三个问题
            cltout.write("问题3:你所在的系?");
            cltout.newLine();  
            cltout.flush();   
            //5.2 接收第三个回答
            answer=cltin.readLine();     
            System.out.println("问题3:你所在的系?");
            System.out.println("客户机的回答:"+answer);
            
            if(answer.equals("网络工程")) {
                response="答对啦!";
            }
            else {
                response="错喽!!!";
            }
            //5.3 返回对第三个问题的判断
            cltout.write(response);
            cltout.newLine(); 
            cltout.flush();
            
            //6 发出结束问答信息
            cltout.write("问答结束");
            cltout.newLine(); 
            cltout.flush();
            
            System.out.println("问答结束!");
        }catch(IOException e) {
             System.out.println("发生了网络错误!" + e);
        }        
    }
}

实验要求:

import java.io.BufferedReaimport java.io.BufferedWriter;
import
java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.ServerSocket; import java.net.Socket; public class server { public static void main(String args[]) { try( //1.服务器端口建立并开始监听 ServerSocket server = new ServerSocket(2020); //在2020端口建立连接 Socket socket = server.accept(); //服务器阻塞 //2.初始化两个信息流:从客户机传送过来的输入流,向客户机发送的输出流 //2.1 从客户机传送过来的输入流 BufferedReader cltin = new BufferedReader(new InputStreamReader(socket.getInputStream())); //client input //2.2 向客户机发送的输出流 BufferedWriter cltout = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); //client output ){ System.out.println("已经和客户机建立连接!!!"); //写入问题
       //这里从1开始数组是因为后面的生成随机数时是1-10,为了对应下标,比较简单一点
String[] str = new String[11]; str[1]="什么东西在倒立之后会增加一半?"; str[2]="冰变成水最快的方法是什么?"; str[3]="在什么时候1+2不等于3?"; str[4]="一只凶猛的饿猫,看到老鼠,为何拔腿就跑?"; str[5]="小王走路从来脚不沾地,这是为什么? "; str[6]="小王一边刷牙,一边悠闲的吹着口哨,他是怎么做到的?"; str[7]=" 黑人和白人生下的婴儿,牙齿是什么颜色?"; str[8]="你能否用3跟筷子搭起一个比3大比4小的数?"; str[9]="最不听话的是谁?"; str[10]=" 什么东西晚上才生出尾巴呢?"; //写入答案 String[] str1 = new String[11]; str1[1]="6"; str1[2]="去掉冰字哪二点"; str1[3]="算错了的时候"; str1[4]="跑去追老鼠"; str1[5]="因为穿着鞋子"; str1[6]="刷假牙"; str1[7]="婴儿没有牙"; str1[8]="搭成圆周率∏"; str1[9]="聋子"; str1[10]="流星"; //定义一个数组,这个数组自动生成5个1-10之间不重复的随机数 int[] arr = new int[5]; //向数组中赋值 for(int i = 0;i< 5;i++){ //欲赋的值 arr[i] = (int)(Math.random() * 10) + 1; //遍历数组中是否有与欲赋值相等的元素 for(int j = 0;j < i;j++){ if(arr[i] == arr[j]){ //当查询到数组中有元素与欲赋值相等时,i--,跳出循环,并重新给arr[i]赋值 i--; break; } } } for(int j=1;j<6;j++){ cltout.write("问题"+j+":"+str[arr[j-1]]); cltout.newLine(); //结束一行信息 cltout.flush(); //清空缓冲区,其实就是将缓冲区的数据推送出去 //3.2 接收第一个回答 String answer=cltin.readLine(); //阻塞,等待输入流 System.out.println("问题"+j+":"+str[arr[j-1]]); System.out.println("客户机的回答:"+answer); String response; if(answer.equals(str1[arr[j-1]])) { response="答对啦!"; } else { response="错喽!!!"; } //3.3 返回对判断 cltout.write(response); cltout.newLine(); cltout.flush(); } //6 发出结束问答信息 cltout.write("问答结束"); cltout.newLine(); cltout.flush(); System.out.println("问答结束!"); }catch(IOException e) { System.out.println("发生了网络错误!" + e); } } }

可以发现我们把原来的依次输出三个问题,改成了利用循环依次输出5个问题(其他的东西我都写到代码的注释里了,大伙自己看啊),改动的地方其实也就是加了一个能自动生成随机数的循环。