作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要在客户端和服务器之间发送和接收数据。服务器将同时管理多个客户端,因此它需要能够以很小的延迟发送和接收数据。
目前,我可以从客户端向服务器发送和接收数据,但这是按程序完成的,因此如果丢失任何数据,服务器将卡住,直到客户端发送新数据。问题是,如果服务器返回数据,那么服务器和客户端都会卡住,等待对方的数据。
我当前接收和发送数据的方法
public void run(){
while(true){
byte[] data = new byte[1024];
DatagramPacket packet = new DatagramPacket(data, data.length);
try {
socket.receive(packet);
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("SERVER > " +new String(packet.getData()));
}
}
public void sendData(byte[] data){
DatagramPacket packet = new DatagramPacket(data, data.length, 6969);
try {
socket.send(packet);
} catch (IOException e) {
e.printStackTrace();
}
}
理想情况下,我想要像 ActionListener 这样的东西,它可以让我在收到数据时得到一个 Action 。目前,每次接收数据时,它都会运行几个时钟周期。
最佳答案
这就是使用线程的用武之地。在编码方面我对java不太了解,但我认为这会对你有所帮助。这是服务器端代码
public static void main(String[] args) throws IOException {
ServerSocket s = new ServerSocket(8000);
while(true) {
Socket socket = s.accept();
HandleClient c = new HandleClient(socket);
Thread t = new Thread(c);
t.start();
}
}
HandleClient代码
public class HandleClient implements Runnable{
Socket socket;
HandleClient(Socket socket){
this.socket = socket;
}
public void run() {
try{
DataInputStream inputFromClient = new DataInputStream(socket.getInputStream());
DataOutputStream outputToClient = new DataOutputStream(socket.getOutputStream());
double radius;
while(true){
radius = inputFromClient.readDouble();
double area = radius * radius * Math.PI;
outputToClient.writeDouble(area);
}
}catch(Exception e) {}
}
}
以及客户端
public static void main(String[] args){
try{
//System.out.println(add);
Socket socket = new Socket("localhost",8000);
Scanner input = new Scanner(System.in);
DataInputStream inputFromServer = new DataInputStream(socket.getInputStream());
DataOutputStream outputToServer = new DataOutputStream(socket.getOutputStream());
double radius;
System.out.println("Client running at IP address: "+socket.getLocalAddress().toString() +"and port number: "+socket.getLocalPort());
System.out.println("Enter the value of radius");
radius = input.nextDouble();
System.out.println("Writing input");
outputToServer.writeDouble(radius);
System.out.println(inputFromServer.readDouble());
}catch (Exception E){}
}
它与您正在处理的内容不同,但它只是一个使用线程处理来自客户端的请求的模板。您可以修改它以使您的项目正常运行。
关于java - 如何在Java套接字中创建接收数据的监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56173761/
我是一名优秀的程序员,十分优秀!