我在从C ++客户端到我的Java服务器的套接字上发送目录名时遇到问题。
发送普通消息,例如" hello world",效果很好,但以下情况并非如此,我无法弄清楚问题是什么:
char const * files = ffd.cFileName; // get directory name
string str(files, 0, strlen(files)); // convert pointer to string, right?
char mess[str.size()];
strcpy(mess, str.c_str()); // make char array :)
cout << "Send file: " << mess << " with strlen: " << strlen(mess) << " and sizeof: " << sizeof(mess) << endl;
int sent = 0;
if ((sent = send(connectSocket, mess, sizeof(mess), 0)) == SOCKET_ERROR)
{
closesocket(connectSocket);
WSACleanup();
connectToServer();
}
java服务器只接收如下目录名:
wam
p
Win
dow
s
Win
dow
s.o
ld
wxW
idg
ets
我无法理解我错过了什么,因为我已经尝试了所有可能的方法来执行此操作并且C ++客户端打印如下:
&#34;发送文件:带有strlen:7和sizeof:7&#34;
的窗口我不认为java服务器是问题,因为我可以完美地接收正常的字符串和消息,但无论如何这里是JAVA代码:
is = socket.getInputStream();
byteArray = new byteArray[1024];
while (true) {
c = is.read(byteArray, 0, byteArray.length);
String recv = new String(byteArray, 0, c);
System.out.println(recv);
if (recv.equals("<EOF>")){
break;
}
list.add(recv);
}
如果您要求其他内容或其他任何内容,请发表评论,我会解决。
答案 0 :(得分:3)
问题:您是通过TCP还是UDP发送?我猜TCP,如果是这种情况,你需要将套接字视为更多的流。那个流可能会被分解成一堆数据包 - 你实际上并没有控制它。我可能做的是在每个目录的字符串长度前加上前缀(例如,3foo,4barz等),从套接字读取并确定构成逻辑块或字符串的内容,然后根据它组装/打印字符串。如果你选择这条路线,你需要跟踪你每次读到的数量,直到你认为你完成为止。
答案 1 :(得分:0)
我解决了,刚刚添加了byteArray = new byte[1024];
,现在可以了:
while (true) {
byteArray = new byte[1024]; // I ADDED THIS AND NOW THE JAVA SERVER RECEIVES IT CORRECTLY!
c = is.read(byteArray, 0, byteArray.length);
recv = new String(byteArray, 0, c);
System.out.println(recv);
if (recv.equals("<EOF>")){
break;
}
list.add(recv);
}