gpt4 book ai didi

java - 如何在Java、TCP/IP服务器/客户端模型中使用套接字获取远程IP地址?

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

所以我有一个在桌面应用程序中使用 Socket 和 ServerSocket 的 TCP/IP 服务器/客户端模型(一个应该在网络中玩的游戏)。

我需要获取服务器远程 IP 地址,以便客户端应用程序可以在打开的服务器应用程序的特定端口上连接到它。

public class ServerConnection {

private int PORT = 8100;
private ServerSocket serverSocket = null;

public void create() throws IOException {
serverSocket = new ServerSocket();
serverSocket.bind(new InetSocketAddress("localhost", PORT));
}

public void close() throws IOException {
serverSocket.close();
}

public ClientConnection acceptRequest() throws IOException {
Socket socket = serverSocket.accept();
return new ClientConnection(socket);
}

public ServerConnection() throws IOException {
}
}
public class ClientConnection {

private String adress = "127.0.0.1";
private int PORT = 8100;
private Socket socket = null;
private PrintWriter out = null;
private BufferedReader in = null;

public ClientConnection() {

}

public ClientConnection(Socket socket) throws IOException {
this.socket = socket;
out = new PrintWriter(socket.getOutputStream(), true);
in = new BufferedReader(new InputStreamReader(
socket.getInputStream()));
}

public void connect() throws UnknownHostException, IOException {
socket = new Socket(adress, PORT);
out = new PrintWriter(socket.getOutputStream(), true);
in = new BufferedReader(new InputStreamReader(
socket.getInputStream()));
}


public void close() throws IOException {
if (out != null) {
out.close();
}
if (in != null) {
in.close();
}
if (socket != null) {
socket.close();
socket = null;
}
}

public void send(String request) {
if (socket != null) {
out.println(request);
}
}

public String receive() throws IOException {
if (socket != null) {
return in.readLine();
}
return null;
}
}

它在本地主机上运行良好,但我希望它能够在任何地方运行(服务器和客户端)。所以我需要一种方法让服务器找出它当前的远程IP,用户将通过一些通信线路(IM、电子邮件等)发送它,然后客户端将输入地址并连接到服务器。因此,一个应用程序既可以充当服务器也可以充当客户端,因此不需要一个稳定的服务器应用程序来持续运行并为客户端提供服务

最佳答案

如果您的客户端和服务器位于同一网段,Zeroconf 是一个非常有吸引力的零配置(嗯...)解决方案。你会发现一个Java实现with JmDNS

此外,从头开始实现一个稳定的协议(protocol)并不是一件容易的事。如果不是出于教育目的,我建议依靠类似的东西

  • Apache ·米娜
  • 灰熊
  • Netty 3
  • 快速服务器
  • xSocket

这些库为您提供了许多重要的功能,例如错误处理和并发(非阻塞调用)。

如果你想从外部访问你的服务器,你不能绑定(bind)到“localhost”。请参阅 ServerSocket.bind。您可以绑定(bind)“null”并通过ServerSocket.getInetAddress请求默认使用的网络适配器。

关于java - 如何在Java、TCP/IP服务器/客户端模型中使用套接字获取远程IP地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10540146/

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