《并行与分布式计算》实验五——Java socket 编程

来源:互联网 发布:龙之谷g友戒指淘宝 编辑:程序博客网 时间:2024/05/30 23:00

一、实验目的与要求

实验目的:熟悉面向连接的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();    }}



0 0
原创粉丝点击