在发送文件时在同一套接字连接上发送消息

时间:2017-10-08 12:54:18

标签: java android sockets

我的应用可以在服务器客户端之间传输文件和消息。服务器是多线程的,客户端只是连接到它。在传输文件时,如果发送者发送消息,它将作为文件的字节消耗。

我不想打开更多端口,

  

我可以建立与服务器的新连接以进行文件传输吗?或者我   应该为文件打开一个单独的端口。

我不想在传输文件时阻止通信。

问题被标记为重复,但不是,我试图同时发送消息和文件不是一个接一个。我已经可以逐个接收文件了。再读一遍。

此外,由于服务器是多线程的,我无法再次调用server socket.accept()来接收新连接中的文件,因为侦听传入的主线程将尝试处理它。有办法吗?

3 个答案:

答案 0 :(得分:1)

你可以使用文件的所有行的一些系统以这样的字符串开头(文件:linenum),然后在另一侧将它放在一个文件然后发送文本你可以做同样的事情,但与像(文字)这样的标签 服务器:

Scanner in = new Scanner(s.getInputStream());
while(true) {
    String message = in.nextLine();
    if(message.length > 14 && message.substring(0,6).equalsIgnoreCase("(file:") {
        int line = Integer.valueOf(message.substring(6).replaceall(")", ""));
        saveToFile(message.substring(6).replaceAll(")","").replaceAll("<1-9>",""));
    } else {
        System.out.println(message);
    }
}

我认为该代码有效,但我没有检查过,因此可能需要稍作修改

答案 1 :(得分:1)

在我看来,尝试将文件和消息复用到同一个套接字流上是XYProblem

我不是这方面的专家,但听起来你应该阅读&#34; ports vs sockets&#34;。我的理解是ip:port是监听服务的地址。一旦客户端连接,服务器将打开一个套接字来实际进行通信。

技巧是每次客户端连接时,都会生成一个新线程(在新的套接字上)来处理请求。这会立即释放主线程以回到侦听新连接。您的文件传输和消息可以进入同一个端口,但每个新请求都将获得自己的套接字和自己的服务器线程 - &gt;没有碰撞!

请参阅此问题以获取Java实现: Multithreading Socket communication Client/Server

答案 2 :(得分:0)

您可以引入握手协议,客户端可以在其中说明他们是谁(可能已经发生)以及他们从给定连接中想要什么。他们建立的第一个连接可能是关于控制,也许是消息,并且一直在使用。文件传输可以通过辅助连接进行,辅助连接可以在会话期间进行。在客户端和服务器之间建立多个并行连接是完全正常的,这也是@MikeOunsworth也在解释的。

您可以使用的快捷方式是发出短期生存的一次性令牌,客户端在打开辅助连接时可以显示该令牌,然后服务器将立即知道应该开始发送哪个文件。请注意,这种方法可以轻松提高各种安全性(如果令牌编码实际请求数据)和/或可伸缩性问题(如果令牌是完全随机的,必须在某些表中查找)。