Java Android和C tcp连接套接字
我的问题不是创建连接。我的问题是关于读取c代码中的流。java android代码通过DataOutputStream发送3个参数。C代码可以得到它们,但是在不同的套接字中。我的意思是,如果我接收到数组字节,它将在2个不同的消息中。让我们看一下代码,它应该是清晰的。 Java代码:Java Android和C tcp连接套接字,java,c#,android,sockets,tcp,Java,C#,Android,Sockets,Tcp,我的问题不是创建连接。我的问题是关于读取c代码中的流。java android代码通过DataOutputStream发送3个参数。C代码可以得到它们,但是在不同的套接字中。我的意思是,如果我接收到数组字节,它将在2个不同的消息中。让我们看一下代码,它应该是清晰的。 Java代码: private DataOutputStream out; InetAddress serverAddr = InetAddress.getByName("192.168.43.145");
private DataOutputStream out;
InetAddress serverAddr = InetAddress.getByName("192.168.43.145");
socket = new Socket(serverAddr, port);
out = new DataOutputStream(socket.getOutputStream());
// Header
out.writeByte(IDMessage); // example :IDMessageis is 1
// Data
out.writeDouble(LongX); // example :LongX is 35.4
out.writeDouble(LatY); // example :LatY is 31.5
out.flush();
和c代码读取:
// Data is the array byte received (byte[])
using (memory = new MemoryStream(data))
{
using (r = new BinaryReader(memory))
{
IDMessage = r.ReadInt32();
Long = r.ReadDouble();
Lat = r.ReadDouble();
}
}
同样:问题是消息是在2个不同的字节数组中接收的。我的意思是1个数组将是1,0,0,0,。。。。。而另一种不同按摩方式的数组将是35.4,31.5,0,0,0,0
有人知道为什么会这样吗?谢谢
编辑:顺便说一句,在第一次按摩中,我只需要发送一个参数,通过发送和读取,它工作得很好,在两次按摩中,它单独发送1个参数,在另一个插座中,两个参数加倍。
编辑:代理代码:
int k=0;
byte[] byteRecived = new byte[1024];
// Start Listeneting at the specified port
listenerForAndroid.Start();
// Now the server is running and waiting for a client connection.
sender = listenerForAndroid.AcceptSocket(); // Client Accepted
while (IsListener)
{
try
{
k = sender.Receive(byteRecived); // The server is resieved message . This line is get 2 other massages.
Header h = new Header(byteRecived);
message = MessageFactory.getMessage(h);
if (message is RequestID)
{
counterObserver ++;
SendIDMessage(sender,counterObserver);
}
message.DeSerialize(byteRecived);
message.Execute();
}
catch
{
}
TCP保证的唯一一件事是,发送的字节将以与发送它们时完全相同的顺序到达。特别地,字节可以通过完全不同的分组来传递,甚至可以通过单个组中的所有字节来传递。这取决于你积累传入的字节,直到你有足够的时间做一些有用的事情,然后重复这个过程,只要还有数据要接收。但为什么它在两个不同的消息中接收?我的评论已经解释过了。在TCP中,没有消息这样的东西,当然也没有消息这样的东西:p。TCP连接只是一个字节流,仅此而已。您认为仅通过在发送时对数据进行分组而强加的任何消息边界都不能保证在接收时保留。如果你关心边界,你必须将它们嵌入字节本身,例如分隔符、字节计数等。好的,我从前面的评论中得到了它,但我不明白我错在哪里?如何解决这个问题?我试着在一个按摩中阅读,而它却在两个按摩中发送。我知道为什么,但如何解决呢?请帮帮我,我真的为此发疯了。用这样一个模糊的代码示例提供具体的建议是不可能的。但基本策略是在获得完整消息之前不要尝试解析完整消息。例如,从流中迭代读取,直到消息中包含预期的20个字节。如果第一次读取时只得到10个字节,则返回并读取更多数据。重复此操作,直到获得预期的20个字节。