Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
TCP Java问题_Java_Sockets_Tcp - Fatal编程技术网

TCP Java问题

TCP Java问题,java,sockets,tcp,Java,Sockets,Tcp,我正在学习如何在Java中使用套接字,并且在编写脚本时遇到了一个问题。我已经为客户机和服务器编写了一个基本脚本,现在希望对其进行扩展。(它或多或少是此处指定的:) 现在我想修改这个程序,让它做一些不同的事情,我希望服务器在连接客户机时,将主目录中所有文件的列表发送到服务器,然后客户机选择一个,并将该文件的详细信息发送回客户机(相当于ls-a in终端)。然后,客户机可以键入yes或no,决定是否要下载该文件 我认为这应该足够简单,所以我想自己做,这样我就可以学习,谁能告诉我如何开始,或者我可以看

我正在学习如何在Java中使用套接字,并且在编写脚本时遇到了一个问题。我已经为客户机和服务器编写了一个基本脚本,现在希望对其进行扩展。(它或多或少是此处指定的:)

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

我认为这应该足够简单,所以我想自己做,这样我就可以学习,谁能告诉我如何开始,或者我可以看一些例子,因为我尝试过搜索,但什么也找不到

非常感谢


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

一旦您设置了基本的请求/响应示例,就不难了。基本上,您必须在服务器内部设置一个类似于switch case的构造,它将根据接收到的内容决定发送什么

差不多

if recievedCommand = Nothing
   Send File List
if recievedCommand = FileName
   Send File info
...
等等。
希望这能让你大开眼界

协议在这里很重要。您可以设计一个文本协议,如示例中的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
然后服务器可以执行以下操作:

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

…或类似的东西。

我们不会为您编写代码。开始破解它,并询问我们在实现您的想法时是否有具体问题。幸好我指定了我不想让任何人编写我的代码,并询问我可以在哪里查看示例和函数,以便我可以自己学习如何做这件事。如果你不想帮忙,你至少不能屈尊。欢迎来到StackOverflow,@FattyBolger!马特是对的,你没有问一个具体的问题。听起来你对你的程序有一个想法,所以试试看。当你遇到一些你无法理解的事情时,回来,发布一些代码,问一个可以客观回答的问题。如果您想要更多关于编程的开放式讨论,那么您可以看看。@Isaac Truett,非常感谢您的帮助!我用一个更具体的问题编辑了我的帖子,这个问题现在困扰着我。我明白了,所以在第一次连接客户端时,我向服务器发送了一些不同的消息,这会触发服务器运行另一个方法,向客户端发送文件列表,从那里我可以使用readLine将客户端消息读取到服务器。非常感谢你澄清这一点。你知道我会如何发送目录中的所有文件吗?File[]fileList=new File(dirName).listFiles()-迭代并生成一个fileList[I].getName()字符串,并将其作为响应发送过来。非常感谢。在这种情况下,主目录是否有任何默认值可以指定为dirName?运行服务器的用户的主目录由
System.getProperty(“user.home”)
指定。您还需要执行一个文件处理示例。使用dirName=“”表示当前目录,“…”=表示父目录,“/”表示根目录。使用谷歌搜索用户的主页目录可能需要一些工作。你能处理读取文件和更改目录吗?
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);