4

我有一个多线程服务器来处理客户端请求,并为每个连接的线程创建新线程。这很好用,我可以毫无问题地来回发送“文本”消息到服务器。就像一个聊天系统。

现在我想到了一种能够通过这些客户端连接将文件发送到服务器的方法,但是我在 java 中看到的每个示例在服务器/客户端总是有一个硬编码的文件名 - 但我想设置自己的为了灵活性。如果它不仅能够接收文件,而且还能在同一个端口上同时接收“文本”消息,我会很高兴。

我有一个想法,我目前拥有的“文本”消息端口告诉服务器一个文件将从客户端发送,然后服务器打开一个“文件传输”端口,仅用于文件传输。这样,“文本”端口可以指定文件的名称等。另一个端口可以非常愉快地发送文件,而不会中断。

有谁知道更好的方法来做到这一点?我真的不想用两个端口,看起来有点乱。我宁愿在服务器端创建一个单独的线程来处理文件传输并同时处理“文本”消息,如果这可能的话?

在此先感谢,我希望我已经足够清楚了:)

4

5 回答 5

4

当然,这很容易。您只需先指定消息类型。一个字节或一行文本。

最简单的方法是使用这样的单个字节:

//to send
Socket s = ...
OutputStream os = s.getOutputStream();
if(messageIsText()){
  os.write(0);
  //send text
else{
  os.write(1); 
  //send file
}

然后在您的服务器中,您可以这样做:

Socket s = serverSocket.accept();
InputStream in = s.getInputStream();
int firstbyte = in.read();
if(firstbyte = 0){
   //read text
}
else{
   //read file
}

现在,这不是很灵活,但是您可以做很多事情。我实际上建议您阅读RFC 2616,这是 HTTP 的规范。您不需要阅读全部内容,只需编写一个简单的 Web 服务器即可。它实际上非常简单(HTTP 是一个非常简单的核心协议,虽然它现在有很多高级特性)

如果您真的想学习网络编程,请尝试编写 HTTP 服务器。这听起来可能令人生畏,但别担心,实际上一点也不难。

于 2010-01-25T14:19:37.123 回答
1

听起来您正在重新发明 FTP。您可能想查看用 Java 实现的 FTP 服务器。WebDAV 也是如此。

于 2010-01-25T14:11:32.267 回答
0

将文件分段并沿“正常”行发送。

东西链接:

  • 短信
  • 起始文件(id <-- 由客户端发明的 id 号,文件名)
  • 文件片段(id,在​​ byte[] 中有一些字节)
  • 结束文件 (id)

服务器接收开始文件并开始一个新的结构保存:*客户端ID *发明ID(并命名为什么不!:)

接下来每个文件块添加字节(可能写入磁盘或其他东西)

结束文件消息会说:好的,刷新并关闭!

服务器可以将文件保存在映射中,从 Key 对象(clientid+fileid)映射到 temp 结构。

于 2010-01-25T14:09:51.443 回答
0

您所描述的几乎就是 FTP 的工作原理。是的,它很混乱,尤其是服务器打开端口的部分,因为在这个防火墙和 NAT 时代,这根本行不通。因此,FTP 必须添加一个“被动模式”,让客户端打开额外的端口。

但是真的没有理由有单独的端口。为什么不简单地使用一种文本消息来宣布“文件来了”,然后在同一端口上立即发送文件?

于 2010-01-25T14:12:45.290 回答
0

好吧,你有两个选择:带外传输(如 FTP,是的,上面的人已经说过),或者你可以做一些交错流。例如,在客户端上,您向流中发出类型/大小标头,然后转储您的文件段或文本消息(相应的字节长度)。在服务器上,您可以通过每个连接线程读取/写入文件段,同时在某个中央消费者线程中处理文本消息(每个连接线程有一个异步生产者)。

对于那种很酷的交错,您可以尝试使用 google protobuf 库——它们有很好的原语来读取/写入小块数据到流中,或者是普通/旧的Object(In|Out)putStream

于 2011-02-11T18:23:08.540 回答