一、实验目的与要求
实验目的:熟悉面向连接的JavaSocket程序的编写。
实验要求:以小组为单位完成,一个小组由两个人组成。以小组为单位提交,请在完成的实验报告中列出小组成员。
二、实验内容
1. 编写Java Socket程序,编写一个基于Client/Server的问答程序,其中服务器端负责发布消息,客户端接收消息。每个客户端在连接上之后,服务器端给它发送一条欢迎消息:欢迎来自********(显示IP地址)的朋友。服务器端同时可以连接多个客户端。(30分)
在服务器声明一个 ServerSocket 对象,在客户端声明一个Socket对象,利用Java Socket实现服务器与客户端之间对话
服务器:
import java.io.*;
import java.net.*;
public class Server {
public static void main(String[] args) {
ServerSocket s = null;
try{
s= new ServerSocket(6789);
}
catch(IOException e)
{
System.out.println(e);
System.exit(1);
}
while(true) { //可以同时连接多个客户端
try{
Socket cs = s.accept();
new ServerWriter(cs).start(); //为每一个客户端开启一个子线程
}
catch(IOException e)
{
System.out.println(e);
}
}
}
static class ServerWriter extends Thread {
Socket sock;
public ServerWriter(Socket s) {
sock = s;
}
public void run() {
try {
DataOutputStream dos = new DataOutputStream(sock.getOutputStream());
//利用accept的方法获取客户端ip地址
dos.writeUTF("欢迎来自" + sock.getInetAddress().getHostAddress() + "的朋友" + '\n');
dos.close();
}
catch (IOException e) {
System.out.println(e);
}
}
}
}
客户端
import java.io.*;
import java.net.*;
public class Client {
public static void main(String[] args) throws
UnknownHostException {
try {
Socket s = new Socket(InetAddress.getLocalHost(), 6789);
DataInputStream dis = new DataInputStream(s.getInputStream());
System.out.println(dis.readUTF()); //打印接受到的消息
s.close();
}
catch (IOException e) {
System.out.println(e);
}
}
}
2. 编写程序,客户连接上服务器后,可以进行自助心理测试,完成测试后,会显示测试结果。测试题目和结果如“心理素质测试和答案分析”文件所示。(30分)
这里我把“心理素质测试和答案分析”文件整理了一下,分为ques.txt和ans.txt两部分,ques.txt里储存问题,并且调整为每个问题一定是占4行,ans.txt里储存处理过的答案。
服务器:
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
static int qNum = 70; //测试题数
public static void main(String[] args) {
ServerSocket server;
try {
server = new ServerSocket(2022);
Socket sk = server.accept();
System.out.println("客户端连接成功!");
DataInputStream dis = new DataInputStream(sk.getInputStream());
DataOutputStream dos = new DataOutputStream( sk.getOutputStream());
try {
BufferedReader reader = new BufferedReader(new FileReader("ques.txt"));
String tempString = null;
for(int j = 1;j<=qNum*4;j++)
{
tempString = reader.readLine();
dos.writeUTF(tempString);
}
reader.close();
}
catch (IOException e1) {
e1.printStackTrace();
}
String str;
int ans = 0;
try {
BufferedReader re = new BufferedReader(new FileReader("ans.txt"));
String tempString = null;
for(int i = 1;i<= qNum;i++){
str = dis.readUTF();
tempString = re.readLine();
ans += judge(str,tempString);
System.out.println("接受到第 " + i + "个答案 得分 :" + judge(str,tempString));
}
String strans = Integer.toString(ans);
dos.writeUTF(strans);
re.close();
}
catch (IOException e) {
e.printStackTrace();
}
}
catch (IOException e) {
System.out.println(e);
}
}
public static int judge(String s, String t){//判断得分
int idx = t.indexOf(s);
char[] T = t.toCharArray();
return T[idx+1] - '0';
}
}
客户端:
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
public class Client {
static int qNum = 70; //测试题数
public static void main(String[] args) {
Socket client;
try {
client = new Socket("127.0.0.1", 2022);
DataInputStream dis = new DataInputStream(client.getInputStream());
DataOutputStream dos = new DataOutputStream(client.getOutputStream());
System.out.println("此次测试题数为:" + qNum + ". (请勿输入多余回车)" + '\n');
for(int j = 1;j<=qNum;j++){
for(int i = 1;i<=4;i++) //每次输出4行
System.out.println(dis.readUTF());
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
dos.writeUTF(str);
}
String strans = dis.readUTF();
System.out.println("您的得分为 : " + strans);
int ans = Integer.parseInt(strans);
if(ans > 180)
System.out.println("你心理成熟,是面试高手,你一定能通过面试");
else if(ans > 150)
System.out.println("你心理较成熟,有一定的面试能力,基本上能通过面试,但在有关细节上要多加注意");
else if(ans > 130)
System.out.println("你心理成熟一般,有一般的面试能力,通过面试有一定的难度,要在回答技巧上多加注意");
else if(ans > 100)
System.out.println("你心理成熟程度较差,欠缺一定的面试能力,通过面试的可能性不大,要注意认真总结,加大复习的力度");
else
System.out.println("你心理成熟程度很差,你欠缺的面试能力,不可能通过面试,要在提高综合素质上下功夫");
}
catch (IOException e) {
System.out.println(e);
}
}
}
ans.txt(部分):01A2B3C1
02A1B1C3
03A1B2C3
04A1B2C3
05A3B2C1
06A1B2C3
07A2B1C3
08A1B2C3
09A3B1C1
10A1B2C3
ques.txt(部分):
1.如果你的上司牌气很急,批评下属不留情面,大家的情绪经常受到影响,作为下属,你要如何处理?( )
A.直接找上司谈话,建议其改变领导方式
B.私下找领导沟通,婉转请求其注意自己的态度
C.与其他同事一起商量,联名建议领导改变领导方式
2.如果你在公务员面试中没有被录取,你会怎样想?( )
A.很沮丧,觉得自己没尽全力
B.没什么大不了的,此处不留我,自有留我处
C.这是自己的一次宝贵经验,下次再努力
3.如果你发现你的直接领导可能公款私用,你怎么办?( )
A.直接向上级领导反映,决不能放过贪官污吏
B.私下进行秘密调查,做到心中有数
C.按照特定程序谨慎办事,既不能影响团结,也不能放任不管
4. 一份机密文件丢失,某日又出现在你的抽屉里,你将( )
A.听之任之,反正已经回来了,不会有什么事
B.私下请人帮忙调查,找到真正原因
C.向直接领导报告,并检讨自己的过失
5.在类似于火车站那样的嘈杂环境中,如果给你一篇枯燥的论文,你会()。
A.认认真真地阅读,并能领会其中意思
B.仔细地阅读,但经常会左顾右盼
C.不可能集中注意力,论文内容不知所云
3. 通过Java Socket方式实现一个基于 Client/Server 的文件传输程序。则需要分别实现客户端和服务器端程序。(40分)
客户端:用面向连接的方式实现通信。采用 Socket 类对象,接收服务器发送的文件并保存在特定的位置。
服务器端:监听客户请求,读取磁盘文件并向客户端发送文件。注意:需要实现文件的读写操作。
服务器:
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
public class Server extends ServerSocket{
private ServerSocket server;
private Socket ser;
private FileInputStream fis;
private DataOutputStream dos;
public Server()throws Exception{
try {
try{
server =new ServerSocket(2016);
while(true){
System.out.println("----正在等待客户请求连接----");
ser = server.accept();
System.out.println("----客户端连接成功----");
System.out.println("----请输入需要传输的文件路径名----");
BufferedReader strin = new BufferedReader(new InputStreamReader(System.in));
String fileName = strin.readLine();
File file =new File(fileName);
fis =new FileInputStream(file);
dos =new DataOutputStream(ser.getOutputStream());
dos.writeUTF(file.getName());
dos.flush();
dos.writeLong(file.length());
dos.flush();
//传输文件
byte[] sendBytes =new byte[1024];
int length =0;
while((length = fis.read(sendBytes,0, sendBytes.length)) >0){
dos.write(sendBytes,0, length);
dos.flush();
}
System.out.println("---- <" + file.getName() + "> ---- 已传送给客户端");
}
}
catch (Exception e) {
e.printStackTrace();
}
finally{
if(fis !=null)
fis.close();
if(dos !=null)
dos.close();
ser.close();
}
}
catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args)throws Exception {
new Server();
}
}
客户端:
import java.io.DataInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.net.Socket;
public class Client extends Socket{
private Socket client;
private DataInputStream dis;
private FileOutputStream fos;
private int s=0;
public Client(){
try {
try {
client =new Socket("127.0.0.1", 2016);
System.out.println("----连接成功----");
dis =new DataInputStream(client.getInputStream());
String fileName = dis.readUTF();
long fileLength = dis.readLong();
fos =new FileOutputStream(new File("F:/" + fileName));
byte[] sendBytes =new byte[1024];
int transLen =0;
System.out.println("----开始接收文件<" + fileName +">,文件大小为<" + fileLength +">----");
while(true){
int read =0;
read = dis.read(sendBytes);
if(read < 1024)
break;
transLen += read;
if(s==0)
System.out.println("接收文件进度" +100 * transLen/fileLength +"%...");
s=(s+1)%100;
fos.write(sendBytes,0, read);
fos.flush();
}
System.out.println("----接收文件<" + fileName +">成功-------");
client.close();
}catch (Exception e) {
e.printStackTrace();
}finally {
if(dis !=null)
dis.close();
if(fos !=null)
fos.close();
client.close();
}
}catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args)throws Exception {
new Client();
}
}