我正在尝试构建一个能够在多个客户端同时具有多个TCP连接的套接字。
情况是我的套接字必须从服务器接收命令并将命令重定向到无线传感器(一个命令到一个传感器,而不是广播),并且能够从传感器收集相应的数据然后将它们发送回服务器。与服务器的连接将使用TCP,但与传感器的连接可以是TCP或UDP。 我主要担心的是TCP连接。我正在研究java多线程或线程池插件教程。但我见过的例子只是使用一个端口来处理所有连接。我还试图研究其他可能的解决方案:利用tomcat服务器,java servlet / JSP,套接字通道等......
我不是网络或插座编程的专家,所以我真的希望有经验的人能指出我正确的方向。感谢您在这种情况下提供的任何帮助。
不确定我是否完全理解但似乎没有必要为我的情况获取多个端口。好像我需要关注多线程套接字和Java NIO主题?
再次感谢您的建议和帮助。
答案 0 :(得分:3)
这是一个很大的项目,需要在这里全面回答。但这里有一些一般性指南:
1)如果要在一个端口上创建套接字,则需要创建一个线程来运行它。这称为服务器套接字。因此,从主线程中你需要为每个端口上的每个套接字调用一个线程。
2)每个服务器套接字继续侦听某个端口并等待客户端连接。 当客户端实际连接时,服务器套接字应该单独为该连接打开另一个线程并返回监听。
而(myServerSocket.accept()) { 打开连接线程 }
我的建议是在线学习如何从课程中打开线程,然后按照上面的指南进行操作。
答案 1 :(得分:0)
除非您的连接超过10k,否则大多数Web服务器都能够处理流量。
但也许您应该获得有关连接,套接字和端口之间差异的更多详细信息。看看这个:What is the difference between a port and a socket?
关于你的问题:一个端口可以处理许多连接。您不需要不同的端口用于不同的连接。
答案 2 :(得分:-2)
为什么要使用多个端口?您可以在一个侦听端口上拥有多个连接。它的连接始终在不同的端口上运行。
while (running)
{
try
{
@SuppressWarnings("resource")
Socket socket = serverSocket.accept();
new ServerHandler(socket); // ServerHandler is your class to handle one connection.
}
catch (IOException e)
{
...
}
}
当你真的需要不同的端口时,你可以创建很多线程,每个线程都有一个ServerSocket。端口是计算机上最有限的资源之一。正在运行的线程更加清晰。
forr(int i = 1000; i < 1100; i++)
{
final int port = i;
new Thread(new Runnable()
{
@Override
public void run()
{
try
{
ServerSocket serverSocket = new ServerSocket(port);
Socket socket = serverSocket.accept();
new ServerHandler(socket); // ServerHandler is your class to handle one connection.
}
catch(IOException e)
{
...
}
}
}).start();
}