我尝试创建一个基于客户端/服务器通信的程序。 在这个程序中,我有几个客户端和几个服务器。 在程序开始时,一些客户端上升,并等待来自不同服务器的新连接。 当第一台服务器启动时,我希望他知道谁是网络中可用的客户端,然后它开始以tcp协议(ServerSocket)与所有这些客户端通信。 但是,如果新客户端启动,则此服务器应该知道它。 当新服务器上升时也会发生同样的情况。
我的第一个想法是使用多播通信。客户端将每5秒向网络发送一次广播,服务器将监听这些消息。 我的问题是如何结合这两种方法(多播和tcp)来构建这个程序。 我应该使用两个不同的端口,一个用于多播,一个用于tcp协议? 是否可以允许服务器\客户端监听带有踏板的不同通信(多播或tcp)?
我只需要一个小小的推动,以及一些基本的代码来开始这个...
编辑:好的,我成功构建了一个多播通信。 代理程序启动,每隔5秒发送一次其名称。 服务器上升,并接收代理的广播。 如果新代理程序启动,服务器就会知道它。
代码如下所示:
代理商代码:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;
import java.util.Scanner;
public class Agent {
private static int portMulticasting = 1004;
private DatagramSocket socket;
private boolean broadcast = true;
private String group = "230.0.0.1"; //group address
private int delay = 5000;
public Agent(){
try{
socket = new DatagramSocket();
System.out.println("agent ready");
}
catch (SocketException e){
e.printStackTrace();
System.exit(1);
}
}
public void start(String agentName){
DatagramPacket packet;
try{
InetAddress address = InetAddress.getByName(group);
while (broadcast){
byte[] buf = new byte[256];
buf = agentName.getBytes();
packet = new DatagramPacket(buf,buf.length,address,portMulticasting);
socket.send(packet);
try{
Thread.sleep(delay);
} catch (InterruptedException e){
System.exit(0);
}
}
socket.close();
} catch (IOException e){
e.printStackTrace();
}
}
public static void main (String[] args) throws IOException {
System.out.println("Enter name of the new agent: ");
Scanner sc = new Scanner(System.in);
String agentName = sc.nextLine();
Agent agent = new Agent();
agent.start(agentName);
}
}
服务器代码:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
public class Server {
public static void main(String[] args) throws IOException {
String groupIP = "230.0.0.1";
int portMulticasting = 1004;
if (args.length > 0)
groupIP = args[0];
try{
//get a multicast socket and join group
MulticastSocket socket = new MulticastSocket(portMulticasting);
InetAddress group = InetAddress.getByName(groupIP);
socket.joinGroup(group);
//get packet
DatagramPacket packet;
while (true){
byte[] buf = new byte[256];
packet = new DatagramPacket(buf,buf.length);
socket.receive(packet);
buf = packet.getData();
int len = packet.getLength();
String received = (new String(buf)).substring(0,len);
try{
System.out.println("Agent name: " + received);
} catch (NumberFormatException e){
System.out.println("cannot interpret number");
}
}
socket.leaveGroup(group);
socket.close();
} catch (IOException e){
e.printStackTrace();
}
}
}
现在,我希望代理继续每5秒发送一次广播,但同时服务器开始与代理一起工作(发送消息,向代理询问信息等)。