繁体   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