客户端将数字发送到服务器,但服务器不会将其发送回。

huangapple go评论109阅读模式
英文:

Client sends the numbers to the server, but the server doesn't send them back

问题

以下是翻译好的内容:

客户端代码:

  1. import javax.xml.crypto.Data;
  2. import java.io.IOException;
  3. import java.net.DatagramPacket;
  4. import java.net.DatagramSocket;
  5. import java.net.InetSocketAddress;
  6. import java.util.Scanner;
  7. public class Main {
  8. public static void main(String[] args) {
  9. InetSocketAddress ep = new InetSocketAddress("127.0.0.1", 1234);
  10. String broj1, broj2;
  11. Scanner sc = new Scanner(System.in);
  12. System.out.print("Enter the 1st number: ");
  13. broj1 = sc.nextLine();
  14. System.out.println();
  15. System.out.print("Enter the 2nd number: ");
  16. broj2 = sc.nextLine();
  17. if (broj1.contains("[a-zA-Z+]") == true && broj2.contains("[a-zA-Z+]")) {
  18. System.out.println("You did not enter numbers.");
  19. System.exit(0);
  20. }
  21. byte[] brojJedan = new byte[256];
  22. byte[] brojDva = new byte[256];
  23. brojJedan = broj1.getBytes();
  24. brojDva = broj2.getBytes();
  25. DatagramPacket packet1 = new DatagramPacket(brojJedan, brojJedan.length, ep);
  26. DatagramPacket packet2 = new DatagramPacket(brojDva, brojDva.length, ep);
  27. try (DatagramSocket Klijent = new DatagramSocket(1000)) {
  28. Klijent.send(packet1);
  29. Klijent.send(packet2);
  30. byte[] rezultat = new byte[256];
  31. DatagramPacket packetRezultat = new DatagramPacket(rezultat, rezultat.length, ep);
  32. Klijent.receive(packetRezultat);
  33. System.out.println(new String(packetRezultat.getData(), 0, packetRezultat.getLength()));
  34. } catch (Exception ex) {
  35. }
  36. }
  37. }

服务器端代码:

  1. import javax.xml.crypto.Data;
  2. import java.awt.*;
  3. import java.net.*;
  4. import java.nio.ByteBuffer;
  5. public class Main {
  6. public static void main(String[] args) {
  7. try {
  8. DatagramSocket serverSocket = new DatagramSocket(1234);
  9. byte[] buff1 = new byte[256];
  10. byte[] buff2 = new byte[256];
  11. byte[] buffRezultat = new byte[256];
  12. while (true) {
  13. System.out.println("Client connected.");
  14. DatagramPacket p1 = new DatagramPacket(buff1, buff1.length);
  15. DatagramPacket p2 = new DatagramPacket(buff2, buff2.length);
  16. serverSocket.receive(p1);
  17. System.out.println("p1 received");
  18. serverSocket.receive(p2);
  19. System.out.println("p2 received");
  20. int rezultat, brojJedan, brojDva;
  21. brojJedan = ByteBuffer.wrap(p1.getData()).getInt();
  22. brojDva = ByteBuffer.wrap(p2.getData()).getInt();
  23. System.out.println("byte converted to int");
  24. rezultat = brojJedan + brojDva;
  25. System.out.println("numbers added");
  26. buffRezultat = ByteBuffer.allocate(4).putInt(rezultat).array();
  27. DatagramPacket pRez = new DatagramPacket(buffRezultat, buffRezultat.length);
  28. serverSocket.send(pRez);
  29. System.out.println("result sent");
  30. }
  31. } catch (Exception ex) {
  32. }
  33. }
  34. }
英文:

