簡體   English   中英

Java TCP socket程序發送和讀取[x]字節數組。 如何正確循環、發送和發送

[英]Java TCP socket program to send and read [x] bytes array. How to loop, sout and sent correctly

我是 sockets 的新手並編寫基本的 Java 客戶端到服務器到客戶端程序,在這種情況下發送消息的長度outToServer.writeInt(message.length); byte[] message = new byte[10]; 數組到服務器讀取並打印到控制台,然后修改數組中的幾個字節,然后將其發送回客戶端。 客戶端接收數組,讀取它並將其打印到控制台。

我的問題是它只打印:

byte array received from server class: 

0
0
0
0
0
0
0
0
0
0
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

當它應該打印一些具有不同數字的修改字節時。

我認為 for 循環或接收字節的讀取部分存在一些問題。 我應該使用 readFully 還是類似的東西,以及如何正確地循環我想要的值?

非常感謝。

客戶:

class TCPClient2 {

    public static void main(String argv[])
    {


        try {
            System.out.println("Client started");
            Socket clientSocket = new Socket("localhost", 8080);
            DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());
            System.out.println("\nByte array printed before sending to server:\n");

            byte[] message = new byte[10];
            //byte[] message = new byte[] { -1, -128, 1, 127, 23, 23, 23, 23, 23, 10 }; // you can try these too
            message[0] = 1; // changes the first byte of the array


            for(int i = 0; i < message.length; i++) {
                System.out.println(message[i]);     //prints byte array BEFORE being sent to server
            }
            System.out.println(Arrays.toString(message)); //prints byte array BEFORE being sent to server as String
            System.out.println("\n");


            outToServer.writeInt(message.length); // write length of the message
            outToServer.write(message);           // write the message
            //
            //
            // Message -array is now sent to Server
            //
            // Waiting for answer
            //


            // Answer is now received from Server
            System.out.println("byte array received from server class: \n");
            DataInputStream inFromClient = new DataInputStream(clientSocket.getInputStream());


            int length = inFromClient.readInt(); // read length of incoming message
                    /*
                    if(length>0) {
                        byte[] message = new byte[length];
                        dIn.readFully(message, 0, message.length); // read the message
                    }
                        */

            byte[] messageFromServer = new byte[length];
            for(int i = 0; i < messageFromServer.length; i++) {
                System.out.println(messageFromServer[i]);//prints received byte array
            }
            System.out.println(Arrays.toString(messageFromServer));//prints received byte array as a string

        }catch (Exception e) {
            e.printStackTrace();
        }


        }

    }

服務器:

class TCPServer2 {

    public static void main(String argv[])
    {

                try
                {
                    System.out.println("waiting for connections");
                    ServerSocket welcomeSocket = new ServerSocket(8080);
                    Socket connectionSocket = welcomeSocket.accept();
                    System.out.println("connection established");

                    DataInputStream inFromClient =
                            new DataInputStream(connectionSocket.getInputStream());         //receive byte array from client

                    int length = inFromClient.readInt(); // read length of incoming message
                    /*
                    if(length>0) {
                      byte[] message = new byte[length];
                        inFromClient.readFully(message, 0, message.length); // readFully the message, but how?
                    }
                    */

                    byte[]message = new byte[length];
                    for(int i = 0; i < message.length; i++) {
                        System.out.println(message[i]); // print array
                    }

                    System.out.println(Arrays.toString(message)); // print array as string
                    System.out.println("message from client printed");

                    message[0]= 1;      //change bytes of the received array
                    message[9]=1;       //change bytes of the received array

                    DataOutputStream outToClient =
                            new DataOutputStream(connectionSocket.getOutputStream()); //send byte array with changes back to the client

                    outToClient.writeInt(message.length); // write length of the message
                    outToClient.write(message);           // write the message

                    System.out.println("message to client sent");



                } catch (Exception e) {
                    e.printStackTrace();
                }
            }

    }
     

         

問題是您沒有從套接字讀取數據,而只是在本地數組中循環。

您需要更改這些代碼:

1) 服務器

從:

            byte[]message = new byte[length];
            for(int i = 0; i < message.length; i++) {
                System.out.println(message[i]); // print array
            }

至:

            byte[]message = new byte[length];
            for(int i = 0; i < message.length; i++) {
                message[i] = inFromClient.readByte();
                System.out.println(message[i]); // print array
            }

2) 客戶端

從:

    byte[] messageFromServer = new byte[length];
    for(int i = 0; i < messageFromServer.length; i++) {
        System.out.println(messageFromServer[i]);//prints received byte array
    }

至:

    byte[] messageFromServer = new byte[length];
    for(int i = 0; i < messageFromServer.length; i++) {
          messageFromServer[i] = inFromClient.readByte();
        System.out.println(messageFromServer[i]);//prints received byte array
    }

一個例子是沒有指定控件,數組的長度,......

或與您的 function 一起閱讀完全

1) 服務器

    int length = inFromClient.readInt(); // read length of incoming message
    byte[] message = new byte[length];
    if (length > 0) {
        inFromClient.readFully(message, 0, message.length); // readFully the message, but how?
    }

    for (int i = 0; i < message.length; i++) {
        System.out.println(message[i]); // print array
    }

2) 客戶端

    int length = inFromClient.readInt(); // read length of incoming message
    byte[] messageFromServer = new byte[length];
    if (length > 0) {
        inFromClient.readFully(messageFromServer, 0, messageFromServer.length); // read the message
    }

    for (int i = 0; i < messageFromServer.length; i++) {
        System.out.println(messageFromServer[i]);//prints received byte array
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM