Java中的服务器客户端程序
我正在实现一个程序,其中控制器(服务器)定期调用代理(客户端)并将其发送到IP地址 Controller.javaJava中的服务器客户端程序,java,client,Java,Client,我正在实现一个程序,其中控制器(服务器)定期调用代理(客户端)并将其发送到IP地址 Controller.java public class Controller { static int discoveryInterval; NetworkDiscovery n1; Controller(){ discoveryInterval=6000; } public static void main(String[] arg
public class Controller {
static int discoveryInterval;
NetworkDiscovery n1;
Controller(){
discoveryInterval=6000;
}
public static void main(String[] args) throws IOException {
Timer t1=new Timer();
t1.schedule(new NetworkDiscovery(), discoveryInterval);
}
}
NetworkDiscovery.java-
import java.io.*;
public class NetworkDiscovery extends TimerTask {
protected DatagramSocket socket = null;
protected BufferedReader in = null;
public NetworkDiscovery() throws IOException {
this("NetworkDiscovery");
}
public NetworkDiscovery(String name) throws IOException {
super(name);
socket = new DatagramSocket(4445);
}
public void run() {
try {
byte[] buf = new byte[256];
// receive request
DatagramPacket packet = new DatagramPacket(buf, buf.length);
socket.receive(packet);
// figure out response
String dString = InetAddress.getLocalHost().toString();
buf = dString.getBytes();
// send the response to the client at "address" and "port"
InetAddress address = packet.getAddress();
int port = packet.getPort();
packet = new DatagramPacket(buf, buf.length, address, port);
socket.send(packet);
} catch (IOException e) {
e.printStackTrace();
}
socket.close();
}
}
在代理方(客户方)-
Agent.java
public class Agent {
ackDiscovery ackDisc=new ackDiscovery();
public static void main(String[] args) throws SocketException,UnknownHostException,IOException {
ackDiscovery ackDisc=new ackDiscovery();
ackDisc.ackInfo();
}
}
和ackDiscovery.java-
public class ackDiscovery {
int agentListenPort;
void ackDiscovery(){
agentListenPort=4455;
}
public void ackInfo() throws SocketException, UnknownHostException, IOException{
// get a datagram socket
DatagramSocket socket = new DatagramSocket();
// send request
byte[] buf = new byte[256];
InetAddress address = InetAddress.getByName(MY_IP);
DatagramPacket packet = new DatagramPacket(buf, buf.length, address, 4445);
socket.send(packet);
// get response
packet = new DatagramPacket(buf, buf.length);
socket.receive(packet);
// display response
String received = new String(packet.getData());
System.out.println("Data received:"+ received);
socket.close();
}
}
当我运行控制器(服务器)时,代理(客户端)端只执行一次,尽管控制器仍在侦听。而且,如果我重新运行代理,什么也不会发生。有人能帮我吗?如果你看一下这里的计划方法的定义: 您可以看到,只有一个长参数的方法只执行一次。 你要找的是有两个长参数的。这将等待延迟ms,然后每隔周期执行一次 您正在使用的一个将仅在延迟毫秒后执行一次
您可能还希望查看使用非阻塞io(java.nio.*)接收连接或使用接收超时。这样,您就不会同时运行多个线程。1)要更快地获得更好的帮助,请发布一个。2) 请在代码中使用缩进。缩进有助于提高可读性。@Andrew Thompson-当然,我会马上编辑它。编辑的时候很好。不幸的是:1)理想情况下,SSCCE应该是单个源文件。2) 这对于服务器/客户机设置来说很棘手(但并非不可能),最好链接到最新版本的JavaDocs。有关如何获取该链接的提示,请参阅。我的朋友,没有意识到这是一个旧链接。该提示涉及使用Google查找JavaDoc链接。你读过吗?我读过,但当我第一次得到链接时,我关心的是回答这个问题,而不是javadoc对于那个类的更新程度。像这样的类很少更改。@xthexter-I在服务器端实现scheduleAtFixedRate(),在客户端也需要做同样的事情。但是我如何同步它们呢?欢迎任何指点。