2016-05-10 22 views
0

私はビデオファイル転送をしようとしていますが、サーバにバイトの送信を開始させるのに問題があります。TCPビデオファイル転送

最初の手順は、クライアントが接続するためのものです。ソケットは受け入れられます。クライアントはビデオファイル名を送信しますが、サーバーはこれを読み取ることはありません。

これは、それまでのブロックサーバーアップのためのコードです:

try(ServerSocket serverSocket = new ServerSocket(4005)) 
    { 
     Socket socket = serverSocket.accept(); 
     System.out.println("accepted"); 
     OutputStream os = socket.getOutputStream(); 

     BufferedReader receiveReader = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
     System.out.println("This gets printed"); 
     String request = receiveReader.readLine();//never passes this line 
     System.out.println("This doesn't get printed"); 

、これは、それまでのビデオバイトを送信するためにサーバーを待っているブロックのクライアントです:

try(Socket socket = new Socket(IPAddress, 4005)) 
      { 
       byte[] messageBytes = new byte[10000]; 

       DataOutputStream outputStream = new DataOutputStream(socket.getOutputStream()); 
       outputStream.writeBytes("REQUEST;"+videoPath);//This is the line that should send the bytes for the server to read, so it won't block. 

       String home = System.getProperty("user.home"); 
       String path = home+"\\Downloads" + videoName; 
       path = path.trim(); 
       FileOutputStream fos = new FileOutputStream(path); 
       BufferedOutputStream bos = new BufferedOutputStream(fos); 
       InputStream is = socket.getInputStream(); 

       int bytesRead = 0; 
       System.out.println("Downloading file..."); 
       while((bytesRead = is.read(messageBytes))!=-1)//This blocks here 

なぜサーバが送信している"Request" + videoPathバイトを読み取っているサーバではありませんか?私もoutputStream.flush()を試しましたが、運はありません。

答えて

2

通常の問題です。あなたは行を読んでいるが、行を書いているわけではない。送信されたメッセージにラインターミネータを追加します。

これを修正すると、同じソケットでバッファリングされたストリームとリーダーを混在させることができないことがわかります。 DataInput/OutputStreamクラスを使用してすべてのI/Oを実行し、その名前にread/writeUTF()を使用することをお勧めします。

もしあなたがsending multiple filesなら私の答えを見てください。

+0

答えてくれてありがとうございます、あなたは '' REQUEST ''を意味しますか?+ videoPath'は '' REQUEST '+' + videoPath + ''です。私はあなたの第2段落であなたが何を意味しているかを理解していません。あなたは私がDataOutputStreamを使用した後にFileOutputStreamを使うことができないと言っていますか? – Aequitas

+0

私は* bufferedと言っています*あなたは 'BufferedReader'を使っています。バッファリングされたリーダーを使用して、基本ストリームを直接使用することはできません。 – EJP

+0

申し訳ありませんが、私はそれをどうやって行うのか分かりません。あなたが提案したように新しい行が機能しましたが、今ではビデオを送信するときにファイルが受信側コンピュータで再生されません。私はこれがあなたが暗示した問題のためかもしれないと思いますか?この例では、バッファリングされたストリームのデータ入力ストリームを使用するようにリンクしています。 – Aequitas

関連する問題