gpt4 book ai didi

java - 将IP从服务器发送到客户端。 Java网络

转载 作者:行者123 更新时间:2023-12-03 11:59:38 24 4
gpt4 key购买 nike

我的目标是创建一个服务器-客户端程序,该程序发送服务器的IP号码并让客户端连接到IP号码(服务器)。
这样看,我有一个树莓派,它是服务器,它的IP应该发送到作为客户端的多台计算机上。
我已经尝试了一些完成的“多聊天服务器-客户端”代码以及将服务器连接到客户端的其他代码,但是问题是,客户端如何找到服务器?

这就是我想要做的:
1.服务器监听特定端口,例如:端口3000。
2.客户端应向该端口发送一条消息或其他IP地址(192.168.1.0-255)。
3.当消息或IP与服务器正在监听的内容正确时,服务器应将其IP发送回客户端。

换句话说,我们不会在服务器端对任何IP进行硬编码,每次服务器重新启动时IP都会更改,依此类推,因此程序应允许客户端将IP发送到端口,直到IP正确为止。无论服务器是什么IP,请同时连接两者。

这是我编写和尝试的一些代码,但不是我要尝试的代码。
如果您有一些站点,教程,要看的地方,请告诉我,我不需要任何完成的代码,只想了解客户端如何才能找到服务器b发送IP直到连接。

这也是我一直在查看的链接,但没有找到我要尝试的操作。 http://cs.lmu.edu/~ray/notes/javanetexamples/

那你真多。

服务器:

public class SocketServer {

public static void main(String[] args) throws Exception {

SocketClient ip = new SocketClient();

System.out.println("Server started.");
ServerSocket ss = new ServerSocket(3000);
System.out.println("Server is waiting for client...");
Socket s = ss.accept();

System.out.println("Client connected.");
ip.getIpNumber();

BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
String str = br.readLine();

System.out.println("Client sent: " + str);

}
}

客户:
public class SocketClient {

public static void main(String[] args) throws Exception {

String ip = "localhost";
int port = 3000;
Socket s = new Socket(ip, port);
Scanner scn = new Scanner(System.in);
System.out.println("Send message to server...");
String str = scn.next();

OutputStreamWriter os = new OutputStreamWriter(s.getOutputStream());
PrintWriter out = new PrintWriter(os);
out.println(str);
out.flush();
}

public void getIpNumber() {

try {
String ip = InetAddress.getLocalHost().getHostAddress();
System.out.println("Clients ip number is: " + ip);

} catch (UnknownHostException e) {
System.out.println("UnknownHostException");
e.printStackTrace();
}
}
}

编辑1:
我确实创建了MultiCast Sender&Receiver,这是代码。

多播发件人:
public class MulticastSender {

public static void main(String[] args) {

try {
InetAddress group = InetAddress.getByName("224.0.0.1");
MulticastSocket multicastSocket = new MulticastSocket();
String ipMessage = "Multimessage";
DatagramPacket datagramPacket = new DatagramPacket(ipMessage.getBytes(), ipMessage.length(), group, 3000);
multicastSocket.send(datagramPacket);
multicastSocket.close();


} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}

组播接收器:
    public static void main(String[] args) {

try {
InetAddress group = InetAddress.getByName("224.0.0.1");
MulticastSocket multicastSocket = new MulticastSocket(3000);
multicastSocket.joinGroup(group);
byte[] buffer = new byte[100];
DatagramPacket datagramPacket = new DatagramPacket(buffer, buffer.length);
multicastSocket.receive(datagramPacket);
System.out.println(new String(buffer));
multicastSocket.close();


} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}

编辑2:

在Ipper的帮助下,并链接到Michiel De Mey网站,这是我从中获得的,并且可以正常工作,但是如果我以错误的方式或其他方式进行了编辑,请告诉我。

服务器:
public class Server implements Runnable {

DatagramSocket socket;

public static void main(String[] args) {

Thread discoveryThread = new Thread(Server.getInstance());
discoveryThread.start();
}

@Override
public void run() {

try {

//Keep a socket open to listen to all the UDP traffic that is destined for this port
socket = new DatagramSocket(3000, InetAddress.getByName("0.0.0.0"));
socket.setBroadcast(true);

while (true) {
System.out.println(getClass().getName() + ": Ready to receive broadcast packets!");

//Receive a packet
byte[] recvBuf = new byte[15000];
DatagramPacket packet = new DatagramPacket(recvBuf, recvBuf.length);
socket.receive(packet);

//Packet received
System.out.println(getClass().getName() + ": Discovery packet received from: " + packet.getAddress().getHostAddress());
System.out.println(getClass().getName() + ": Packet received; data: " + new String(packet.getData()));

//See if the packet holds the right command (message)
String message = new String(packet.getData()).trim();
if (message.equals("DISCOVER_FUIFSERVER_REQUEST")) {
byte[] sendData = "DISCOVER_FUIFSERVER_RESPONSE".getBytes();

//Send a response
DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, packet.getAddress(), packet.getPort());
socket.send(sendPacket);

System.out.println(getClass().getName() + ": Sent packet to: " + sendPacket.getAddress().getHostAddress());
}
}
} catch (IOException ex) {
Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
}
}

public static Server getInstance() {
return DiscoveryThreadHolder.INSTANCE;
}

private static class DiscoveryThreadHolder {

private static final Server INSTANCE = new Server();
}
}

