我正在学习如何使用Java套接字,并且遇到了我想编写的脚本的问题。我已经为客户端和服务器编写了一个基本脚本,现在希望扩展它。 (它或多或少是这里指定的那个:Link to Oracle tutorial)。
现在我希望调整这个程序让它做一些不同的事情,我希望服务器在连接客户端时,将主目录中的所有文件列表发送到服务器,然后客户端选择一个,并将该文件的详细信息发送回客户端(相当于终端中的ls -a)。然后客户端可以键入yes或no,决定是否要下载文件。
我觉得它应该很简单,所以我想自己做,以便我可以学习,任何人都可以告诉我如何开始,或者我可以看一些例子,因为我已经尝试过搜索并且可以一无所获。
非常感谢。
编辑:如何发送目录中的文件列表,是否有获取此列表的功能?
答案 0 :(得分:1)
一旦设置了基本的请求/响应示例,就不难了。您基本上必须在服务器内部设置一个switch case类型的构造,它将根据它收到的内容决定发送什么。
像
这样的东西if recievedCommand = Nothing
Send File List
if recievedCommand = FileName
Send File info
...
等等。 希望这能让你的球开始滚动
答案 1 :(得分:0)
协议在这里非常重要。您可以在示例中设计类似KnockKnockProtocol的文本协议。 e.g:
client: LIST
server: FILES foo.txt bar.txt
client: DETAILS bar.txt
server: DETAILS bar.txt 123421 0644 myuser mygroup
client: GET bar.txt
server: FILEDATA bar.txt <base64-encoded content or such>
client: QUIT
但是已经有很多这样的人,设计好的协议很难,而且很容易在解析器等中编写错误。这通常是不值得的。
但是......你将java用于客户端和服务器,java可以序列化对象,这样你就可以通过网络流发送整个对象。这样你就不必费心解析问题了。
只需通过ObjectInputStream阅读网络套接字,然后通过ObjectOutputStream进行搜索。这样,您就可以拥有对协议的请求和响应进行建模的类。
public interface Request implements Serializable {
}
public class ListFilesRequest implements Request {
}
public class FileDetailsRequest implements Request {
public String fileName;
}
public class DownloadFileRequest implements Request {
public String fileName;
}
public interface Response implements Serializable {
}
public class FileListResponse implements Response {
public String[] fileNames;
}
public class FileDetailsResponse implements Response {
public String fileName;
public int fileSize;
public int fileMode;
}
public class FileDataResponse implements Response {
public String fileName;
public byte[] fileData;
}
然后服务器可以执行以下操作:
ObjectInputStream objInput = new ObjectInputStream(mySocket.getInputStream());
ObjectOutputStream objOutput = new ObjectOutputStream(mySocket.getOutputStream());
Object requestObject = objInput.readObject();
Response responseObject = null;
if (requestObject instanceOf ListFilesRequest) {
FileListResponse response = new FileListResponse();
response.fileNames = new String[] { "foo.txt", "bar.txt" };
responseObject = response;
}
else if (requestObject instanceOf FileDetailsRequest) {
FileDetailsRequest request = (FileDetailsRequest)requestObject;
String fileName = request.fileName;
...
}
objOutput.writeObject(responseObject);
......或类似的东西。