ソケット(Tcp)送信は、ストリームの前に標識を付ける.


開発では、このような需要があります.2台の携帯電話は、文字列、bitmap、xmlファイルなどを転送するために、Tcp伝送データを確立します.異なるタイプのデータなので、サーバーで受信する時には、今回得られた流れを別の解析方式で解析する必要があります.だから、ここでは卵痛の問題があります.今回のデータの種類をどうやって知るべきですか?これはこのブログで言うべきことです.ストリームの前に標識をつけるということです.
1.標識が追加されていない、つまり、自分で一つのプロトコルを定義して、伝送行為を制約し、自分で定義した規則に従って実行する.Socketにあまり詳しくないなら、このブログを見てください.送信先を見てください.
Socket s = new Socket(serverAddress, 10086);
OutputStream out = s.getOutputStream();
out.write("1#    ".getBytes());//1#        
s.close();
2.受信側
ServerSocket ss = new ServerSocket(10086);
Socket accept = ss.accept();
 //3.            
InputStream in = accept.getInputStream();
int count = 0;
while (count == 0) {//      
    count = in.available();
}
 String flag = getBodyLength(in);//        
 //   flag      1# ,                
 //                  ,         
 switch (flag) {
    case "1#"://     
        pullString(in);
        break;
    case "2#"://    
        pullBitmap(in);
        break;
public final int headerBufferSize = 2;//           

public synchronized String getBodyLength(InputStream is) throws IOException {
        byte[] b = readIs2(is, headerBufferSize);
        return new String(b, "UTF-8");
    }

public synchronized byte[] readIs2(InputStream is, int len) throws IOException {
        byte[] data = new byte[len];
        int i = 0;
        while (i < len) {
            int r = is.read(data, i, len - i);
            if (r <= 0) {
                return data;
            }
            i = i + r;
        }
        return data;
    }
ここでもう一つの方法を提供します.2バイトの配列を1バイトの配列に統合します.
//        , bytes_1     ,bytes_2   
public static synchronized byte[] mergerByte(byte[] bytes_1, byte[] bytes_2) {
        byte[] bytes = new byte[bytes_1.length + bytes_2.length];
        System.arraycopy(bytes_1, 0, bytes, 0, bytes_1.length);
        System.arraycopy(bytes_2, 0, bytes, bytes_1.length, bytes_2.length);
        return bytes;
    }
助けたら小指で支えてください.