客户:
public class Client {

public static void main(String[] args) {

Client client = new Client();
client.connect();

}

public void connect() {

try {
DatagramSocket c;
c = new DatagramSocket();
c.setBroadcast(true);
byte[] sendData = "DISCOVER_FUIFSERVER_REQUEST".getBytes();

try {

byte[] buf = new byte[256];
InetAddress ip = InetAddress.getByName("255.255.255.255");
DatagramPacket packet = new DatagramPacket(sendData, sendData.length, ip, 3000);
c.send(packet);
System.out.println(getClass().getName() + ": Request packet sent to: 255.255.255.255 (DEFAULT)");

} catch (IOException e) {
e.printStackTrace();

}

// Broadcast the message over all the network interfaces
Enumeration interfaces = NetworkInterface.getNetworkInterfaces();
while (interfaces.hasMoreElements()) {
NetworkInterface networkInterface = (NetworkInterface) interfaces.nextElement();

if (networkInterface.isLoopback() || !networkInterface.isUp()) {
continue; // Don't want to broadcast to the loopback interface
}

for (InterfaceAddress interfaceAddress : networkInterface.getInterfaceAddresses()) {
InetAddress broadcast = interfaceAddress.getBroadcast();
if (broadcast == null) {
continue;
}

// Send the broadcast package!
try {
DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, broadcast, 3000);
c.send(sendPacket);

} catch (Exception e) {

}

System.out.println(getClass().getName() + ": Request packet sent to: " + broadcast.getHostAddress());
}
}

System.out.println(getClass().getName() + ": Done looping over all network interfaces. Now waiting for a reply!");

//Wait for a response
byte[] recvBuf = new byte[15000];
DatagramPacket receivePacket = new DatagramPacket(recvBuf, recvBuf.length);
c.receive(receivePacket);

//We have a response
System.out.println(getClass().getName() + ": Broadcast response from server: " + receivePacket.getAddress().getHostAddress());

//Check if the message is correct
String message = new String(receivePacket.getData()).trim();
if (message.equals("DISCOVER_FUIFSERVER_RESPONSE")) {
//DO SOMETHING WITH THE SERVER'S IP (for example, store it in your controller)
System.out.println("Server's IP: " + receivePacket.getAddress());
}

//Close the port!
c.close();
} catch (IOException ex) {

}
}
}

最佳答案

这个例子应该提供您所需要的(如果您想自己编写代码):

http://michieldemey.be/blog/network-discovery-using-udp-broadcast/

您可能还需要考虑使用诸如以下的库

  • https://github.com/jmdns/jmdns
  • http://jslp.sourceforge.net/jSLP/userguide.html
  • 关于java - 将IP从服务器发送到客户端。 Java网络,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44019556/

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