java - C++ Socket与Java客户端的连接
问题描述
我正在用 C++ 创建一个服务器应用程序,用 Java 创建一个客户端应用程序。我想在它们之间交换 32 位整数。
而且我遇到了麻烦,因为当我尝试从 Java 客户端发送一些东西时,我在 C++ 服务器中得到了一个随机答案(例如,我发送了“0”,一次我得到一个数字,另一次我有不同的数字。我读过关于 Little Endian 和 Big Endian 编码的文章,但我认为这是另一个问题,因为发送“0”会产生与 0 不同的巨大值。
Java客户端:
import java.io.DataOutputStream;
import java.net.InetAddress;
import java.net.Socket;
public class Main {
public static void main(String[] args) throws Exception{
Socket socket = new
Socket(InetAddress.getByName("127.0.0.1"),10000);
DataOutputStream out = new DataOutputStream(socket.getOutputStream());
out.writeInt(0);
}
}
C++ 服务器:
#include <netinet/in.h>
#include <string>
#include <sys/socket.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <cerrno>
#include <cstring>
#include <iostream>
using namespace std;
int main(){
int port = 10000;
string ip_addr = "127.0.0.1";
int domain = AF_INET;
int type = SOCK_STREAM;
int protocol = 0;
int stopCondition = 0xFFFFFFFF;
int socketHandle;
struct sockaddr_in address;
int clientSocketHandle;
struct sockaddr_in clientAddress;
size_t clientAddressSize;
int buffer;
if((socketHandle=socket(domain,type,protocol))<0)
cout<<strerror(errno);
address.sin_family = domain;
inet_pton(domain,ip_addr.c_str(),&address.sin_addr);
address.sin_port=htons(port);
if((bind(socketHandle,(struct sockaddr *)&address,sizeof(address)))<0)
cout<<strerror(errno);
if (listen(socketHandle, 1) < 0)
cout << strerror(errno);
if ((clientSocketHandle = accept(socketHandle, (struct sockaddr *) &clientAddress, (socklen_t *) &clientAddressSize)) < 0)
cout << strerror(errno);
do {
if (recv(clientSocketHandle, &buffer, sizeof(int), 0) > 0)
cout<<buffer<<endl;
} while (buffer != stopCondition);
if(shutdown(clientSocketHandle,SHUT_RDWR)<0)
cout<<strerror(errno);
if(shutdown(socketHandle,SHUT_RDWR)<0)
cout<<strerror(errno);
return 0;
}
我应该如何在 Java 中实现我的客户端才能与我的 C++ 服务器正常工作?
解决方案
推荐阅读
- gitlab - 将成员添加到自托管 Gitlab 帐户不起作用
- javascript - 如何滚动定义了最大高度的底部容器?
- javascript - 三元运算符和赋值:不调用同一个函数两次的更好方法
- sql - 陷入 PostgreSQL 搜索查询
- android - 表面控制:@!@! 抛出 TooManySurfacesException [SurfaceView] [Android]
- c# - 如何通过 DLL 将定制的 C++ 数据类型导入 C# 应用程序
- java - 在Android中拖放图像并将它们合并为一个位图
- c# - 应该如何实现 DbContext 和与 DB 的连接来处理负载测试?
- cluster-computing - 我需要使用 VerneMQ 创建多个集群节点,但文档没有指定如何创建集群节点
- javascript - Javascript xmlHttp GET 请求 readyState 使用 AWS 停留在 1