TCP Java问题

时间:2011-03-09 20:45:05

标签: java sockets tcp

我正在学习如何使用Java套接字,并且遇到了我想编写的脚本的问题。我已经为客户端和服务器编写了一个基本脚本,现在希望扩展它。 (它或多或少是这里指定的那个:Link to Oracle tutorial)。

现在我希望调整这个程序让它做一些不同的事情,我希望服务器在连接客户端时,将主目录中的所有文件列表发送到服务器,然后客户端选择一个,并将该文件的详细信息发送回客户端(相当于终端中的ls -a)。然后客户端可以键入yes或no,决定是否要下载文件。

我觉得它应该很简单,所以我想自己做,以便我可以学习,任何人都可以告诉我如何开始,或者我可以看一些例子,因为我已经尝试过搜索并且可以一无所获。

非常感谢。

编辑:如何发送目录中的文件列表,是否有获取此列表的功能?

2 个答案:

答案 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);

......或类似的东西。