当前位置:文档之家› 基于Linux下的Socket通信(操作系统课程设计)

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

基于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<String, String> getAllFiles(File file,Map<String, String> 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=newObjectOutputStream(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=newFileInputStream(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=newFileOutputStream(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.javaimport java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import java.io.ObjectOutputStream;import java.io.OutputStream;import .ServerSocket;import .Socket;import java.util.HashMap;import java.util.Map;public class Server {public static void main(String[] args) {ServerSocket serverSocket;Socket socket;try {serverSocket = new ServerSocket(5678);while (true) {socket = serverSocket.accept();System.out.println("Connected from "+socket.getRemoteSocketAddress().toString());new ServerThread(socket).start();}} catch (IOException e) {e.printStackTrace();}}}class ServerThread extends Thread {Socket socket;OutputStream outputStream;InputStream inputStream;public ServerThread(Socket socket) {this.socket = socket;try {outputStream = socket.getOutputStream();inputStream=socket.getInputStream();} catch (IOException e) {e.printStackTrace();}}public void run() {//服务器共享文件存放的地址File file = new File(共享文件夹路径);Map<String, String> map=new HashMap<String, String>();map=getAllFiles(file, map);byte[] info=new byte[8192];try {inputStream.read(info);String fileName=new String(info).trim();if(fileName.equals("listfiles")){//把服务器端的文件列表传到客户端ObjectOutputStream objectOutputStream=new ObjectOutputStream(outputStream);objectOutputStream.writeObject(map);objectOutputStream.close();}else{if(map.containsKey(fileName)){//把client请求的文件发过去File file2=new File(map.get(fileName));FileInputStream fileInputStream=newFileInputStream(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();}}} catch (IOException e) {e.printStackTrace();}}public static Map<String, String> getAllFiles(File file, Map<String, String> 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;}}Client.javaimport java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.ObjectInputStream;import java.io.OutputStream;import .Socket;import .UnknownHostException;import java.util.Map;import java.util.Map.Entry;public class Client {public static void main(String[] args) throws UnknownHostException, IOException, ClassNotFoundException {Socket socket;//获得服务器端的文件列表if(args.length==1 && args[0].equals("listfiles")){socket=new Socket("localhost",5678);OutputStream outputStream=socket.getOutputStream();byte[] info=args[0].getBytes();outputStream.write(info);ObjectInputStream objectInputStream=newObjectInputStream(socket.getInputStream());@SuppressWarnings("unchecked")Map<String, String> map=(Map<String, String>) objectInputStream.readObject();System.out.println("服务器端文件列表如下:");for(Entry<String, String> entry:map.entrySet()){System.out.println(entry.getKey());}}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);}socket=new Socket("localhost",5678);OutputStream outputStream=socket.getOutputStream();byte[] info=args[1].getBytes();outputStream.write(info);InputStream stream=socket.getInputStream();byte[] info2=new byte[30];stream.read(info2);if(new String(info2).trim().equals("error")){System.out.println("Sorry,the File is not exist!");System.exit(-1);}FileOutputStream fileOutputStream=newFileOutputStream(new File(dirpath));int buf=0;//server端的写停止了(既关闭输出流),client端的读才能停止,否则一直等待读取server发来的数据while((buf=stream.read()) != -1){fileOutputStream.write(buf);}stream.close();fileOutputStream.close();outputStream.close();System.out.println("Download Success!");}}}VI.参考书目:1.…………………………………………………………………JAVA网络编程2.…………………………………………………………………鸟哥的Linux私房菜3.…………………………………………………………………操作系统4.…………………………………………………………………软件工程。

相关主题