基于Linux下的Socket通信(操作系统课程设计)
基于Linux下的socket通信
[开发平台]:LINUX
[开发语言]:JAVA
[开发工具]:ECLISPE
[开发人员]:阚广稳(安徽理工大学计算机学院09-2班)
I.系统描述:
本系统含有一个服务器(Server.class)和多个客户端(Clinet.class),可以通过每 个客户端查看和下载服务器端共享文件夹中的文件。
II.功能描述:
查看服务器端共享文件夹列表
操作:在Linux终端下输入java Clinet listfiles。
参数说明:listfiles是固定参数。
结果:列出所有共享文件。
下载服务器端共享文件夹中的文件
操作:在Linux终端下输入java Clinet download filename dirpath。
参数说明:download是固定参数,filename是想要下载的文件名,dirpath是下载文件保存的路径。
结果:下载文件filename到地址dirpath。
III.功能分析以及实现:
A.问题描述:如何创建可以用于多个客户端连接的服务器?
分析解决:因为JAVA语言提供了对多线程的支持,所以我们可以把服务器设计为多线程的,对于每个客户端的连接单独开一条线程与之交互。
主要实现代码:
服务器端:
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;
}
}
问题描述:如何把服务器端的文件列表发送到客户端
分析解决:服务器端如果取得一个文件名就发给客户端也是可行的,但当文件较多的时显得不清晰,如果可以把所有文件名组成的文件列表保存起来,再统一发送到客户端,客户端再统一解析文件列表就显得更合理。这其中也体现了软件设计过程中封装的思想。幸运的是强大的网络编程语言JAVA就可以很好的解决这一问题。遍历服务器端的共享文件夹,把所有文件的文件名以及它们的存储地址存放到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();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();