我正在尝试在Java服务器和C ++客户端之间建立连接。但是当我在客户端读取数据时,我总是有相同的奇怪特征(¬í)。我试图改变双方的编码,但没有任何作用。
这是我的Java代码:
public class Serveur
{
public static void main(String[] args) throws Exception
{
final int PORT = 13370;
try
{
ServerSocket service= new ServerSocket(PORT);
Socket connection = service.accept();
PrintWriter pw = new PrintWriter(connection.getOutputStream());
String s = Integer.toString(5);
while(true)
{
pw.print(s.getBytes("UTF-8"));
pw.flush();
pw.close();
}
connection.close();
}
}
我还尝试使用OutputStream,DataOutputStream和BufferedOutputStream。
这是C ++代码:
int main(int argc, char* argv[])
{
WSADATA WSAData;
WSAStartup(MAKEWORD(2,0), &WSAData);
SOCKET sock;
SOCKADDR_IN sin;
char buffer[512];
sin.sin_addr.s_addr = inet_addr("127.0.0.1");
sin.sin_family = AF_INET;
sin.sin_port = htons(13370);
sock = socket(AF_INET,SOCK_STREAM,0);
if(connect(sock, (SOCKADDR*)&sin, sizeof(sin)) != SOCKET_ERROR)
{
cout<<"connection"<<endl;
if(recv(sock, buffer, sizeof(buffer), 0) != SOCKET_ERROR)
{
string s = buffer;
wchar_t *pwchello = L"Hi";
wchar_t *pwc = (wchar_t *)malloc( sizeof( wchar_t ));
char *pmbhello = buffer;
int i = mbstowcs(pwc,pmbhello, MB_CUR_MAX);
cout << i << endl;
cout<<"cout : "<<pwc<<endl;
cout <<buffer<<endl;
printf("printf : %s\n", buffer);
cout << "wsagetlasterror() : "<<WSAGetLastError();
closesocket(sock);
WSACleanup();
free(m_pBuffer);
}
return 0;
}
正如您所看到的,我尝试了不同的解决方案但没有成功。
提前致谢,对不起我的英语可能不太好
答案 0 :(得分:2)
recv不会将其目标缓冲区转换为以null结尾的字符串。它在缓冲区中填充多个字节,但不附加0。
你需要做到这一点(当然是错误检查):
ssize_t bytesRead = recv(buffer, ...);
string str(buffer, bytesRead);
另外,请注意,recv不保证在一次通话中收到一次通话中发送的内容(除非您正在执行UDP)。
答案 1 :(得分:2)
您正在混合许多不同的编码转换和I / O策略。您应该尝试以下简化版本:
if(connect(sock, (SOCKADDR*)&sin, sizeof(sin)) != SOCKET_ERROR)
{
cout << "connection" << endl;
// the result of 'recv()' is either SOCKET_ERROR or
// the number of bytes received. don't though away
// the return value.
const int result = recv(sock, buffer, sizeof(buffer), 0);
if(result != SOCKET_ERROR)
{
// use length (in bytes) returned by 'recv()'
// since buffer is not null terminated.
string s(buffer,result);
// 's' is in UTF-8 no converstion to wide strings
// should be necessary.
cout << "message: '" << s << "'." << endl;
}
closesocket(sock);
}
WSACleanup();
但请注意,标准输出位于当前代码页中,通常UTF-8不是默认代码页。在Windows中将Unicode数据输出到控制台需要一些其他库调用来配置。
答案 2 :(得分:0)
你只在这里为一个wchar_t分配空间:
wchar_t *pwc = (wchar_t *)malloc( sizeof( wchar_t ));
您还将缓冲区分配给字符串s,但似乎永远不会使用s
答案 3 :(得分:0)
自昨晚以来,我一直有同样的问题。最后发现我的服务器无法识别编码(用C语言编写)。因此,我改变了我的客户
someOutputStream.writeUTF(someSillyString);
到
someOutputStream.write(someSillyString.getBytes());
这样,我甚至不需要在服务器端进行类型转换。