I've searched for answers, but can't quite fix the code.
I want the client to send numbers to the server, the server adds up 2 numbers and sends them back. The thing is, client sends them to the server, server adds them up (at least I think it does) but it doesn't send anything back. I'm posting Client code now:

  1. import java.io.IOException;
  2. import java.net.DatagramPacket;
  3. import java.net.DatagramSocket;
  4. import java.net.InetSocketAddress;
  5. import java.util.Scanner;
  6. public class Main {
  7. public static void main(String[] args) {
  8. InetSocketAddress ep = new InetSocketAddress("127.0.0.1", 1234);
  9. String broj1, broj2;
  10. Scanner sc = new Scanner(System.in);
  11. System.out.print("Unesite 1. broj: ");
  12. broj1 = sc.nextLine();
  13. System.out.println();
  14. System.out.print("Unesite 2. broj: ");
  15. broj2 = sc.nextLine();
  16. if(broj1.contains("[a-zA-Z+]")==true&&broj2.contains("[a-zA-Z+]")){
  17. System.out.println("Niste unijeli brojeve.");
  18. System.exit(0);
  19. }
  20. byte[] brojJedan = new byte[256];
  21. byte[] brojDva = new byte[256];
  22. brojJedan = broj1.getBytes();
  23. brojDva = broj2.getBytes();
  24. DatagramPacket packet1 = new DatagramPacket(brojJedan, brojJedan.length, ep);
  25. DatagramPacket packet2 = new DatagramPacket(brojDva, brojDva.length, ep);
  26. try(DatagramSocket Klijent = new DatagramSocket(1000)){
  27. Klijent.send(packet1);
  28. Klijent.send(packet2);
  29. byte[] rezultat = new byte[256];
  30. DatagramPacket packetRezultat = new DatagramPacket(rezultat, rezultat.length, ep);
  31. Klijent.receive(packetRezultat);
  32. System.out.println(new String(packetRezultat.getData(), 0, packetRezultat.getLength()));
  33. }catch(Exception ex){}
  34. }
  35. }

