Java里头字符串默认编码是Unicode,你们用C++写的服务器端解析字符串的时候也是以Unicode格式吗?
解决方案 »
- jbpm4.4 错误
- lucene 海量数据(亿级数据)磁盘空间不足,优化!求高人
- ssh 实现图片的存储
- 大家帮忙~!在jsp页面显示 struts2 session 的问题 在线等~!
- 先安装了JDK1.5和Tomcat5.5,然后又安装了JbuilderX,tomcat就不能启动了
- 想看看有关工作流的opensource,给介绍个
- weblogic8.1+struts中文件上传的奇怪问题!
- Eclipse 如何将lomboz插件挂上?可不可以请大家教我一下,谢谢!
- 大家知不知道weblogic6.1同oracle数据连接时出现这种情况的答案
- @Scheduled 参数问题
- 看,这是什么?!
- ---Hibernate的局限性:如果我的表结构需要动态改变怎么办?---
void CMsg::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
ar << (WORD)m_bClose;
ar << m_strText;
}
else
{
WORD wd;
ar >> wd;
m_bClose = (BOOL)wd;
ar >> m_strText; // 在此诸塞(当收到数据时)
}
m_msgList.Serialize(ar);
}m_strText 为CString 类型通讯协议自然没这么简单,我现在只要求服务器能收到正确的数据,不要诸塞在那
这样试试看:
m_Writer = new PrintWriter(
new OutputStreamWriter(m_Socket.getOutputStream(), "ISO-8859-1"), true);
C++端已经不能在做任何更改了
唉,今天发现一个大问题,不知道问题出在哪里(跟你的问题无关),上来看看有没有解决办法!!
另外,不要使用PrintWriter了,就使用更原始的OutputStreamWriter,直接发送Bytes。不过没有C/C++的socket编程基础的话,直接玩Java的socket编程,是会遇到一些困难,好多不懂的地方,好多一开始感觉玩不转的地方,慢慢来吧。
把它先弄清楚吧,,有一点尤其要清醒:TCP层提供是面向连接的可靠数据流服务。。
比如那边C++程序等待接收回车换行字符,这边却就是不发。。那不阻塞才怪。。
暑假时做过类似的东西,要通过socket让两个程序通信,要先知道字节顺序
目前的字节顺序有两类:BIG_ENGIAN和LITTLE_ENDIAN
c端是用的是LITTLE_ENDIAN,而java使用的是LITTLE_ENDIAN,
所以你可以在c端做一个转换,或者java端做一个转huan比如:我要在c这边把int转换为big-endian放入流中
注:小端序就是内存的低地址存放的是数据的高字节,
可以这么做
static bool int2str(int n, char *buf)
{
buf[0] = char((n & 0xff000000) >> 24buf[1] = char((n & 0x00ff0000) >> 16);
buf[2] = char((n & 0x0000ff00) >> 8);
buf[3] = char((n & 0x000000ff));return true;
}同样你要是想在java端转(把big-endian转为little-endian)
private void insertIntToByteArray(byte[] data,int i,int offset){
data[offset]==(byte)(i>>0);
data[offset+1]=(byte)(i>>8)
data[offset+2]=(byte)(i>>16)
data[offset+3]=(byte)(i>>24)
}
这样!
}
我发送的东西全是字符串,没有任何数据,而且我也试过用byte[]来发送,但是C++端一收到就诸塞,我跟踪后发现C++端收到的字符串少了前三个字符,后面能够正常结束,C++端收到数据的函数如下: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);
}我感觉会不会是由于C++端使用的是由 CObject 类派生的 CMsg 类接收数据的问题。我的CMsg类头文件为:
class CMsg : public CObject
{
protected:
DECLARE_DYNCREATE(CMsg)
public:
CMsg();// Attributes
public:
CString m_strText;
BOOL m_bClose;
CStringList m_msgList;
......};
同时把几种未知因素混在一起了,欲速而不达。在这种情况下,楼主可以在C++先用基本的SOCKET API接收,确定在通讯上没有问题,
再进一步做下去
和java之间肯定也有编码转换问题
我同意楼上的建议,你一点一点地确定问题出在什么地方
原因是我在服务器端使用了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;
}