基于Linux下的Socket通信(操作系统课程设计)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

基于Linux下的socket通信

[开发平台]:LINUX

[开发语言]:JA V A

[开发工具]:ECLISPE

[开发人员]:阚广稳(安徽理工大学计算机学院09-2班)

I.系统描述:

本系统含有一个服务器(Server.class)和多个客户端(Clinet.class),可以通过每个客户端查看和下载服务器端共享文件夹中的文件。

II.功能描述:

A.查看服务器端共享文件夹列表

操作:在Linux终端下输入java Clinet listfiles。

参数说明:listfiles是固定参数。

结果:列出所有共享文件。

B.下载服务器端共享文件夹中的文件

操作:在Linux终端下输入java Clinet download filename dirpath。

参数说明:download是固定参数,filename是想要下载的文件名,dirpath是下载文件保存的路径。

结果:下载文件filename到地址dirpath。

III.功能分析以及实现:

A.问题描述:如何创建可以用于多个客户端连接的服务器?

分析解决:因为JA V A语言提供了对多线程的支持,所以我们可以把服务器设计为多线程的,对于每个客户端的连接单独开一条线程与之交

互。

主要实现代码:

服务器端:

ServerSocket serversocket=new ServerSocket(5678);

Socket socket;

While(true){

Socket=serversocket.accept();

new ServerThread(socket).start();

}

Class ServerThread extends Thread{

Socket socket;

Public ServerThread(Socket socket){

this.socket=socket;

}

}

B.问题描述:如何把服务器端的文件列表发送到客户端

分析解决:服务器端如果取得一个文件名就发给客户端也是可行的,但当文件较多的时显得不清晰,如果可以把所有文件名组成的文件列表保存起来,再统一发送到客户端,客户端再统一解析文件列表就显得更合理。这其中也体现了软件设计过程中封装的思想。幸运的是强大的网络编程语言JA V A就可以很好的解决这一问题。遍历服务器端的共享文件夹,把所有文件的文件名以及它们的存储地址存放到Map中,在通过对象流的方式发送到客户端,客户端解析对象流就可以获取文件列表了。

主要实现代码:

服务器端:

public static Map getAllFiles(File file,

Map map) {

if (file.isDirectory()) {

File[] files = file.listFiles();

for (int i = 0; i < files.length; i++) {

getAllFiles(files[i], map);

}

} else {

map.put(file.getName(), file.getPath());

}

return map;

}

//把服务器端的文件列表传到客户端

ObjectOutputStream objectOutputStream=new

ObjectOutputStream(outputStream);

objectOutputStream.writeObject(map);

objectOutputStream.close();

C.问题描述:如何下载服务器端的文件

分析解决:由于服务器端已经把共享文件及地址的目录保存在Map中,所以只要检查用户输入的文件名(filename)是否存在Map中就可以得知所下载的文件是否存在,如果存在就可以通过Map获得该文件的存储地址,服务器再找到该文件,把它发向客户端,客户端就可以把该文件存放在指定的目录(dirpath)。

主要实现代码:

服务器端:

if(map.containsKey(fileName)){

//把client请求的文件发过去

File file2=new File(map.get(fileName));

FileInputStream fileInputStream=new

FileInputStream(file2);

int buf=0;

while((buf=fileInputStream.read()) != -1){

outputStream.write(buf);

}

System.out.println("Transfer Success!");

fileInputStream.close();

outputStream.close();

inputStream.close();

}else{

//告诉Client端文件不存在

outputStream.write("error".getBytes());

outputStream.close();

}

客户端:

FileOutputStream fileOutputStream=new

FileOutputStream(new File(dirpath));

int buf=0;

//server端的写停止了(既关闭输出流),client端的读才能停止,否

则一直等待读取server发来的数据

while((buf=stream.read()) != -1){

fileOutputStream.write(buf);

}

IV.测试

需对java Clinet后面的参数进行详细的检查

可能错误:1.参数个数不正确

2.客户端文件存放地址不合法或不存在

3.要求的固定参数不正确

检测代码如下:

if(args.length==1 && args[0].equals("listfiles")){

//……

}else{

if(args.length!=3 || !args[0].equals("download")

|| !new File(args[2]).exists()){

System.out.println("Error Parameters!");

System.out.println("The right parameters are like

'download filename destdir' or 'listfiles'");

System.exit(-1);

}

}

V.完整代码如下:

Server.java

相关文档
最新文档