Server code:

  1. import java.awt.*;
  2. import java.net.*;
  3. import java.nio.ByteBuffer;
  4. public class Main{
  5. public static void main(String[] args) {
  6. try {
  7. DatagramSocket serverSocket = new DatagramSocket(1234);
  8. byte[] buff1 = new byte[256];
  9. byte[] buff2 = new byte[256];
  10. byte[] buffRezultat = new byte[256];
  11. while(true){
  12. System.out.println("Client connected.");
  13. DatagramPacket p1 = new DatagramPacket(buff1,buff1.length);
  14. DatagramPacket p2 = new DatagramPacket(buff2, buff2.length);
  15. serverSocket.receive(p1);
  16. System.out.println("p1 recieved");
  17. serverSocket.receive(p2);
  18. System.out.println("p2 recieved");
  19. int rezultat, brojJedan, brojDva;
  20. brojJedan = ByteBuffer.wrap(p1.getData()).getInt();
  21. brojDva = ByteBuffer.wrap(p2.getData()).getInt();
  22. System.out.println("byte converted to int");
  23. rezultat = brojJedan+brojDva;
  24. System.out.println("numbers added");
  25. buffRezultat = ByteBuffer.allocate(1).putInt(rezultat).array();
  26. DatagramPacket pRez = new DatagramPacket(buffRezultat, buffRezultat.length);
  27. serverSocket.send(pRez);
  28. System.out.println("res sent");
  29. }
  30. }catch(Exception ex){}
  31. }
  32. }```
  33. </details>
  34. # 答案1
  35. **得分**: 2
  36. 你的代码存在一些问题:
  37. 客户端部分:
  38. 1. 在客户端将一个 `String` 放入输出的 `byte[]` 中,但在服务器端期望接收一个 `int`。
  39. 2. 在使用 `DatagramSocket` 时使用了端口 1000,实际上不应该使用任何端口。
  40. 3. 在服务器端期望从输入的 `byte[]` 中接收一个 `String`,但实际上在其中放入了一个 `int`。
  41. 服务器端部分:
  42. 1. 为了从 `byte[]` 中接收一个 `int`(32 位),你需要读取四个字节(每个字节8位)。
  43. 2. 为了通过 `byte[]` 发送一个 `int`,你需要分配四个字节的空间。
  44. 3. 从服务器发送回客户端的 `DatagramPacket` 需要知道客户端的地址和端口。
  45. 这份代码是有效的:
  46. ```java
  47. import java.net.DatagramPacket;
  48. import java.net.DatagramSocket;
  49. import java.net.InetSocketAddress;
  50. import java.nio.ByteBuffer;
  51. import java.util.Scanner;
  52. public class Client {
  53. public static void main(String[] args) {
  54. InetSocketAddress ep = new InetSocketAddress("127.0.0.1", 1234);
  55. String broj1, broj2;
  56. Scanner sc = new Scanner(System.in);
  57. System.out.print("Unesite 1. broj: ");
  58. broj1 = sc.nextLine();
  59. System.out.println();
  60. System.out.print("Unesite 2. broj: ");
  61. broj2 = sc.nextLine();
  62. if (broj1.contains("[a-zA-Z+]") && broj2.contains("[a-zA-Z+]")) {
  63. System.out.println("Niste unijeli brojeve.");
  64. System.exit(0);
  65. }
  66. byte[] brojJedan = ByteBuffer.allocate(4).putInt(Integer.parseInt(broj1)).array();
  67. byte[] brojDva = ByteBuffer.allocate(4).putInt(Integer.parseInt(broj2)).array();
  68. DatagramPacket packet1 = new DatagramPacket(brojJedan, brojJedan.length, ep);
  69. DatagramPacket packet2 = new DatagramPacket(brojDva, brojDva.length, ep);
  70. try (DatagramSocket Klijent = new DatagramSocket()) {
  71. Klijent.send(packet1);
  72. Klijent.send(packet2);
  73. byte[] rezultat = new byte[256];
  74. DatagramPacket packetRezultat = new DatagramPacket(rezultat, rezultat.length, ep);
  75. Klijent.receive(packetRezultat);
  76. System.out.println(ByteBuffer.wrap(packetRezultat.getData(), 0, 4).getInt());
  77. } catch (Exception e) {
  78. e.printStackTrace();
  79. }
  80. }
  81. }
  82. import java.net.DatagramPacket;
  83. import java.net.DatagramSocket;
  84. import java.nio.ByteBuffer;
  85. public class Server {
  86. public static void main(String[] args) {
  87. try {
  88. DatagramSocket serverSocket = new DatagramSocket(1234);
  89. byte[] buff1 = new byte[256];
  90. byte[] buff2 = new byte[256];
  91. byte[] buffRezultat = new byte[256];
  92. while (true) {
  93. System.out.println("Client connected.");
  94. DatagramPacket p1 = new DatagramPacket(buff1, buff1.length);
  95. DatagramPacket p2 = new DatagramPacket(buff2, buff2.length);
  96. serverSocket.receive(p1);
  97. System.out.println("p1 received");
  98. serverSocket.receive(p2);
  99. System.out.println("p2 received");
  100. int rezultat, brojJedan, brojDva;
  101. brojJedan = ByteBuffer.wrap(p1.getData(), 0, 4).getInt();
  102. brojDva = ByteBuffer.wrap(p2.getData(), 0, 4).getInt();
  103. System.out.println("byte converted to int " + brojDva + " " + brojJedan);
  104. rezultat = brojJedan + brojDva;
  105. System.out.println("numbers added " + rezultat);
  106. buffRezultat = ByteBuffer.allocate(4).putInt(rezultat).array();
  107. DatagramPacket pRez = new DatagramPacket(buffRezultat, buffRezultat.length, p2.getAddress(), p2.getPort());
  108. serverSocket.send(pRez);
  109. System.out.println("res sent");
  110. }
  111. } catch (Exception ex) {
  112. }
  113. }
  114. }

尽管这份代码在某些输入情况下可能会工作,但仍然存在一些弱点:

  1. 输入验证只检查是否使用了字母,这并不一定能确保你得到一个数字(查看这个 Stack Overflow 帖子)。

  2. 为了传输两个 int,你不需要发送两个 DatagramPacket,一个足够了。

  3. 使用标准的输入/输出流将有助于你在字节数组上进行写入和读取。

  4. 实现有意义的异常消息将有助于你编写代码并让用户使用软件。

英文:

Your code contains a number of problems:

On the client side:

  1. You are putting a String into the outbound byte[] while expecting an int on the server side.

  2. You are using port 1000 with the DatagramSocket while you shouldn't use any.

  3. You are expecting a String from the inbound byte[] while putting an int into it on the server side.

On the server side:

  1. In order to receive one int (32 bits) from a byte[] you have to read four bytes (8 bits each).

  2. In order to send one &#236;nt via a byte[] you have to allocate four bytes.

  3. The DatagramPacket you send back from the server to the client needs to know the client's address and port.

