-4

我想用 java 制作一个聊天信使,它将在 LAN 本地网络上工作。在客户端我有:

Socket socket=new Socket(serverIP, port);

如何理解什么是serverIP,serverSocket正在等待传入连接的计算机的ip地址

这是一个非常小的网络:1 个服务器和 1 个客户端,一个交叉电缆网络

4

3 回答 3

2

客户端必须知道服务器 IP - 它必须是预定义的。客户没有神奇的方法可以找到它。这样你就可以:

  • 在客户端代码中硬编码服务器 IP
  • 运行客户端时将服务器 IP 作为命令行参数传递

如果您的 LAN 路由器设置了DHCP,您的 IP 地址会随着时间而改变,因此第二种变体更好。我想商业聊天客户端有一个众所周知的 URL/IP 硬编码或类似的,他们从中获取聊天服务器地址。

这个 C# 示例 中,通过在同一台机器上运行两者来绕过这个问题,但是您可以看到客户端具有硬编码的“服务器 IP”。

这个 VB 示例中,IP 由用户输入。

编辑:

客户端Socket(如您所写)连接到服务器ServerSocket。ServerSocket 知道客户端 Socket IP 地址,因为客户端只是从该 IP 地址连接到它!如果您不理解这一点,请阅读(并自己尝试)这个出色的教程

“将其作为参数传递”:

假设您有一个名为“project”的文件夹,其中有一个名为“mypackage”的文件夹,其中有一个名为 HelloWorld.class 的文件。HelloWorld.class 是从 HelloWorld.java 编译而来的 Java 类文件,它是一个 Java 源文件,如下所示:

package mypackage;

public class HelloWorld {

public static void main(String[] args) {
    System.out.println("You entered the following arguments from the command line:");
    for (int i = 0; i< args.length; i++) {
        System.out.println(args[i]);
    }
}

将自己放在项目目录中并编写:

java mypackage.HelloWorld commandlineArgument1 commandlineArgument2

它将打印:

You entered the following arguments from the command line:
commandlineArgument1
commandlineArgument2

一个教程

于 2012-12-28T18:41:23.800 回答
0

套接字类用于客户端,因此这将是您要连接的服务器的 IP。

请参阅http://docs.oracle.com/javase/1.4.2/docs/api/java/net/ServerSocket.htmlhttp://docs.oracle.com/javase/1.4.2/docs/api/java /net/Socket.html

于 2012-12-28T18:29:12.740 回答
0

我不想练习网络编程,这是一个真正的程序,并且将要商业化。但无论如何,只有 2 台计算机将通过交叉电缆进入网络。由于该程序将安装在不同的计算机上,因此我在编程时服务器的 IP 对我来说是未知的,并且无法预定义。现在我正在寻找一种方法,让我的程序本身可以在该本地网络中找到服务器的 IP 并可以连接到服务器。所以它不能通过参数传递给客户端,因为它是未知的,程序必须发现......我终于找到了 2 个很好的方法让 java 程序自动找到它的服务器主机名并且用户不会给出对任何 IP 或任何信息进行编程...

1.首先我们找到我们的本地主机名:

InetAddress.getLocalHost().getHostName();

然后我们运行这个命令行:

net view

这将返回当前网络中的主机名(在我的情况下是 LAN 网络),现在我们有了本地主机名和所有主机名,我们可以找到另一台主机(在我的情况下绝对是服务器,因为有网络中只有 2 台计算机...)名称,因此很容易连接到该名称:

Socket socket=new Socket(InetAddress.getByName(SERVER_NAME),port);

2.客户端也可以通过multicastSocketing获取服务器的IP。所有客户端和服务器都加入到预定义 IP 上的组,服务器将其 IP 发送给所有接收者(= 客户端)。

于 2012-12-29T09:10:49.807 回答