![](/img/trans.png)
[英]Network Communication between a java socket (server) and a C++ socket (client)
[英]Socket communication between Java and C++
我正在尝试在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;
}
如您所见,我尝试了不同的解决方案但没有成功。
在此先感谢,对不起我的英语,这可能不是很好
recv不会将其目标缓冲区转换为以null结尾的字符串。 它在缓冲区中填充多个字节,但不附加0。
你需要做到这一点(当然还有错误检查):
ssize_t bytesRead = recv(buffer, ...);
string str(buffer, bytesRead);
另外,请注意,recv不保证一次呼叫中发送的内容在一次呼叫中被接收(除非您正在执行UDP)。
您正在混合许多不同的编码转换和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数据输出到控制台需要一些其他库调用来配置。
自昨晚以来我一直有同样的问题。 最后发现我的服务器无法识别编码(用C语言编写)。 因此,我改变了我的客户
someOutputStream.writeUTF(someSillyString);
至
someOutputStream.write(someSillyString.getBytes());
这样,我甚至不需要在服务器端进行类型转换。
你只在这里为一个wchar_t分配空间:
wchar_t *pwc = (wchar_t *)malloc( sizeof( wchar_t ));
您还将缓冲区分配给字符串s,但似乎永远不会使用s
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.