This code works:

  1. import java.net.DatagramPacket;
  2. import java.net.DatagramSocket;
  3. import java.net.InetSocketAddress;
  4. import java.nio.ByteBuffer;
  5. import java.util.Scanner;
  6. public class Client {
  7. public static void main(String[] args) {
  8. InetSocketAddress ep = new InetSocketAddress(&quot;127.0.0.1&quot;, 1234);
  9. String broj1, broj2;
  10. Scanner sc = new Scanner(System.in);
  11. System.out.print(&quot;Unesite 1. broj: &quot;);
  12. broj1 = sc.nextLine();
  13. System.out.println();
  14. System.out.print(&quot;Unesite 2. broj: &quot;);
  15. broj2 = sc.nextLine();
  16. if(broj1.contains(&quot;[a-zA-Z+]&quot;)&amp;&amp;broj2.contains(&quot;[a-zA-Z+]&quot;)){
  17. System.out.println(&quot;Niste unijeli brojeve.&quot;);
  18. System.exit(0);
  19. }
  20. byte[] brojJedan = ByteBuffer.allocate(4).putInt(Integer.parseInt(broj1)).array();
  21. byte[] brojDva = ByteBuffer.allocate(4).putInt(Integer.parseInt(broj2)).array();
  22. DatagramPacket packet1 = new DatagramPacket(brojJedan, brojJedan.length, ep);
  23. DatagramPacket packet2 = new DatagramPacket(brojDva, brojDva.length, ep);
  24. try(DatagramSocket Klijent = new DatagramSocket()){
  25. Klijent.send(packet1);
  26. Klijent.send(packet2);
  27. byte[] rezultat = new byte[256];
  28. DatagramPacket packetRezultat = new DatagramPacket(rezultat, rezultat.length, ep);
  29. Klijent.receive(packetRezultat);
  30. System.out.println(ByteBuffer.wrap(packetRezultat.getData(), 0, 4).getInt());
  31. }catch(Exception e){
  32. e.printStackTrace();
  33. }
  34. }
  35. }
  36. import java.net.DatagramPacket;
  37. import java.net.DatagramSocket;
  38. import java.nio.ByteBuffer;
  39. public class Server {
  40. public static void main(String[] args) {
  41. try {
  42. DatagramSocket serverSocket = new DatagramSocket(1234);
  43. byte[] buff1 = new byte[256];
  44. byte[] buff2 = new byte[256];
  45. byte[] buffRezultat = new byte[256];
  46. while (true) {
  47. System.out.println(&quot;Client connected.&quot;);
  48. DatagramPacket p1 = new DatagramPacket(buff1, buff1.length);
  49. DatagramPacket p2 = new DatagramPacket(buff2, buff2.length);
  50. serverSocket.receive(p1);
  51. System.out.println(&quot;p1 recieved&quot;);
  52. serverSocket.receive(p2);
  53. System.out.println(&quot;p2 recieved&quot;);
  54. int rezultat, brojJedan, brojDva;
  55. brojJedan = ByteBuffer.wrap(p1.getData(), 0, 4).getInt();
  56. brojDva = ByteBuffer.wrap(p2.getData(), 0, 4).getInt();
  57. System.out.println(&quot;byte converted to int&quot; + brojDva + &quot; &quot; + brojJedan);
  58. rezultat = brojJedan + brojDva;
  59. System.out.println(&quot;numbers added &quot; + rezultat);
  60. buffRezultat = ByteBuffer.allocate(4).putInt(rezultat).array();
  61. DatagramPacket pRez = new DatagramPacket(buffRezultat, buffRezultat.length, p2.getAddress(), p2.getPort());
  62. serverSocket.send(pRez);
  63. System.out.println(&quot;res sent&quot;);
  64. }
  65. } catch (Exception ex) {
  66. }
  67. }
  68. }

While this code would work (for certain input), it still does have a few weak spots:

  1. The input validation only checks if letters are not used. This does not necessarily give you a number (check out this SO post).

  2. You don't need to send two DatagramPacket s in order to transfer two int s; one is enough.

  3. Using standard I/O streams would help you writing to and reading from byte arrays.

  4. Implementing meaningful exception messages would help you write the code and users use the software.

huangapple
  • 本文由 发表于 2020年10月19日 03:33:20
  • 转载请务必保留本文链接:https://go.coder-hub.com/64417520.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定