下面是C#编的服务端的发送和接收消息的代码:
#region 02负责监听客户端发送来的消息
void RecMsg()
{
while (isRec)
{
try
{
byte[] arrMsg = new byte[1024 * 1024 * 2];
//接收 对应 客户端发来的消息
int length = sokMsg.Receive(arrMsg);
//将接收到的消息数组里真实消息转成字符串
string strMsg = System.Text.Encoding.UTF8.GetString(arrMsg, 1, length);
//string strMsg = System.Text.Encoding.UTF8.GetString(arrMsg);
//string strMsg = null;
//strMsg += Encoding.UTF8.GetString(arrMsg, 0, length);
//if (strMsg.IndexOf("<EOF>") > -1) { break; } //通过委托 显示消息到 窗体的文本框
dgShowMsg(strMsg);
}
catch (Exception ex)
{
isRec = false;
//从主窗体中 移除 下拉框中对应的客户端选择项,同时 移除 集合中对应的 ConnectionClient对象
dgRemoveConnection(sokMsg.RemoteEndPoint.ToString());
}
}
}
#endregion #region 03向客户端发送消息
/// <summary>
/// 向客户端发送消息
/// </summary>
/// <param name="strMsg"></param>
public void Send(string strMsg)
{
byte[] arrMsg = System.Text.Encoding.UTF8.GetBytes(strMsg);
// byte[] arrMsg = System.Text.Encoding.ASCII.GetBytes(strMsg);
byte[] arrMsgFinal = new byte[arrMsg.Length+1]; arrMsgFinal[0] = 0;//设置 数据标识位等于0,代表 发送的是 文字
arrMsg.CopyTo(arrMsgFinal, 1);
//arrMsg.CopyTo(arrMsgFinal,0);
sokMsg.Send(arrMsgFinal);
//sokMsg.Send(arrMsg);
}
#endregion下面是QT编的客户端的发送和接收消息的代码:
void Widget::readMessage(){ QDataStream in(tcpSocket);
if(blockSize==0) //如果是刚开始接收数据 { //判断接收的数据是否有两字节,也就是文件的大小信息 //如果有则保存到blockSize变量中,没有则返回,继续接收数据 if(tcpSocket->bytesAvailable() < (int)sizeof(quint16))
return; in >> blockSize;
} if(tcpSocket->bytesAvailable() < blockSize)
return; //如果没有得到全部的数据,则返回,继续接收数据in>>message; ui->messageLabel->setText(message);
printf("message==%s", message.toAscii().data()); //显示接收到的数据}
void Widget::sendMessage(){
QByteArray block;
QDataStream out(&block, QIODevice::WriteOnly);
sendString = tr("hello server!");
out << (quint16)0;
out << sendString;
out.device()->seek(0);
out << (quint16)(block.size() - sizeof(quint16));
tcpSocket->write(block);
//QTcpSocket *clientConnection = tcpSocket;
//我们获取已经建立的连接的子套接字
ui->statusLabel->setText("send message successful!!!");}
服务端发送数据正常,但是客户度发送数据时,我断点调试服务器发现他也接的到的那个strMsg=“\0\0\0\0\0->\0h\0e\0l\0l\0o\0 \0s\0e\0r\0v\0e\0r\0!” 翻译成16进制就是:00 1E 00 00 00 1A 00 68 65 00 6C 00 6F 00 20 00 73 00 65 00 72 00 76 00 65 72 00 21 00 00 00
这样的话,我服务端就不能正常显示接收到的数据了嘛,遇到\0后面就都没了。经过我分析觉得是编码传输和解码接收的问题,那个QDataStream不是很懂,也是写流的,C#用的是steam。两者的操作符就不同。想最简单的办法就是把strMsg里的数据进行转换成68 65 6C 6F 20 73 65 72 76 65 72 21 00就好了,求教大师,本人整了好久了还是依然不行。最好有高手的话帮我把两个平台的编码转换和接收统一了,谢谢有耐心看到这里的热心人!
#region 02负责监听客户端发送来的消息
void RecMsg()
{
while (isRec)
{
try
{
byte[] arrMsg = new byte[1024 * 1024 * 2];
//接收 对应 客户端发来的消息
int length = sokMsg.Receive(arrMsg);
//将接收到的消息数组里真实消息转成字符串
string strMsg = System.Text.Encoding.UTF8.GetString(arrMsg, 1, length);
//string strMsg = System.Text.Encoding.UTF8.GetString(arrMsg);
//string strMsg = null;
//strMsg += Encoding.UTF8.GetString(arrMsg, 0, length);
//if (strMsg.IndexOf("<EOF>") > -1) { break; } //通过委托 显示消息到 窗体的文本框
dgShowMsg(strMsg);
}
catch (Exception ex)
{
isRec = false;
//从主窗体中 移除 下拉框中对应的客户端选择项,同时 移除 集合中对应的 ConnectionClient对象
dgRemoveConnection(sokMsg.RemoteEndPoint.ToString());
}
}
}
#endregion #region 03向客户端发送消息
/// <summary>
/// 向客户端发送消息
/// </summary>
/// <param name="strMsg"></param>
public void Send(string strMsg)
{
byte[] arrMsg = System.Text.Encoding.UTF8.GetBytes(strMsg);
// byte[] arrMsg = System.Text.Encoding.ASCII.GetBytes(strMsg);
byte[] arrMsgFinal = new byte[arrMsg.Length+1]; arrMsgFinal[0] = 0;//设置 数据标识位等于0,代表 发送的是 文字
arrMsg.CopyTo(arrMsgFinal, 1);
//arrMsg.CopyTo(arrMsgFinal,0);
sokMsg.Send(arrMsgFinal);
//sokMsg.Send(arrMsg);
}
#endregion下面是QT编的客户端的发送和接收消息的代码:
void Widget::readMessage(){ QDataStream in(tcpSocket);
if(blockSize==0) //如果是刚开始接收数据 { //判断接收的数据是否有两字节,也就是文件的大小信息 //如果有则保存到blockSize变量中,没有则返回,继续接收数据 if(tcpSocket->bytesAvailable() < (int)sizeof(quint16))
return; in >> blockSize;
} if(tcpSocket->bytesAvailable() < blockSize)
return; //如果没有得到全部的数据,则返回,继续接收数据in>>message; ui->messageLabel->setText(message);
printf("message==%s", message.toAscii().data()); //显示接收到的数据}
void Widget::sendMessage(){
QByteArray block;
QDataStream out(&block, QIODevice::WriteOnly);
sendString = tr("hello server!");
out << (quint16)0;
out << sendString;
out.device()->seek(0);
out << (quint16)(block.size() - sizeof(quint16));
tcpSocket->write(block);
//QTcpSocket *clientConnection = tcpSocket;
//我们获取已经建立的连接的子套接字
ui->statusLabel->setText("send message successful!!!");}
服务端发送数据正常,但是客户度发送数据时,我断点调试服务器发现他也接的到的那个strMsg=“\0\0\0\0\0->\0h\0e\0l\0l\0o\0 \0s\0e\0r\0v\0e\0r\0!” 翻译成16进制就是:00 1E 00 00 00 1A 00 68 65 00 6C 00 6F 00 20 00 73 00 65 00 72 00 76 00 65 72 00 21 00 00 00
这样的话,我服务端就不能正常显示接收到的数据了嘛,遇到\0后面就都没了。经过我分析觉得是编码传输和解码接收的问题,那个QDataStream不是很懂,也是写流的,C#用的是steam。两者的操作符就不同。想最简单的办法就是把strMsg里的数据进行转换成68 65 6C 6F 20 73 65 72 76 65 72 21 00就好了,求教大师,本人整了好久了还是依然不行。最好有高手的话帮我把两个平台的编码转换和接收统一了,谢谢有耐心看到这里的热心人!
//string strMsg = System.Text.Encoding.UTF8.GetString(arrMsg);
//string strMsg = null;
//strMsg += Encoding.UTF8.GetString(arrMsg, 0, length);
//if (strMsg.IndexOf("<EOF>") > -1) { break; }
你这里不要用字符串转换的办法了。
得到byte的数组后,使用for循环,每个一个数据取一个就好了。
然后组成你要的编码就行了。
另外utf8是3个字节编码的,你的这个数据应该是2个字节编码的,估计不是utf8.
你用Default试试吧System.Text.Encoding.Default.GetString(arrMsg);