
[英]What happens to messages sent by sending socket but never read by receiving socket?
[英]Sending messages on same socket connection while a file is being sent
我的应用程序可以在服务器和客户端之间传输文件和消息。 服务器是多线程的,客户端只是连接到它。 传输文件时,如果发件人发送消息,则将其作为文件字节使用。
我不想打开更多端口,
我可以建立与服务器的新连接以进行文件传输吗? 或者我应该为文件打开一个单独的端口。
我不想在传输文件时阻止通信。
该问题被标记为重复,但并非如此,我试图同时发送消息和文件,而不是一个一个地发送。 我已经可以一个接一个地接收文件了。 再读一次。
另外,由于服务器是多线程的,因此我无法再次调用server socket.accept()
来接收新连接中的文件,因为侦听传入的主线程将尝试处理它。 有办法吗?
您可以使用文件的所有行的某种系统,以这样的字符串开头(file: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);
}
}
我认为该代码有效,但我尚未对其进行检查,因此可能需要进行一些修改
在我看来,像XYProblem一样,尝试将文件和消息多路复用到同一套接字流上。
我不是这方面的专家,但是听起来您应该对“端口与套接字”进行一些阅读。 我的理解是ip:port是侦听服务的地址 。 客户端连接后,服务器将打开一个套接字以实际进行通信。
诀窍是,每次客户端连接时,都会在新套接字上生成一个新线程来处理请求。 这立即释放了主线程,以返回侦听新的连接。 您的文件传输和消息可以进入同一个端口,但是每个新请求都将拥有自己的套接字和服务器线程->不会发生冲突!
有关Java实现,请参见以下问题: 多线程套接字通信客户端/服务器
您可以引入一个握手协议,客户端可以在其中声明他们(可能已经发生了)他们是谁,以及他们从给定连接中想要什么。 他们建立的第一个连接可能与控制有关,也许与消息有关,并且始终保持使用状态。 文件传输可以通过辅助连接进行,在会话期间可能会来回进行。 在客户端和服务器之间具有多个并行连接是完全正常的,这也是@MikeOunsworth所解释的。
您可以采取的一种捷径是发布短暂的一次性令牌,客户端在打开辅助连接时可以提供这些令牌,然后服务器将立即知道应该开始发送哪个文件。 请注意,此方法很容易引发各种安全性(如果令牌对实际请求数据进行编码)和/或可伸缩性问题(如果令牌是完全随机的,必须在某些表中查找)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.