Java 初学者(客户端-服务器):将多个整数发送到套接字

Java beginner (Client-Server) : Sending multiple Integers to a socket

我有一个非常简单的任务,其中我应该将 2 个整数发送到套接字,套接字将它们的总和发送回“客户端”。

这是我的客户:

int a,b,sum;
    try
    {
        Socket Server_info = new Socket ("localhost", 15000);
        BufferedReader FromServer = new BufferedReader (new InputStreamReader(Server_info.getInputStream()));
        DataOutputStream ToServer = new DataOutputStream(Server_info.getOutputStream());
        while (true)
        {
            System.out.println("Type in '0' at any point to quit");
            System.out.println("Please input a number");
            a = User_in.nextInt();
            ToServer.writeInt(a);
            System.out.println("Please input a second number");
            b = User_in.nextInt();
            ToServer.writeInt(b);
            sum = FromServer.read();
            System.out.println("the sum of "  +a+ " and " +b+ " is: " +sum );
            if (a==0 || b==0)
                break;
        }

这是我的套接字处理程序:

int num1=0 ,num2=0, sum;
    try
    {
        BufferedReader InFromClient = new BufferedReader (new InputStreamReader(soc_1.getInputStream()));
        DataOutputStream OutToClient = new DataOutputStream(soc_1.getOutputStream());
        while (true)
        {
            num1 = InFromClient.read();
            num2 = InFromClient.read();
            sum = num1 + num2 ;
            OutToClient.writeInt(sum);
        }
    }
    catch (Exception E){}

在 运行 客户端上输入第一个整​​数后,我得到了这个:

Type in '0' at any point to quit

Please input a number

5

Connection reset by peer: socket write error

我认为问题出在套接字接收端,我一定是做错了什么。有什么建议吗?

问题是您混合了流和阅读器。 为了成功地将整数从客户端传递到服务器,例如使用 Data[Input/Output]Stream 你应该使用:

    // Server side
    final DataInputStream InFromClient = new DataInputStream(soc_1.getInputStream());
    final DataOutputStream OutToClient = new DataOutputStream(soc_1.getOutputStream());
    // than use OutToClient.writeInt() and InFromClient.readInt()

    // Client side
    final DataInputStream FromServer = new DataInputStream(Server_info.getInputStream());
    final DataOutputStream ToServer = new DataOutputStream(Server_info.getOutputStream());
    // than use ToServer.writeInt() and FromServer.readInt()

如果你假设从客户端向服务器发送一个整数(在本例中使用DataOutputStream.writeInt),使用相应的解码逻辑读取数据非常重要(在我们的例子中DataInputStream.readInt ).

您可以使用 DataInputStream 和 DataOupStream 对象,但我发现在服务器端和客户端使用一对 Scanner 和 PrintWriter 对象更简单。所以这是我对问题的解决方案的实现:

服务器端

import java.io.*;
import java.net.*;
import java.util.*;

public class TCPEchoServer {

    private static ServerSocket serverSocket;
    private static final int PORT = 1234;

    public static void main(String[] args)
    {
        System.out.println("Opening port...\n");
        try {
            serverSocket = new ServerSocket(PORT);
        }
        catch (IOException ioex){
            System.out.println("Unable to attach to port!");
            System.exit(1);
        }
          handleClient();

  }

    private static void handleClient()
    {
        Socket link = null; //Step 2
        try {
            link = serverSocket.accept(); //Step 2
            //Step 3
            Scanner input = new Scanner(link.getInputStream());
            PrintWriter output = new PrintWriter(link.getOutputStream(), true);
            int firstInt = input.nextInt();
            int secondInt = input.nextInt();
            int answer;

            while (firstInt != 0 || secondInt != 0)
            {
                answer = firstInt + secondInt;
                output.println(answer); //Server returns the sum here 4
                firstInt = input.nextInt();
                secondInt = input.nextInt();
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
        finally {
            try {
                System.out.println("Closing connection...");
                link.close();
            }
            catch (IOException ie)
            {
                System.out.println("Unable to close connection");
                System.exit(1);
            }
        }
    }
}

客户端

import java.net.*;
import java.io.*;
import java.util.NoSuchElementException;
import java.util.Scanner;


public class TCPEchoClient {

    private static InetAddress host;
    private static final int PORT = 1234;

    public static void main(String[] args) {
        try {
            host = InetAddress.getLocalHost();
        } catch (UnknownHostException uhEx) {
            System.out.println("Host ID not found!");
            System.exit(1);
        }
        accessServer();
    }

    private static void accessServer() {
        Socket link = null;    //Step 1
        try {
            link = new Socket(host, PORT); //Step 1
            //Step 2
            Scanner input = new Scanner(link.getInputStream());
            PrintWriter output = new PrintWriter(link.getOutputStream(), true);

            //Set up stream for keyboard entry
            Scanner userEntry = new Scanner(System.in);

            int firstInt, secondInt, answer;
            do {
                System.out.print("Please input the first number: ");
                firstInt = userEntry.nextInt();
                System.out.print("Please input the second number: ");
                secondInt = userEntry.nextInt();

                //send the numbers
                output.println(firstInt);
                output.println(secondInt);
                answer = input.nextInt(); //getting the answer from the server
                System.out.println("\nSERVER> " + answer);
            } while (firstInt != 0 || secondInt != 0);
        } catch (IOException e) {
            e.printStackTrace();
        }
        catch (NoSuchElementException ne){   //This exception may be raised when the server closes connection
            System.out.println("Connection closed");
        }
        finally {
            try {
                System.out.println("\n* Closing connection… *");
                link.close(); //Step 4.
            } catch (IOException ioEx) {
                System.out.println("Unable to disconnect!");
                System.exit(1);
            }
        }
    }
}