通过 TCP 套接字在 C++ 和 Java 之间发送消息

Sending a message via TCP Socket between C++ and Java

本文关键字:之间 消息 Java TCP 套接字 C++ 通过      更新时间:2023-10-16

对不起,我的英语很差。

我成功地开发了一个等待Java套接字连接的C++服务器套接字。我首先启动我的C++服务器,写"等待连接...",然后启动我的Java套接字,我可以在我的C++服务器上看到"客户端已连接!"所以它可以工作。但是我想从C++服务器向 Java 客户端发送一条消息。我从服务器收到任何消息。这是我C++服务器和 Java 客户端代码:

C++服务器:

#include "stdafx.h"
#ifdef _WIN32
#include <Winsock2.h>
#define SOCKET_ERRNO    WSAGetLastError()
#define ERRNO       GetLastError()
#else
#define SOCKET_ERRNO    errno
#define ERRNO       errno
#define closesocket close
#endif
#include <io.h>
#include <fcntl.h>
#include <stdio.h>
#include <conio.h>
#include <errno.h>
int _tmain(int argc, _TCHAR* argv[])
{
    SOCKET hSocket, hAccept;
    struct sockaddr_in addr;
    int len = sizeof(addr);    
    int nPort = 2009;
    // Initialize winsock
    WSADATA stack_info ;
    WSAStartup(MAKEWORD(2,0), &stack_info) ;
    //Create socket
    hSocket = socket( PF_INET, SOCK_STREAM, 0 );
    if( hSocket == INVALID_SOCKET )
    {
        printf( "socket() error %dn", SOCKET_ERRNO );
        getchar();
        exit(1);
    }
    //Listen to the socket
    addr.sin_family = AF_INET ;
    addr.sin_addr.s_addr = htonl (INADDR_ANY);
    addr.sin_port = htons ((unsigned short)nPort );
    if ( bind( hSocket, (struct sockaddr *)&addr, sizeof(addr)) == SOCKET_ERROR )
    {
        printf("bind() errorn");
        getchar();
        exit(1);
    }
    if ( listen( hSocket, 100) == SOCKET_ERROR )
    {
        printf("listen() errorn");
        getchar();
        exit(1);
    }
    printf("Waiting for a connection...");
    //Waiting for a client to connect
    hAccept = accept(hSocket, NULL, NULL);
    printf("nClient connected!");
    //Sending a message
    char Buffer[1024];
    sprintf_s( Buffer, "hello" );
    send( hAccept, Buffer, 8, 0 );
    printf("Sent!");
    getchar();
    return 0;
}

爪哇客户端:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;

public class Client {
    public static void main(String[] args) {
        Socket socket;
        BufferedReader in;
        PrintWriter out;
        try {
            socket = new Socket(InetAddress.getLocalHost(),2009);
            in = new BufferedReader (new InputStreamReader (socket.getInputStream()));
            String message_distant = in.readLine();
            System.out.println(message_distant);
            socket.close();
        }catch (UnknownHostException e) {
            e.printStackTrace();
        }catch (IOException e) {
            e.printStackTrace();
        }
    }
}

有谁知道为什么我没有看到从服务器发送到 Java 客户端的消息C++?

谢谢

Java 客户端使用 in.readLine() 从套接字读取数据;它基本上读取数据,直到找到行分隔符或回车符。我对C++不太熟悉,但似乎您的C++服务器只发送"hello"而不使用行分隔符。这使得 Java 客户端永远等待。要解决此问题,您可以从C++服务器发送"hello"或"hello\r"。