Java套接字-通过一个连接与其他数据模拟传输的文件

Java套接字-通过一个连接与其他数据模拟传输的文件,java,sockets,file-transfer,Java,Sockets,File Transfer,我有一个多线程服务器来处理客户端请求,并为每个连接的线程创建新线程。这是伟大的工作,我能够发送“文本”消息来回服务器没有问题。就像一个聊天系统 现在我想到了一种能够通过这些客户机连接将文件发送到服务器的方法,但是我在java中看到的每个示例都在服务器/客户机端有一个硬编码的文件名,但是我想设置自己的文件名以实现灵活性。如果它不仅能够接收文件,而且能够同时在同一端口上接收“文本”消息,我会很高兴 我有一个想法,我现在拥有的“文本”消息端口告诉服务器一个文件将从客户端发送,然后服务器打开一个“文件传

我有一个多线程服务器来处理客户端请求,并为每个连接的线程创建新线程。这是伟大的工作,我能够发送“文本”消息来回服务器没有问题。就像一个聊天系统

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

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

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


提前谢谢,我希望我已经说得够清楚了:)

把文件撕成碎片,然后按照“正常”行发送

链接:

  • 短信

  • 起始文件(id听起来像是你在发明FTP。你可能也想看看用Java.WebDAV实现的FTP服务器。

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


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

    当然,这很简单。你只需要先指定消息类型。用一个字节或一行文本即可

    最简单的方法是使用如下单字节:

    //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
    }
    

    现在,这不是很灵活,但是你可以做很多事情。我建议你阅读,这是HTTP的规范。你不需要阅读全部内容,只需要写一个简单的web服务器就足够了。实际上很简单(HTTP在核心是一个非常简单的协议,尽管它现在有很多高级功能)


    如果你真的想学习网络编程,试着编写一个HTTP服务器。这听起来可能让人望而生畏,但别担心,其实一点也不难。

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


    为了实现这种很酷的交错,你可以尝试使用google protobuf库——它们必须向流中读取/写入小块数据,或者使用普通/旧数据。

    当然,客户端必须有一个辅助线程读取文件并发送块。如果客户端将文本消息发送到UI线程,则另一个线程必须同步。任何这样,由于它必须是同步的,我会使用一种同步方法来发送所有类型的消息。基本上,我仍然希望能够在传输文件时将消息发送到服务器:)