2016-09-28 6 views
-1

を示すバイトを)(java.net.Socket.getInputStream変換私は、ソケットを介してJavaサーバークラスにバイト[]配列を送信するために必要とされるJavaクライアント・クラスを設計しました。サーバーのコンソール出力[]は大きな遅延を

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 
ここに私のコードです

ストリームがエラーなしでサーバーによって受信されている間、それは、serveClient.getInputStream()の近くで立ち往生することになります。read(clientByteStream);メソッドを実行し、それ以上は進めません。

彼らは同様に同じ問題を示し..but私はまた

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(); 

を試してみました。

余分なインポートを行わずに2つのクラス間でバイト配列を渡す必要がありますか?ときにのみ利用できてb.lengthまでの入力ストリームをバイト単位で

+0

ヒントをいただき、ありがとうございます。 'ObjectOutputStream'を使ってサーバに送信し、' DataInputStream'を使ってサーバを読み込みます。 – EJP

+0

入力いただきありがとうございます。私はその変更を行った –

+1

実際にあなたはサーバに何も書いていません。 'ByteArrayOutputStream'にのみです。私はあなたが何を言及しているのか分かりません。私はそれを提案しなかった。 – EJP

答えて

0

問題は私のByteArrayClientクラスにありました。新しいインスタンスを作成するのではなく、OutputStreamをクライアントソケットにリンクする必要がありました。だから私は置き換え:

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

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

は、あなたのコードは全く意味がありませんEkant

0

DataInputStream.readFully(byte[] b)が終了します。だからあなたがすべてのバイトを持っているかどうかをデバッグする必要があります。そして解決策は、それらのバイトを利用可能にして、関数が終了するようにすることです。 DataInputStream.read(byte [] b)と同じです。このメソッドは、入力データが利用可能になるまでブロックされます。 入力ストリームが44バイトであることをアプリでデバッグしてください。 利用可能なバイトを数えようとすると、それらを簡単に読み取ることができます。

//利用可能なバイトカウント)は(is.available入力ストリーム INTカウント=を形成します。

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

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

'DataInputStream.read(byte [] b)'に関するYoure文は、 'DataInputStream.readFully(byte [] b)'と同じように動作することを暗示しています。どうか明らかにしてください。 – EJP

+0

EJPに感謝しますが、主な相違点は、正確にはバイトの長さが読み込まれ、読み込み可能なバイトの長さはb未満です –

関連する問題