《并行与分布式计算》实验五——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(); }}
- 《并行与分布式计算》实验五——Java socket 编程
- 《并行与分布式计算》实验六——Java RMI编程
- 分布式计算第一周实验:Java进阶与Socket通讯
- 多核并行计算——并发与并行编程问题
- Hadoop并行计算原理与分布式并发编程
- Hadoop并行计算原理与分布式并发编程
- 分布式计算第二周实验:Socket通讯与HTTP服务器
- Spark——分布式并行计算概念
- 并行计算与分布式计算的区别
- 分布式计算第三周实验:Java Web 编程原理
- 并行计算 分布式计算 网格计算 与云计算
- 论分布式计算与线程并行
- 并行计算与分布式处理的区别?
- 并行计算与分布式处理的区别
- 并行计算,分布式计算
- 并行计算,网格计算与分布式计算的…
- 并行计算复习————第四篇 并行计算软件支撑:并行编程
- 并行计算与分布式计算的关系与区别1
- miniSTM32学习
- IOS动画之 转场动画 CATransition
- Spring Boot基础教程11-web应用开发-CORS支持
- struct和typedef struct
- 动态加载与插件化
- 《并行与分布式计算》实验五——Java socket 编程
- 贪心-电池的寿命
- mysql 主从复制
- Java实现二叉树的前序、中序、后序遍历(递归方法)
- Mysql 使用UUID和自增主键ID性能对比测试
- Android Fragment 真正的完全解析
- 学习笔记---C语言数据类型
- java构造函数基本知识
- 深信服超融合基础架构管理平台--虚拟网络测试实践