2012-04-24 2 views
1

Я новичок в Sockets, Работа с проектом с хостом C# и Java/Android Client.«IOException: недопустимый заголовок потока: 00010000» При получении данных с C# Host на Java Client по TCP

Мне нужно постоянно получать данные от хоста к клиенту через 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.

Заранее спасибо :)

ответ

0

К сожалению бинарной сериализации не совместимы между C# (.NET) и Java. Я на самом деле помню, как пытался повторить то же самое, что и ты, и потерпел неудачу.

Я боюсь, вам нужно будет найти альтернативный метод кодирования, например, пользовательскую XML-сериализацию JSON (которая фактически позволяет веб-службам работать на разных платформах).

+0

спасибо :) есть ли способ использовать стратегию для общения? – Naeem

+0

@Naeem: Вы можете попробовать использовать XML в качестве формата сериализации. Взгляните на структуру Wox, которая, кажется, совместима между java и .net: http://woxserializer.sourceforge.net/ – Tudor

Смежные вопросы