0

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");
} 
4

2 に答える 2

2

ObjectInputStreamJava オブジェクト用に設計されたとを使用しObjectOutputStreamています (他のものを取り込むことはできません)。代わりに、別の を使用InputStreamOutputStreamてください。この問題は発生しません。たとえば、次のように使用するのが好きBufferedReaderです(ただし、エンコーディングが等しいことを確認する必要があります)。

BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8"));
于 2013-03-08T13:27:16.630 に答える
1

ObjectInputStream入ってくるデータが特定の方法でシリアル化されることを期待しているので、あなたはそのエラーを見ています。C ++コードでは、生データを送信しているだけです。

charデータを渡すだけの場合は、それを行う必要がInputStreamありOutputStreamますが、より構造化されたデータを渡す場合は、より注意が必要です。

私はとを使ってきDataInputStreamましDataOutputStreamたがint、面白くなくcharstring問題に対処するために注文することでネットワークがあり、ポータブルにはなりません。これは、この良い例を示す前のスレッドです。

より洗練されたもの、または実稼働環境でサポートするものが必要な場合は、0MQなどの使用を検討することをお勧めします。これがJavaの例で、これがC++の例です。

于 2013-03-08T13:23:36.163 に答える