Я новичок в 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.
Заранее спасибо :)
спасибо :) есть ли способ использовать стратегию для общения? – Naeem
@Naeem: Вы можете попробовать использовать XML в качестве формата сериализации. Взгляните на структуру Wox, которая, кажется, совместима между java и .net: http://woxserializer.sourceforge.net/ – Tudor