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

标签 java c++ sockets

抱歉我的英语不好。

我成功开发了一个等待 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 %d\n", 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() error\n");
        getchar();
        exit(1);
    }

    if ( listen( hSocket, 100) == SOCKET_ERROR )
    {
        printf("listen() error\n");
        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;
}

Java 客户端:

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();
        }
    }

}

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

谢谢

最佳答案

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

关于java - 通过 C++ 和 Java 之间的 TCP 套接字发送消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22940216/

相关文章:

c++ - 使用this指针可以吗?

c++ - 在 Visual Studio 中捕获控制台应用程序的输出

c++ - 使用 BIT Manipulation 检查两个字符串中是否有公共(public)子字符串

java - 在调用子类构造函数之前,编译器是否会在子类构造函数中查找 **super** 关键字?

Java - 大字符串需要用不同的字段长度分割

java - dao、tx、服务结构 : where to place a method querying an abstract entity?

c++ - 如何将MAC地址转换为对应的IP地址?

c++ - CAsyncSocket 和线程

sockets - 未创建 uwsgi 套接字

java - 在java中年龄计算返回错误值