将java.net.Socket.getInputStream()转换为字节[],显示大延迟

将java.net.Socket.getInputStream()转换为字节[],显示大延迟,java,arrays,sockets,datainputstream,Java,Arrays,Sockets,Datainputstream,我设计了一个Java客户机类,它需要通过套接字向Java服务器类发送byte[]数组。这是我的密码: ByteArrayClient.java import java.io.ByteArrayOutputStream; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.Obje

我设计了一个Java客户机类,它需要通过套接字向Java服务器类发送byte[]数组。这是我的密码:

ByteArrayClient.java

import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.Socket;

public class ByteArrayClient {

public static void main(String[] args) {


        //make POJO__________________________
        ByteEncodeSubscriptionReq sr1=ByteEncodeSubscriptionReq.makeRequest(103, "Str1", "Str2");

        //Connection details____________________
        String serverName = "localhost";
        int port = 6060;
        try {

            //Establish Connection with server_______________________________
            System.out.println("ByteArrayClient: Connecting to " + serverName +":" + port+"...");
            Socket client = new Socket(serverName, port);//make new socket
            System.out.println("ByteArrayClient: connected to " + client.getRemoteSocketAddress());

            //Encode POJO to ByteArray________________________________
            byte[] SubscripReqByteArray=ByteEncodeSubscriptionReq.encode(sr1);
             //encoded correctly to a 44 bit byte array
            System.out.println("ByteArrayClient: SubscripTionRequest successfully encoded");

            //Send POJO ByteArray to server__________________________
            ByteArrayOutputStream out = new ByteArrayOutputStream();
            ObjectOutputStream os = new ObjectOutputStream(out);
            os.write(SubscripReqByteArray);;

            System.out.println("ByteArrayClient: POJO sent to server");

            //Receive Server response_________________________________
            InputStream inFromServer = client.getInputStream();
            DataInputStream in = new DataInputStream(inFromServer);
            System.out.println("ByteArrayClient received: " + in.readUTF());

            //close socket____________________________________
            client.close();


        } catch (IOException e) {

            e.printStackTrace();
            System.out.println("PojoClient: Connection Failed");
        }

    }

}
import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketTimeoutException; 


public class ByteArrayServer extends Thread{

        private ServerSocket serverSocket;

        public ByteArrayServer(int port) throws IOException {
            serverSocket = new ServerSocket(port);//create server socket 
            serverSocket.setSoTimeout(15000);//socket closes after 15 seconds
            this.start();
        }

        public void run() {
            while (true) {//server runs infinitely______________
                try {

                    System.out.println("ByteArrayServer: Waiting for client on port " + serverSocket.getLocalPort() + "...");
                    Socket servedClient = serverSocket.accept();//client socket

                    System.out.println("ByteArrayServer: connected to " + servedClient.getRemoteSocketAddress());

                    //Receive Client ByteArray___________________________________________
                    ByteEncodeSubscriptionReq receivedReq=new ByteEncodeSubscriptionReq();//server side POJO
                    System.out.println("ByteArrayServer: created SubscriptionReq Object");
                    InputStream PojoStreamHolder = servedClient.getInputStream();
                    System.out.println("ByteArrayServer: client InputStream received");
                    byte[] clientByteStream=new byte[44];//same size as Pojo byte requirement


                    _____/*MY CODE IS STUCK SOMEWHERE HERE*/__________      



                    servedClient.getInputStream().read(clientByteStream);

                    System.out.println("ByteArrayServer: clientByteStream received: "+clientByteStream[0]+" "+clientByteStream[1]);
                    receivedReq=ByteEncodeSubscriptionReq.decode(clientByteStream);

                    //Send confirmation to Client__________________________________________________
                    DataOutputStream out = new DataOutputStream(servedClient.getOutputStream());
                    if(receivedReq.getRequestSymbol().trim().length()!=0){
                            out.writeUTF("ByteArrayServer received Subscription ID="+receivedReq.getSubscriptionID());
                            System.out.println("ByteArrayServer: new SubscriptionRequest ID="+receivedReq.getSubscriptionID()+" Subscriber_Name="+receivedReq.getSubscriberName());
                    }else{
                            out.writeUTF("ByteArrayServer: did not receive Subscription ID");
                    }
                    //Close Client socket_________________________________________________________
                    //server.close();

                    //serverSocket.close();



                } catch (SocketTimeoutException s) {
                    System.out.println("PojoServer: Socket timed out after " + getTimeElapsedInSeconds(startTime) + " seconds from start");
                    break;
                } catch (IOException e) {
                    e.printStackTrace();
                    break;
                }
            }
        }



