java - 如何在 Java 中复制一个套接字(转移到另一个线程)?

标签 java multithreading sockets transfer

简短的历史:我有一个用 C# 编写的服务器应用程序(更准确地说是 telnet),它为每个连接的客户端打开一个新套接字和一个新线程,例如:

Socket newsock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
Socket clientSocket = newsock.Accept();
Thread _connection = new Thread();
....

用户打开连接后,系统会要求其提供凭据(用户名和密码),然后可以对数据库执行一些操作。一个主要特点是,如果同一个用户尝试从不同的设备连接,连接总是转移到新创建的线程,其他设备断开连接,如:

if (runningThread.UserID == Username.Value)
{
    SocketInformation _infoSock = runningThread.clientSocket.DuplicateAndClose(Process.GetCurrentProcess().Id);
    Socket _oldSocket = runningThread.clientSocket;
    newThread.clientSocket = new Socket(_infoSock); 
    _oldSocket.Close();
}

现在,我必须在 JAVA 中做同样的事情,最大的问题是:我该怎么做?就我目前的观察和发现而言,Java 中没有 DuplicateAndClose 的等价物!

编辑

在阅读了一些帖子和评论后,我认为最好解释一下我需要实现的目标:

假设在 t1 时刻,用户 John 正在使用设备 A 连接到服务器。服务器在套接字 1 上创建 session 1“通话”。稍后,在时刻 t2,同一用户 John 使用设备 B(例如另一台计算机)连接到服务器。服务器创建在套接字 2 上“对话”的 session 2,并向 John 询问他的用户名和密码(服务器创建匿名 session 时不知道这些用户名和密码)。在 t3 时刻,当 John 向服务器提供他的凭据时, session 不再是匿名的。

现在,服务器识别出 John 以及他已经有一个正在运行的 session 这一事实,并且需要将现有 session “传输”到设备 B。由于工作 session 不容易复制,因此最好的传输方式是在 t3 时刻之后指示 session 1 与设备 B 进行“对话”。

在 C# 中,它通过复制套接字 2 并将其提供给 session 1 来工作,但在 Java 中我没有找到这样的功能。那么问题又来了:我如何在 Java 中执行此操作?

非常感谢任何有用的答案!

最佳答案

there is no equivalent in Java for DuplicateAndClose

据此:http://msdn.microsoft.com/en-us/library/system.net.sockets.socket.duplicateandclose(v=vs.110).aspx?cs-save-lang=1&cs-lang=csharp#code-snippet-1 DuplicateAndClose 处理使套接字在进程间可用。这与跨线程执行不同。如果您在 Java 中使用多线程(可能)而不是多进程,您可以直接使用 Socket 对象——无论您在做什么,都不需要任何类型的 DuplicateAndClose 调用。

如果问题是您试图让来自同一个客户端的另一个连接表现得就像它已经基于另一个较早的连接登录一样——这实际上与套接字无关——那是你的内部应用程序状态的问题.为已连接的客户端创建一个同步映射,并编写您需要的逻辑。

关于java - 如何在 Java 中复制一个套接字(转移到另一个线程)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24171426/

相关文章:

java new 运算符和 hashcode()

java - Camel 路由 - 用 HTTP 负载替换消息正文中的 DTO

javascript - Firefox 扩展的线程行为可能吗?

Python:打开大量套接字的更好方法

c++ - 使用 "ctrl c"终止程序时程序不会停止

java - 如何使用 Jexcel API 在 Java 中编辑/修改现有 Excel 文件

java - 为什么用AES加密16个字节的密文是32个字节?

multithreading - 2013年WCF长投票

java - Webapp java同步对象获取

android - 如果我的套接字已连接但未关闭,为什么我要发送 RST?