【发布时间】:2019-02-25 19:52:51
【问题描述】:
我创建了一个简单的 java 客户端和一个 c++ 服务器。我正在尝试将一些数据从客户端传输到服务器。问题是,当服务器接收到数据时,它会显示一些错误符号,并且当服务器向 java 客户端返回一些响应时,我再次看到那些错误符号。你能帮我解决这个问题吗..
java 客户端
public Client(String host, int port) {
try {
String serverHostname = new String(host);
System.out.println("Connecting to host " + serverHostname + " on port " + port + ".");
Socket echoSocket = null;
PrintWriter out = null;
BufferedReader in = null;
try {
echoSocket = new Socket(serverHostname, port);
out = new PrintWriter(echoSocket.getOutputStream(), true);
in = new BufferedReader(new InputStreamReader(echoSocket.getInputStream()));
} catch (UnknownHostException e) {
System.err.println("Unknown host: " + serverHostname);
System.exit(1);
} catch (IOException e) {
System.err.println("Unable to get streams from server");
System.exit(1);
}
/** {@link UnknownHost} object used to read from console */
BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
while (true) {
System.out.print("client: ");
String userInput = stdIn.readLine();
/** Exit on 'q' char sent */
if ("q".equals(userInput)) {
break;
}
out.println(userInput);
System.out.println("server: " + in.readLine());
}
/** Closing all the resources */
out.close();
in.close();
stdIn.close();
echoSocket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
c++ 服务器
int main()
{
SOCKET ConSock;
SOCKET ListenSock;
SOCKADDR_IN address;
int addsize = sizeof(address);
long ok;
char MESSAGE[200];
WSAData WSD;
WORD DllVersion = MAKEWORD(2, 1);
ok = WSAStartup(DllVersion, &WSD);
ConSock = socket(AF_INET,SOCK_STREAM,NULL);
address.sin_addr.s_addr = inet_addr("10.64.15.3");
address.sin_family = AF_INET;
address.sin_port = htons(10102);
ListenSock = socket(AF_INET,SOCK_STREAM,NULL);
bind(ListenSock,(SOCKADDR*)&address,sizeof(address));
listen(ListenSock,SOMAXCONN);
cout<<"Waiting for connection\n";
while(1)
{
if(ConSock = accept(ListenSock,(SOCKADDR*)&address,&addsize))
{
ok = recv(ConSock,MESSAGE,sizeof(MESSAGE),NULL);
string msg;
msg = MESSAGE;
cout<<"Client says:\t"<<msg;
string reply;
cout<<"\nEnter reply:";
cin>>reply;
const char* rep = reply.c_str();
ok = send(ConSock,rep,1024,NULL);
}
}
}
这是我从客户端获得的输入图片: c++ server image
【问题讨论】:
-
“坏符号”听起来像是字符编码问题。您使用的是什么编码(两端)。
-
问题是你没有在任何地方指定长度并且没有空终止你发送的字符串
-
@PeterT 我已经在 c++ 服务器中指定了长度
-
@K.Krunk 这里没有指定长度
msg = MESSAGE; -
if(ok>0){ msg.assign(MESSAGE, ok); }似乎更合适,将ok重命名为bytesRead可能有助于清晰