客户端将号码发送到服务器,但服务器不会将其发回



我已经搜索了答案,但无法完全修复代码。 我希望客户端向服务器发送号码,服务器将 2 个号码相加并发回。问题是,客户端将它们发送到服务器,服务器将它们加起来(至少我认为是这样),但它不会发送任何内容。我现在正在发布客户端代码:

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
InetSocketAddress ep = new InetSocketAddress("127.0.0.1", 1234);
String broj1, broj2;
Scanner sc = new Scanner(System.in);
System.out.print("Unesite 1. broj: ");
broj1 = sc.nextLine();
System.out.println();
System.out.print("Unesite 2. broj: ");
broj2 = sc.nextLine();
if(broj1.contains("[a-zA-Z+]")==true&&broj2.contains("[a-zA-Z+]")){
System.out.println("Niste unijeli brojeve.");
System.exit(0);
}
byte[] brojJedan = new byte[256];
byte[] brojDva = new byte[256];
brojJedan = broj1.getBytes();
brojDva = broj2.getBytes();
DatagramPacket packet1 = new DatagramPacket(brojJedan, brojJedan.length, ep);
DatagramPacket packet2 = new DatagramPacket(brojDva, brojDva.length, ep);
try(DatagramSocket Klijent = new DatagramSocket(1000)){
Klijent.send(packet1);
Klijent.send(packet2);
byte[] rezultat = new byte[256];
DatagramPacket packetRezultat = new DatagramPacket(rezultat, rezultat.length, ep);
Klijent.receive(packetRezultat);
System.out.println(new String(packetRezultat.getData(), 0, packetRezultat.getLength()));
}catch(Exception ex){}
}
}

服务器代码:

import java.awt.*;
import java.net.*;
import java.nio.ByteBuffer;
public class Main{
public static void main(String[] args) {
try {
DatagramSocket serverSocket = new DatagramSocket(1234);
byte[] buff1 = new byte[256];
byte[] buff2 = new byte[256];
byte[] buffRezultat = new byte[256];
while(true){
System.out.println("Client connected.");
DatagramPacket p1 = new DatagramPacket(buff1,buff1.length);
DatagramPacket p2 = new DatagramPacket(buff2, buff2.length);
serverSocket.receive(p1);
System.out.println("p1 recieved");
serverSocket.receive(p2);
System.out.println("p2 recieved");
int rezultat, brojJedan, brojDva;
brojJedan = ByteBuffer.wrap(p1.getData()).getInt();
brojDva = ByteBuffer.wrap(p2.getData()).getInt();
System.out.println("byte converted to int");
rezultat = brojJedan+brojDva;
System.out.println("numbers added");
buffRezultat = ByteBuffer.allocate(1).putInt(rezultat).array();
DatagramPacket pRez = new DatagramPacket(buffRezultat, buffRezultat.length);
serverSocket.send(pRez);
System.out.println("res sent");
}
}catch(Exception ex){}
}
}```

您的代码包含许多问题:

在客户端:

  1. 您正在将String放入出站byte[],同时期望在服务器端进行int

  2. 您正在将端口 1000 与DatagramSocket一起使用,而不应使用任何端口。

  3. 您期望入站byte[]String,同时在服务器端向其int

在服务器端:

  1. 为了从byte[]接收一个int(32位),您必须读取四个字节(每个字节8位)。

  2. 为了通过byte[]发送一个ìnt,您必须分配四个字节。

  3. 从服务器发回客户端的DatagramPacket需要知道客户端的地址和端口。

此代码有效:

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.util.Scanner;
public class Client {
public static void main(String[] args) {
InetSocketAddress ep = new InetSocketAddress("127.0.0.1", 1234);
String broj1, broj2;
Scanner sc = new Scanner(System.in);
System.out.print("Unesite 1. broj: ");
broj1 = sc.nextLine();
System.out.println();
System.out.print("Unesite 2. broj: ");
broj2 = sc.nextLine();
if(broj1.contains("[a-zA-Z+]")&&broj2.contains("[a-zA-Z+]")){
System.out.println("Niste unijeli brojeve.");
System.exit(0);
}
byte[] brojJedan = ByteBuffer.allocate(4).putInt(Integer.parseInt(broj1)).array();
byte[] brojDva = ByteBuffer.allocate(4).putInt(Integer.parseInt(broj2)).array();
DatagramPacket packet1 = new DatagramPacket(brojJedan, brojJedan.length, ep);
DatagramPacket packet2 = new DatagramPacket(brojDva, brojDva.length, ep);
try(DatagramSocket Klijent = new DatagramSocket()){
Klijent.send(packet1);
Klijent.send(packet2);
byte[] rezultat = new byte[256];
DatagramPacket packetRezultat = new DatagramPacket(rezultat, rezultat.length, ep);
Klijent.receive(packetRezultat);
System.out.println(ByteBuffer.wrap(packetRezultat.getData(), 0, 4).getInt());
}catch(Exception e){
e.printStackTrace();
}
}
}

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.nio.ByteBuffer;
public class Server {
public static void main(String[] args) {
try {
DatagramSocket serverSocket = new DatagramSocket(1234);
byte[] buff1 = new byte[256];
byte[] buff2 = new byte[256];
byte[] buffRezultat = new byte[256];
while (true) {
System.out.println("Client connected.");
DatagramPacket p1 = new DatagramPacket(buff1, buff1.length);
DatagramPacket p2 = new DatagramPacket(buff2, buff2.length);
serverSocket.receive(p1);
System.out.println("p1 recieved");
serverSocket.receive(p2);
System.out.println("p2 recieved");
int rezultat, brojJedan, brojDva;
brojJedan = ByteBuffer.wrap(p1.getData(), 0, 4).getInt();
brojDva = ByteBuffer.wrap(p2.getData(), 0, 4).getInt();
System.out.println("byte converted to int" + brojDva + " " + brojJedan);
rezultat = brojJedan + brojDva;
System.out.println("numbers added " + rezultat);
buffRezultat = ByteBuffer.allocate(4).putInt(rezultat).array();
DatagramPacket pRez = new DatagramPacket(buffRezultat, buffRezultat.length, p2.getAddress(), p2.getPort());
serverSocket.send(pRez);
System.out.println("res sent");
}
} catch (Exception ex) {
}
}
}

虽然此代码可以工作(对于某些输入),但它仍然有一些弱点:

  1. 输入验证仅检查是否未使用字母。这不一定给你一个数字(看看这个SO帖子)。

  2. 你不需要发送两个DatagramPacket来传输两个int;一个就足够了。

  3. 使用标准 I/O 流将帮助您写入和读取字节数组。

  4. 实现有意义的异常消息将帮助您编写代码和用户使用该软件。

最新更新