0

バイト配列を送信する電話からの接続を受け入れるプログラムがあります。接続が確立されたときに接続をテストできますが、実際に何かを受信して​​いることをどのように知ることができますか? 何かがソケット経由で送信されているかどうかを「確認」するにはどうすればよいですか。以下のコードから、結果のファイル「saved.jpg」を作成できないためです。これは何も受け取っていないということですか?

public class wpsServer {

    //vars
    private int svrPort = 3334;
    private ServerSocket serverSocket;
    private Image image = null;

    public wpsServer()
    {
        try {
             serverSocket = new ServerSocket(svrPort);
             System.out.println("Server started on "+svrPort);
        } 
        catch (IOException e) {
            System.out.println("Could not listen on port: "+svrPort);
            System.exit(-1);
        }
    }

    public void listenForClient()
    {
        Socket clientSocket = null;
        try {
            clientSocket = serverSocket.accept();
            if(clientSocket.isConnected())
                System.out.println("Connected");

          byte[] pic = getPicture(clientSocket.getInputStream());
          InputStream in = new ByteArrayInputStream(pic);
          BufferedImage image = ImageIO.read(in);
          File outputfile = new File("saved.jpg");
          ImageIO.write(image, "jpg", outputfile);

        } 
        catch (IOException e) {

            System.out.println("Accept failed: "+svrPort);
            System.exit(-1);
        }

    }

    public byte[] getPicture(InputStream in) {
          try {
            ByteArrayOutputStream out = new ByteArrayOutputStream();
            byte[] data = new byte[1024];
            int length = 0;
            while ((length = in.read(data))!=-1) {
                out.write(data,0,length);
            }
               return out.toByteArray();
            } catch(IOException ioe) {
            //handle it
           }
           return null;
         }

}
4

1 に答える 1

0

呼び出しは、相手側がソケットを閉じた場合in.readにのみ返されます。-1ソケットが生きている間、その呼び出しはさらにデータが利用可能になるまでブロックされます。

「プロトコル」を変更する必要があります。クライアントは、最初に配列サイズを送信し、次にデータを送信する必要があります。サーバーはその長さを読み取り、それが完了するとファイルの読み取りを停止する必要があります (たとえば、次のファイルの待機に戻ります)。

于 2012-04-11T07:05:54.170 に答える