gpt4 book ai didi

java - 通过 wifi 连接服务器和客户端套接字

转载 作者:行者123 更新时间:2023-12-01 18:25:15 25 4
gpt4 key购买 nike

这是服务器代码

   void bind(String ip,int port)
{
socket=ServerSocketChannel.open();
socket.configureBlocking(false);

socket.register(acceptChannel=Selector.open(),SelectionKey.OP_ACCEPT);//Since Non Blocking Create Selector
socket.bind(new InetSocketAddress(ip,port));//Binding To Specified IP,Port So clients can connect

accept=threadService.scheduleAtFixedRate(this,100,interval,TimeUnit.MILLISECONDS);
}

void run()//Just Loops And Checks For New Clients
{
try
{
if(acceptChannel.selectNow()==0){return;}

Set<SelectionKey> channels=acceptChannel.selectedKeys();
Iterator<SelectionKey> iterator=channels.iterator();

while(iterator.hasNext())
{
SelectionKey key=iterator.next();
ServerSocketChannel server=(ServerSocketChannel)key.channel();

SocketChannel client=server.accept();
client.configureBlocking(false);

//Do Stuff With Client

iterator.remove();
}
channels.clear();
}
catch(Exception ex){errors.newClientError(ex,mainSocket,client);}
}

这是客户端代码

    SocketChannel clientSocket;
void connect(String IP,int port)throws IOException
{
clientSocket=SocketChannel.open();
clientSocket.configureBlocking(false);

clientSocket.register(connectChannel,SelectionKey.OP_CONNECT);//Non Blocking So Loop to check for status
clientSocket.connect(new InetSocketAddress(IP,port));//Do Actual Connection Here

waiting=threadService.scheduleAtFixedRate(this,100,10,TimeUnit.MILLISECONDS);
}

public void run()//Loops and checks for successful connection
{
try
{
if(connectChannel.selectNow()==0){return;}

Set<SelectionKey> channels=connectChannel.selectedKeys();
Iterator<SelectionKey> iterator=channels.iterator();

while(iterator.hasNext())
{
SelectionKey client=iterator.next();
SocketChannel channel=(SocketChannel)client.channel();

if(channel.finishConnect())
{
client.cancel();

iterator.remove();
channels.clear();

//Yeah we are connected job done

return;
}

iterator.remove();
}
channels.clear();
}
catch(Exception ex)
{

}
}

如您所见,出于项目特定目的,我的客户端和服务器都必须处于非阻塞模式。

现在这段代码可以工作

1)客户端和服务器都在同一台计算机上,并且客户端和服务器的IP参数都是“localhost”

2)客户端和服务器都在同一台计算机上,客户端和服务器的 IP 参数都是我的路由器的网络地址[我在 Windows 中,所以我进入 cmd 类型 ipconfig 并将 IPV4 地址传递到这两个方法中]

问题是当我的客户端位于通过 wifi/lan 连接的不同系统上时,他无法连接到我的服务器。

我将我的服务器绑定(bind)到路由器的 IPV4 地址,并将相同的地址提供给我的客户端在另一台计算机上的 connect() 方法,但他收到“ConnectionTimedOutException”

客户端和服务器的端口参数相同,均为 8001

此测试中两个系统防火墙均已禁用。

知道出了什么问题吗?

最佳答案

我必须使用端口转发来解决我的问题

我采取了以下步骤

1)客户端使用我在 connect() 方法中从 net[whatsmyip.com] 获得的全局[非本地 ipv4] 地址

2)在我的服务器中,我使用本地 ipv4 地址[来自 ipconfig] 调用 bind()

3)我使用的常用端口是 8001,我必须在路由器设置中配置该端口转发,以便它将所有数据包从我的全局 ip:port XXX.XXX.XXX.XXX:8001 转发到我的本地 ipv4 地址:端口192.168.xxx.xxx:8001

这种方法有效,但效率不高,因为当我断开连接并重新连接时,我的 IP 会发生变化。如果有人知道在不配置静态 IP 的情况下连接到服务器的更好解决方案,请分享。谢谢你

关于java - 通过 wifi 连接服务器和客户端套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60239456/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com