[英]C/C++ to Java Socket Error
我正在尝试在Java服务器和C客户端之间进行套接字通信。 当我从客户端向服务器发送文本时,例如“ AAAAA”,下面出现错误。 为什么不起作用? 我可以使用C到C和Java到Java方案运行这些代码。
Waiting for connection
Connection received from 127.0.0.1
java.io.StreamCorruptedException: invalid stream header: 41414141
at java.io.ObjectInputStream.readStreamHeader(Unknown Source)
at java.io.ObjectInputStream.<init>(Unknown Source)
at Provider.run(Provider.java:22)
at Provider.main(Provider.java:67)
Exception in thread "main" java.lang.NullPointerException
at Provider.run(Provider.java:43)
at Provider.main(Provider.java:67)
Java服务器:
import java.io.*;
import java.net.*;
public class Provider{
ServerSocket providerSocket;
Socket connection = null;
ObjectOutputStream out;
ObjectInputStream in;
String message;
Provider(){}
void run()
{
try{
//1. creating a server socket
providerSocket = new ServerSocket(2004, 10);
//2. Wait for connection
System.out.println("Waiting for connection");
connection = providerSocket.accept();
System.out.println("Connection received from " + connection.getInetAddress().getHostName());
//3. get Input and Output streams
out = new ObjectOutputStream(connection.getOutputStream());
out.flush();
in = new ObjectInputStream(connection.getInputStream());
sendMessage("Connection successful");
//4. The two parts communicate via the input and output streams
do{
try{
message = (String)in.readObject();
System.out.println("client>" + message);
if (message.equals("bye"))
sendMessage("bye");
}
catch(ClassNotFoundException classnot){
System.err.println("Data received in unknown format");
}
}while(!message.equals("bye"));
}
catch(IOException ioException){
ioException.printStackTrace();
}
finally{
//4: Closing connection
try{
in.close();
out.close();
providerSocket.close();
}
catch(IOException ioException){
ioException.printStackTrace();
}
}
}
void sendMessage(String msg)
{
try{
out.writeObject(msg);
out.flush();
System.out.println("server>" + msg);
}
catch(IOException ioException){
ioException.printStackTrace();
}
}
public static void main(String args[])
{
Providerserver = new Provider();
while(true){
server.run();
}
}
}
C ++客户端:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <winsock2.h>
#define PORTNO 2004
void ExitSys();
int main(void)
{
WSADATA wsd;
int result;
SOCKET clientSocket;
struct sockaddr_in sinServer;
struct hostent *host;
char serverHost[] = "localhost";
if ((result = WSAStartup(MAKEWORD(2, 2), &wsd)) != 0)
ExitSys();
if ((clientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET)
ExitSys();
sinServer.sin_family = AF_INET;
sinServer.sin_port = htons(PORTNO);
sinServer.sin_addr.s_addr = inet_addr(serverHost);
if (sinServer.sin_addr.s_addr == INADDR_NONE) {
host = gethostbyname(serverHost);
if (host == NULL)
ExitSys();
memcpy(&sinServer.sin_addr.s_addr, host->h_addr_list[0], host->h_length);
}
if (connect(clientSocket, (struct sockaddr *) &sinServer, sizeof(sinServer)) == SOCKET_ERROR)
ExitSys();
printf("connected...\n");
for (;;) {
char buf[512];
printf("Text:");
gets(buf);
if (!strcmp(buf, "quit"))
break;
if (send(clientSocket, buf, strlen(buf), 0) == SOCKET_ERROR)
ExitSys();
}
shutdown(clientSocket, SD_BOTH);
closesocket(clientSocket);
WSACleanup();
return 0;
}
void ExitSys()
{
printf("extited");
}
您正在使用ObjectInputStream
和ObjectOutputStream
,它们是为Java对象设计的(它们不能接受其他任何东西)。 而是,使用另一个InputStream
, OutputStream
并且不应出现此问题。 例如,我喜欢使用BufferedReader
(尽管必须确保编码相等),如下所示:
BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8"));
您正在看到该错误,因为ObjectInputStream
希望ObjectInputStream
的数据以特定的方式进行序列化。 在C ++代码中,您只是发送原始数据。
如果只想传递char数据,而不是InputStream
和OutputStream
应该这样做,但是如果要传递比其更多的结构化数据,则将更加棘手。
我已经为int
, char
和string
使用了DataInputStream
和DataOutputStream
,但它并不有趣,并且通过订购要处理的问题来建立网络,并且它不会移植。 这是上一个线程 ,显示了一个很好的例子。
如果您想要更复杂的东西或要在生产环境中支持的东西,那么您可能想研究使用0MQ或类似的东西。 这是Java示例 ,这是C ++示例 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.