        public static void main(String[] args) {
            // int port = Integer.parseInt(args[0]);//to get port as an Argument
            int port = 6060;
            try {
                Thread t = new ByteArrayServer(port);
                startTime = System.currentTimeMillis();

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


    }
…和ByteArrayServer.java

import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.Socket;

public class ByteArrayClient {

public static void main(String[] args) {


        //make POJO__________________________
        ByteEncodeSubscriptionReq sr1=ByteEncodeSubscriptionReq.makeRequest(103, "Str1", "Str2");

        //Connection details____________________
        String serverName = "localhost";
        int port = 6060;
        try {

            //Establish Connection with server_______________________________
            System.out.println("ByteArrayClient: Connecting to " + serverName +":" + port+"...");
            Socket client = new Socket(serverName, port);//make new socket
            System.out.println("ByteArrayClient: connected to " + client.getRemoteSocketAddress());

            //Encode POJO to ByteArray________________________________
            byte[] SubscripReqByteArray=ByteEncodeSubscriptionReq.encode(sr1);
             //encoded correctly to a 44 bit byte array
            System.out.println("ByteArrayClient: SubscripTionRequest successfully encoded");

            //Send POJO ByteArray to server__________________________
            ByteArrayOutputStream out = new ByteArrayOutputStream();
            ObjectOutputStream os = new ObjectOutputStream(out);
            os.write(SubscripReqByteArray);;

            System.out.println("ByteArrayClient: POJO sent to server");

            //Receive Server response_________________________________
            InputStream inFromServer = client.getInputStream();
            DataInputStream in = new DataInputStream(inFromServer);
            System.out.println("ByteArrayClient received: " + in.readUTF());

            //close socket____________________________________
            client.close();


        } catch (IOException e) {

            e.printStackTrace();
            System.out.println("PojoClient: Connection Failed");
        }

    }

}
import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketTimeoutException; 


public class ByteArrayServer extends Thread{

        private ServerSocket serverSocket;

        public ByteArrayServer(int port) throws IOException {
            serverSocket = new ServerSocket(port);//create server socket 
            serverSocket.setSoTimeout(15000);//socket closes after 15 seconds
            this.start();
        }

        public void run() {
            while (true) {//server runs infinitely______________
                try {

                    System.out.println("ByteArrayServer: Waiting for client on port " + serverSocket.getLocalPort() + "...");
                    Socket servedClient = serverSocket.accept();//client socket

                    System.out.println("ByteArrayServer: connected to " + servedClient.getRemoteSocketAddress());

                    //Receive Client ByteArray___________________________________________
                    ByteEncodeSubscriptionReq receivedReq=new ByteEncodeSubscriptionReq();//server side POJO
                    System.out.println("ByteArrayServer: created SubscriptionReq Object");
                    InputStream PojoStreamHolder = servedClient.getInputStream();
                    System.out.println("ByteArrayServer: client InputStream received");
                    byte[] clientByteStream=new byte[44];//same size as Pojo byte requirement


                    _____/*MY CODE IS STUCK SOMEWHERE HERE*/__________      



                    servedClient.getInputStream().read(clientByteStream);

                    System.out.println("ByteArrayServer: clientByteStream received: "+clientByteStream[0]+" "+clientByteStream[1]);
                    receivedReq=ByteEncodeSubscriptionReq.decode(clientByteStream);

                    //Send confirmation to Client__________________________________________________
                    DataOutputStream out = new DataOutputStream(servedClient.getOutputStream());
                    if(receivedReq.getRequestSymbol().trim().length()!=0){
                            out.writeUTF("ByteArrayServer received Subscription ID="+receivedReq.getSubscriptionID());
                            System.out.println("ByteArrayServer: new SubscriptionRequest ID="+receivedReq.getSubscriptionID()+" Subscriber_Name="+receivedReq.getSubscriberName());
                    }else{
                            out.writeUTF("ByteArrayServer: did not receive Subscription ID");
                    }
                    //Close Client socket_________________________________________________________
                    //server.close();

                    //serverSocket.close();



                } catch (SocketTimeoutException s) {
                    System.out.println("PojoServer: Socket timed out after " + getTimeElapsedInSeconds(startTime) + " seconds from start");
                    break;
                } catch (IOException e) {
                    e.printStackTrace();
                    break;
                }
            }
        }



        public static void main(String[] args) {
            // int port = Integer.parseInt(args[0]);//to get port as an Argument
            int port = 6060;
            try {
                Thread t = new ByteArrayServer(port);
                startTime = System.currentTimeMillis();

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


    }
以下是服务器控制台输出:

ByteArrayServer: Waiting for client on port 6060...
ByteArrayServer: connected to /127.0.0.1:64233
ByteArrayServer: created SubscriptionReq Object
ByteArrayServer: client InputStream received
问题是,当服务器无错误地接收流时,它会卡在servedClient.getInputStream().read(ClientByTestStream)附近;方法,不再继续

我也试过了

int count=servedClient.getInputStream().read(clientByteStream);

…但他们也表现出同样的问题


如何在没有额外导入的情况下在两个类之间传递字节数组?

DataInputStream.readFully(Byte[]b)
仅当在inputstream字节中时完成,直到b.length可用。因此,如果你有或没有所有的字节,你肯定需要调试。解决方案是让这些字节可用,这样函数就可以完成。 DataInputStream.read(字节[]b)也是如此。在输入数据可用之前,该方法将被阻止。 请通过调试应用程序确保inputstream有44个字节。 尝试下面的方法来计算可用字节数,您可以轻松地读取这些字节数

//计算输入流中的可用字节数 int count=is.available()


问题出在我的ByteArraCyclient班上。我必须将OutputStream与客户端套接字链接,而不是创建它的新实例。所以我替换了:

ByteArrayOutputStream out = new ByteArrayOutputStream();
ObjectOutputStream os = new ObjectOutputStream(out);
os.write(SubscripReqByteArray);;


谢谢您的提示Ekant

您的代码毫无意义。您正在使用
ObjectOutputStream
发送到服务器,并使用
DataInputStream
在服务器上读取。感谢您的输入。我已经做了改变,事实上你还没有写任何东西到服务器whatsover。仅适用于
ByteArrayOutputStream
。我不知道你指的是什么变化。我没有建议这样做。您关于
DataInputStream.read(byte[]b)
的声明似乎暗示它的行为与
DataInputStream.readFully(byte[]b)
相同,但它没有。请澄清。谢谢EJP,但主要的区别是可读性读取精确字节,因为长度为b,可读性读取可能小于长度b
ByteArrayOutputStream out = new ByteArrayOutputStream();
ObjectOutputStream os = new ObjectOutputStream(out);
os.write(SubscripReqByteArray);;
OutputStream os = client.getOutputStream(out);
os.write(SubscripReqByteArray);;