网络程序设计-1
实验一
实验要求:
脑筋急转弯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个问题(其他的东西我都写到代码的注释里了,大伙自己看啊),改动的地方其实也就是加了一个能自动生成随机数的循环。