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

一、实验目的与要求

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



  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值