Socket通讯,服务器端接收到Java发来的数据后诸塞

baixc 2005-01-19 11:51:18
我用C++作的服务器,Java做的客户端,Java发送一个字符串后,服务器端收到数据后就诸塞了(Java端正常),
C++中是用下面的代码接收数据的
void CMsg::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
ar << (WORD)m_bClose;
ar << m_strText;
}
else
{
WORD wd;
ar >> wd;
m_bClose = (BOOL)wd;
// 程序在此诸塞,m_strText 少前三个字符
ar >> m_strText; // 在此诸塞(当收到数据时)
}
m_msgList.Serialize(ar);
}
CMsg类为:
class CMsg : public CObject
{
......
};

而且我在C++端收到的字符串不对,比如我发送: "TestMsg", C++端收到的是 "tMsg",少了三个字符,而求程序诸塞了。(我感觉是Java少发了一些特殊字符串)
请指点我应该如何解决这个问题,谢谢。

Java版问题地址:
http://community.csdn.net/Expert/topic/3732/3732825.xml?temp=.4753839
...全文
215 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
baixc 2005-01-22
  • 打赏
  • 举报
回复
谢谢各位,为题解决了。
原因是我在服务器端使用了MFC中的CArchive类来接受数据,而CArchive又它自己的接收格式,直接发送的字符串是不符合它的接收格式的,在研究了CArchive的接收格式后,我更改了Java端的发送格式,问题就解决了,下面是我的Java发送代码:

public synchronized boolean SendMsg(String str )
{
if (m_Socket == null || m_Writer == null)
return false;

byte b0 = 0;
try
{
m_Writer.write(GetStringLength(str.length()+1));
m_Writer.write(str.getBytes());
m_Writer.write(b0);

m_Writer.write(TypeConvert.short2byte(0));
}
catch( IOException ex )
{
System.out.println(ex.getMessage());
return false;
}
System.out.println("Send: " + str );
return true;
}
// 得到字符串长度字符表示
public byte[] GetStringLength( int nLength )
{
if( nLength < 255 )
{
byte b[] = new byte[1];
b[0] = (byte)nLength;
return b;
}
else if( nLength < 0xfffe )
{
byte b[] = new byte[3];
b[0] = (byte)0xff;
b[1] = (byte)nLength;
b[2] = (byte)(nLength>>8);
return b;
}
else if( nLength < 0xffffffff )
{
byte b[] = new byte[7];
b[0] = (byte)0xff;
b[1] = (byte)0xff;
b[2] = (byte)0xff;
b[3] = (byte)nLength;
b[4] = (byte)(nLength>>8);
b[5] = (byte)(nLength>>16);
b[6] = (byte)(nLength>>24);
return b;
}
else
{
byte b[] = new byte[15];
for( int i = 0; i < 7; i++ )
{
b[i] = (byte)0xff;
}
b[7] = (byte)nLength;
b[8] = (byte)(nLength>>8);
b[9] = (byte)(nLength>>16);
b[10] = (byte)(nLength>>24);
b[11] = (byte)(nLength>>32);
b[12] = (byte)(nLength>>40);
b[13] = (byte)(nLength>>48);
b[14] = (byte)(nLength>>56);
return b;
}
}
public static byte[] short2byte(int n) {
byte[] b = new byte[2];
b[0]=(byte)(n>>8);
b[1]=(byte)n;
return b;
}

gdy119 2005-01-21
  • 打赏
  • 举报
回复
CSocket+CArchive+CSocketFile
这个结构与CArchive类接收字符串的结束标志是无关的,
不信你可以一直跟到底看一下,其实你用CArchive类接收字符串
的时候序列化的过程中实际上是序列化CSocketFile文件对象中的内容,但CSocketFile和CSocket
中recv()函数相关联,收到一部分,就序列化一部分,但recv()返回0的时候,序列化结束,所以
服务器象你那样序列化是没问题的,关键是client JAVA 写的部分
baixc 2005-01-21
  • 打赏
  • 举报
回复
我找到问题了,是由于我用CArchive类接收,Java发送过来的数据包没有CArchive定义的结束符,我在Java端发送了一个‘\0',字符串虽然结束了,但是CArchive没有认为结束,谁能告诉我CArchive类接收字符串的结束标志是什么?
sandrowjw 2005-01-20
  • 打赏
  • 举报
回复
数据格式不对吧,是不是后面少了回车什么的?
john123don 2005-01-20
  • 打赏
  • 举报
回复
UP
xuzheng318 2005-01-20
  • 打赏
  • 举报
回复
帮楼主顶!
xiaohuidong 2005-01-20
  • 打赏
  • 举报
回复
通过网络监控看看发过来的数据流是否正确
开始远离编程 2005-01-20
  • 打赏
  • 举报
回复
强烈建议一个字节一个字节的传输,我前不久就有过惨痛的教训啊!
gdy119 2005-01-20
  • 打赏
  • 举报
回复
我看你是字节类型转换问题,你阻塞的地方,肯定是数据没
接受完毕,而你又接着序列化,肯定出错了,JAVA中和C++中
WORD的字节大小都是两个字节吗?以我的经验跨平台最好用
BYTE,一个字节一个字节的传输;
kingzai 2005-01-20
  • 打赏
  • 举报
回复
你可能是使用了CSocket+CArchive+CSocketFile吧,这个本来就是阻塞得类,你需要使用异步得socket类,比如CAsyncSocket
baixc 2005-01-20
  • 打赏
  • 举报
回复
我用的是CSocket+CArchive+CSocketFile方法接收数据的,但是C++段程序已经写好了,不能在修改了,我只能在Java端改发送程序的部分,但是我不知道到用CSocket+CArchive+CSocketFile方法收到的数据报有什么特别的结束字符吗?我可以在Java端发送这些字符。
chqu18 2005-01-20
  • 打赏
  • 举报
回复
另外用c++再做个简单的客户端给你的服务端发送数据看看对不对
看如果没有问题了再找看是其他的什么原因
sharkhuang 2005-01-20
  • 打赏
  • 举报
回复
socket通信是不会少发送的。你抓包看看?

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