2016-09-28 63 views
-1

我设计了一个Java Client类,它需要通过套接字将byte []数组发送到Java Server类。这里是我的代码:将java.net.Socket.getInputStream()转换为显示大延迟的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"); 
     } 

    } 

} 

...和ByteArrayServer.java

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 

是起诉是,虽然服务器没有错误地接收到Stream,但它在serveClient.getInputStream()。read(clientByteStream);方法并且不会继续进行。

我也试过

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

DataInputStream in = new DataInputStream(servedClient.getInputStream()); 
long bStr=in.readLong(); 

ObjectInputStream PojoObjHolder = new ObjectInputStream(PojoStreamHolder); 
byte[] clientByteStream2 = (byte[])PojoObjHolder.readObject(); 

..但他们表现出了同样的问题也是如此。

我应该如何通过两个类之间的字节数组没有额外的导入?

+0

您的代码是没有任何意义。您使用“ObjectOutputStream”发送给服务器,并使用“DataInputStream”读取服务器。 – EJP

+0

感谢您的输入。我已经做了这个改变 –

+1

实际上你没有写任何东西给服务器。仅限于'ByteArrayOutputStream'。我不知道你指的是什么改变。我没有建议一个。 – EJP

回答

0

问题出在我的ByteArrayClient类。我必须将OutputStream链接到客户端套接字,而不是创建它的新实例。所以我代替:

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

OutputStream os = client.getOutputStream(out); 
os.write(SubscripReqByteArray);; 

谢谢你的提示Ekant

0

DataInputStream.readFully(byte[] b)只有在输入流字节到b.length可用时才会结束。所以当然你需要调试,如果你有所有的字节或没有。解决的办法是让这些字节可用,以便函数完成。 与DataInputStream.read相同(byte [] b)该方法被阻塞,直到输入数据可用。 请确保通过调试你的应用程序,输入流有44个字节。 请在下面尝试计算可用字节数,并且您可以轻松阅读这些字节。

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

 // create buffer 
    byte[] bs = new byte[count]; 

    // read data into buffer 
    dis.read(bs); 
+0

有关DataInputStream.read(byte [] b)的声明似乎暗示它的行为与DataInputStream.readFully(byte [] b)'相同,但事实并非如此。请澄清。 – EJP

+0

谢谢EJP,但主要的区别是读取精确的字节作为b的长度,并且读取可以读取的长度可以小于b –