1

私はソケットを初めて使用し、C# ホストと Java/Android クライアントを使用するプロジェクトに取り組んでいます。

TCP ソケット経由でホストからクライアントに継続的にデータを取得する必要があります。DataInputStream または ObjectInputStream でデータをフェッチしているときに、同じ問題「無効なストリーム ヘッダー」に直面しています。

using System;
using System.Collections.Generic;
using System.Text;
using System.Net.Sockets;
using System.Net;
using System.Runtime.Serialization.Formatters.Binary;
using PacketAndroid;
namespace SampleForAndroid
{
  public class TCPListener
  {
      public  Socket SocketForClient;     
      public void StartListening()
      {
       try
       {
             TcpListener Listener = new TcpListener(5155);
             Listener.Start();
             SocketForClient = Listener.AcceptSocket();
             if (SocketForClient != null && SocketForClient.Connected)
             {
                 int i = 1;
                 while (SocketForClient.Connected && i<2)
                 {
                     NetworkStream NS = new NetworkStream(SocketForClient);
                     BinaryFormatter BF = new BinaryFormatter();
                     TCPPayLoad PayLoad = new TCPPayLoad();
                     Console.WriteLine(PayLoad.ToString());
                     NS.Flush();
                     BF.Serialize(NS, PayLoad);
                     i = 2;
             }
         }
     }
     catch (SocketException EX)
     {

     }
 }


   static void Main(string[] args)
    {

        TCPListener List = new TCPListener();
        System.Threading.Thread TcpThread=new System.Threading.Thread(new              System.Threading.ThreadStart(List.StartListening));
       TcpThread.Start();
       Console.ReadLine();
       }
     }
}

そしてJavaクライアント:

import java.io.BufferedInputStream;
import java.io.DataInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;

public class ObjectReceiver {
    public static void main(String argv[]) {
        fun_0();
    }

    @SuppressWarnings("unused")
    private static void fun_0() {
        ObjectInputStream ois = null;
        Socket socket = null;
        try {
            // open a socket connection

            socket = new Socket("127.0.0.1", 5155);

            System.out.println("Connecting...");

            ObjectInputStream din = new ObjectInputStream(socket.getInputStream());

            int size = din.readInt();
            System.out.println(din.read());

            byte[] bytes = new byte[size];
            int readBytes = din.read(bytes);
            System.out.println(readBytes);

            Object object = din.readObject();
            TcpPayload payload = (TcpPayload) object;
            System.out.println(payload.toString());

        } catch (IOException e) {
            System.out.println("IOException:" + e.getMessage());
        } catch (Exception e) {
            System.out.println("Exception:" + e.getMessage());
        }
    }
}

オブジェクトTcpPayload は、プリエンプティブ データ型と文字列のみを持つクラスのインスタンスです。Java と C# の両方に、シリアライゼーションが実装された同じオブジェクトがあります。

解決策について教えてください。クライアント側でコードを調整する唯一のオプションがあります。ホストはすでに iOS クライアントで正常に動作しています。

前もって感謝します :)

4

1 に答える 1

0

残念ながら、バイナリ シリアル化は C# (.NET) と Java の間で互換性がありません。私は実際にあなたと同じことをしばらく前に試みて失敗したことを覚えています.

おそらくカスタム XML や JSON シリアライゼーションなど、別のエンコーディング方法を見つける必要があると思います (実際、Web サービスをプラットフォーム間で動作させることができます)。

于 2012-04-24T17:18:14.363 に答える