0

次のようにC#でプログラムされたサーバーによって転送されたバイトを取得しようとしています:

static void Main(String[] args){
    Socket sListen = new Socket(AddressFamily.InterNetwork, SocketType.Stream,     ProtocolType.Tcp);
    IPAddress IP = IPAddress.Parse("10.0.0.92");
    IPEndPoint IPE = new IPEndPoint(IP, 4321);
    sListen.Bind(IPE);
    Console.WriteLine("Service is listening ...");
    sListen.Listen(2);
    while (true){
        Socket clientSocket;
        try{
            clientSocket = sListen.Accept();
        }
        catch{
            throw;
        }
        byte[] buffer = ReadImageFile("path to image");
        clientSocket.Send(buffer, buffer.Length, SocketFlags.None);
        Console.WriteLine("Send success!");
    }
}

private static byte[] ReadImageFile(String img){
    FileInfo fileinfo = new FileInfo(img);
    byte[] buf = new byte[fileinfo.Length];
    FileStream fs = new FileStream(img, FileMode.Open, FileAccess.Read);
    fs.Read(buf, 0, buf.Length);
    fs.Close();
    //fileInfo.Delete ();
    GC.ReRegisterForFinalize(fileinfo);
    GC.ReRegisterForFinalize(fs);
    return buf;
}

上記のコードは、c# でクライアントを作成し、PC で実行すると正常に動作します。ただし、Android デバイスのサーバーによって転送されたバイトを取得したいと考えています。

アンドロイドはサーバーに正常に接続しましたが、その仕事を終了しません。基本的に、次のコードの「while ループ」を渡しません。「-1」にならないため、バイト長に問題があると思います。

Android Java コード (クライアント):

Socket socket = new Socket("ip", 4321);
InputStream is = socket.getInputStream();
byte[] buffer = new byte[1024];
int read = is.read(buffer);
while(read != -1){
    read = is.read(buffer);
}

is.close();
socket.close();

事前に助けていただければ幸いです。ありがとうございます。

4

2 に答える 2

0

サーバーが接続を閉じるまで、クライアントのread()メソッドが-1を返すことはありません。あなたはそれをしていないので、それは決して起こりません。

于 2012-11-13T12:12:53.443 に答える
0

Javaコードの要点がわかりません。使用read(byte[])しているメソッドは、バッファに 1024 バイト (またはそれ以下) を何度も書き込みます。以前のバッファ コンテンツを上書きしています。ダウンロードしたデータをOutputStream. 例:

    Socket socket = new Socket("ip", 4321);
    InputStream is = socket.getInputStream();
    OutputStream os = ...; // Where to save data, for example, new ByteArrayOutputStream();

    copyStreams(is, os);

    is.close();
    socket.close();


    public static void copyStreams(InputStream is, OutputStream os) throws IOException {
        byte[] buffer = new byte[1024];
        int numBytesRead;

        for (;;) {
            bytesRead = is.read(buffer);
            if (bytesRead <= 0)
                break;
            os.write(buffer, 0, bytesRead);
        }
    }
于 2012-11-13T11:58:25.370 に答える