繁体   English   中英

C / C ++到Java套接字错误

[英]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");
} 

您正在使用ObjectInputStreamObjectOutputStream ,它们是为Java对象设计的(它们不能接受其他任何东西)。 而是,使用另一个InputStreamOutputStream并且不应出现此问题。 例如,我喜欢使用BufferedReader (尽管必须确保编码相等),如下所示:

BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8"));

您正在看到该错误,因为ObjectInputStream希望ObjectInputStream的数据以特定的方式进行序列化。 在C ++代码中,您只是发送原始数据。

如果只想传递char数据,而不是InputStreamOutputStream应该这样做,但是如果要传递比其更多的结构化数据,则将更加棘手。

我已经为intcharstring使用了DataInputStreamDataOutputStream ,但它并不有趣,并且通过订购要处理的问题来建立网络,并且它不会移植。 这是上一个线程 ,显示了一个很好的例子。

如果您想要更复杂的东西或要在生产环境中支持的东西,那么您可能想研究使用0MQ或类似的东西。 这是Java示例 ,这是C ++示例

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM