2011-03-09 70 views
0

我正在学习如何使用插座与Java和所遇到的问题的脚本我希望写。我已经为客户端和服务器编写了一个基本脚本,现在希望对其进行扩展。 (这或多或少是这里指定的:Link to Oracle tutorial)。TCP Java的质疑

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

我觉得应该很简单,所以我想自己做,这样我就可以学习,任何人都可以告诉我如何开始,或者我可以看一些例子,因为我尝试过搜索和什么也找不到。

非常感谢。

编辑:我怎样才能在一个目录发送的文件列表,有一个函数来获取这个名单?一旦建立了一套基本的请求/响应范例

+2

我们不打算为您编写代码。开始攻击它,并问我们是否有实现你想法的具体问题。 – 2011-03-09 20:47:50

+0

我指定我不希望任何人写我的代码,并要求我在哪里可以看看示例和函数,以便我可以在哪里学习如何自己完成这件事。如果你不会有所帮助的话,那么你至少不会居高临下。 – 2011-03-09 20:49:54

+2

欢迎来到StackOverflow,@FattyBolger!马特是对的,你没有问过一个具体的问题。这听起来像你有一个你想要你的程序做什么的想法,所以试试看。当你碰到一些你无法想象的东西时,回过头来,发布一些代码,然后问一个可以客观回答的问题。如果你正在寻找更多的开放式编程讨论,那么你可以看看[程序员.stackexchange.com](http://programmers.stackexchange.com)。 – 2011-03-09 20:56:21

回答

1

不应该是困难的。你基本上必须在服务器内部设置一个switch结构类型的构造,它将根据接收到的内容决定发送什么。

喜欢的东西

if recievedCommand = Nothing 
    Send File List 
if recievedCommand = FileName 
    Send File info 
... 

等。 希望这会得到你的球滚动

+0

我明白了,所以在第一次连接客户端时,我发送了一些不同的消息给服务器,它触发它运行另一种方法向客户端发送文件列表,然后从那里我可以使用readLine将客户端消息读取到服务器。非常感谢你清除那个。你知道我会如何发送一个目录中的所有文件吗? – 2011-03-09 20:55:58

+0

File [] fileList = new File(dirName).listFiles() - 迭代并构建fileList [i] .getName()的字符串并将其作为响应发送。 – 2011-03-09 21:00:01

+0

非常感谢。在这种情况下,是否可以为主目录提供dirName的默认值? – 2011-03-09 21:03:05

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

...或者是这样的。