【问题标题】:Reading and Writing array of int socket programming, javaint socket编程的读写数组,java
【发布时间】:2016-09-15 14:21:08
【问题描述】:

我的客户端类应该从用户那里获取 10 个整数输入并将其发送到服务器。服务器应该接受这 10 个数字并对它们进行排序。然后它应该将数组发送回客户端,客户端应该打印它们。我的客户代码是:

public class TCPClient {
public static void main(String[] args) throws UnknownHostException, IOException {
    int arr[]=new int[10];
    int arrFromServer[]=new int[10];
    BufferedReader inFromUser= new BufferedReader(new InputStreamReader(System.in));
    Socket clientSocket = new Socket("localhost",6786);
    DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());
    BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
    for(int i=0;i<10;i++)
        arr[i]=Integer.parseInt(inFromUser.readLine());

    for(int i=0;i<10;i++)
       outToServer.writeInt(arr[i]);

    for(int i=0;i<10;i++)
       arrFromServer[i]=Integer.parseInt(inFromServer.readLine());

    for (int i = 0; i < arrFromServer.length; i++) {
        System.out.println("From Server::"+arrFromServer[i]);
    }
    clientSocket.close();
}
}

我的服务器代码是:

public class TCPServer {
public static void main(String[] args) throws IOException {
    int arrFromClient[]=new int[10];
    ServerSocket welcomeSocket = new ServerSocket(6786);
    while(true){
        Socket connectionSocket = welcomeSocket.accept();
        BufferedReader inFromClient = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));
        DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream());
        for(int i=0;i<10;i++)
        {
            arrFromClient[i]=Integer.parseInt(inFromClient.readLine());
        }
        Arrays.sort(arrFromClient);
        for (int i = 0; i < arrFromClient.length; i++) {
            outToClient.writeInt(arrFromClient[i]);
        }
    }
}
}

当我尝试运行代码时,客户端继续接受数字,直到我手动终止程序。理想情况下,在输入 10 次后,它应该发送到服务器,服务器应该给出排序后的数组。

上面的代码有什么问题。任何帮助将不胜感激。提前致谢。

【问题讨论】:

  • 提示:writeInt vs. readLine
  • 我不明白 :( 我应该使用哪一个?我使用 readLine 读取用户的输入并使用 writeInt 将其写入服务器。这是错误的吗?
  • writeInt 不写一行。这两种方法在 javadocs 中都有解释,我建议阅读它们。
  • 我想写一个整数值。我正在使用 for 并将单个值传递给服务器。
  • 您不能使用readLine() 来读取writeInt() 所写的内容。

标签: java arrays sockets client-server serversocket


【解决方案1】:

您根本不能将Integer.parseInt(inFromClient.readLine())writeInt() 混合使用,您需要使用DataOutputStream 来写入您的整数并使用DataInputStream 来读取它们,以确保您的整数将使用相同的协议正确序列化和反序列化/算法。

服务器:

int arrFromClient[]=new int[10];
ServerSocket welcomeSocket = new ServerSocket(6786);
while(true){
    Socket connectionSocket = welcomeSocket.accept();
    DataInputStream inFromClient = new DataInputStream(connectionSocket.getInputStream());
    DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream());
    for(int i=0;i<10;i++) {
        arrFromClient[i] = inFromClient.readInt();
    }
    Arrays.sort(arrFromClient);
    for (int i = 0; i < arrFromClient.length; i++) {
        outToClient.writeInt(arrFromClient[i]);
    }
}

客户:

int arr[]=new int[10];
int arrFromServer[]=new int[10];
Scanner inFromUser= new Scanner(System.in);
try (Socket clientSocket = new Socket("localhost",6786)) {
    DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());
    DataInputStream inFromServer = new DataInputStream(clientSocket.getInputStream());
    for(int i=0;i<10;i++)
        arr[i]=inFromUser.nextInt();

    for(int i=0;i<10;i++)
        outToServer.writeInt(arr[i]);

    for(int i=0;i<10;i++)
        arrFromServer[i]=inFromServer.readInt();

    for (int i = 0; i < arrFromServer.length; i++) {
        System.out.println("From Server::"+arrFromServer[i]);
    }
}

或者,您可以使用ObjectOutputStreamObjectInputStream 将数组作为对象写入和读取,使用方法writeObjectreadObject 如下:

服务器:

ServerSocket welcomeSocket = new ServerSocket(6786);
while(true){
    Socket connectionSocket = welcomeSocket.accept();
    ObjectInputStream inFromClient = new ObjectInputStream(connectionSocket.getInputStream());
    ObjectOutputStream outToClient = new ObjectOutputStream(connectionSocket.getOutputStream());
    int[] arrFromClient = (int[]) inFromClient.readObject();
    Arrays.sort(arrFromClient);
    outToClient.writeObject(arrFromClient);
}

客户:

int arr[]=new int[10];
Scanner inFromUser= new Scanner(System.in);
try (Socket clientSocket = new Socket("localhost",6786)) {
    ObjectOutputStream outToServer = new ObjectOutputStream(clientSocket.getOutputStream());
    ObjectInputStream inFromServer = new ObjectInputStream(clientSocket.getInputStream());
    for(int i=0;i<10;i++)
        arr[i]=inFromUser.nextInt();

    outToServer.writeObject(arr);
    int[] arrFromServer = (int[])inFromServer.readObject();
    for (int i = 0; i < arrFromServer.length; i++) {
        System.out.println("From Server::"+arrFromServer[i]);
    }
}

【讨论】:

    猜你喜欢
    • 2015-04-01
    • 2015-01-05
    • 2015-04-09
    • 1970-01-01
    • 1970-01-01
    • 2021-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多