gpt4 book ai didi

java - 从 C 客户端向 Java 服务器发送一个整数

转载 作者:太空宇宙 更新时间:2023-11-04 08:57:13 25 4
gpt4 key购买 nike

我使用此代码将一个整数从我的 Java 客户端发送到我的 Java 服务器

int  n = rand.nextInt(50) + 1;
DataOutputStream dos = new DataOutputStream(_socket.getOutputStream());
dos.writeInt(n);

然后我用这段代码在服务器上读取了它

DataInputStream din = new DataInputStream(socket.getInputStream());
int ClientNumber= din.readInt();
System.out.println(ClientNumber);


ClientNumber++;
DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
dos.writeInt(ClientNumber);

String randomString= getRandomValue(10,20);
dos.writeUTF(randomString);

它工作得很好,但现在我想写一个 C 客户端我试过这段代码

  #include <stdio.h>
#include <errno.h>
#include <signal.h>

#include <netdb.h>
#include <netinet/in.h>
#include <sys/socket.h>

#define SERVEURNAME "localhost" // adresse IP de mon serveur

int to_server_socket = -1;

void main ( void )
{

char *server_name = SERVEURNAME;
struct sockaddr_in serverSockAddr;
struct hostent *serverHostEnt;
long hostAddr;
long status;
char buffer[512];

bzero(&serverSockAddr,sizeof(serverSockAddr));
hostAddr = inet_addr(SERVEURNAME);
if ( (long)hostAddr != (long)-1)
bcopy(&hostAddr,&serverSockAddr.sin_addr,sizeof(hostAddr));
else
{
serverHostEnt = gethostbyname(SERVEURNAME);
if (serverHostEnt == NULL)
{
printf("gethost rate\n");
exit(0);
}
bcopy(serverHostEnt->h_addr,&serverSockAddr.sin_addr,serverHostEnt->h_length);
}
serverSockAddr.sin_port = htons(8071);
serverSockAddr.sin_family = AF_INET;

/* creation de la socket */
if ( (to_server_socket = socket(AF_INET,SOCK_STREAM,0)) < 0)
{
printf("creation socket client ratee\n");
exit(0);
}
/* requete de connexion */
if(connect( to_server_socket,
(struct sockaddr *)&serverSockAddr,
sizeof(serverSockAddr)) < 0 )
{
printf("demande de connection ratee\n");
exit(0);
}
/* envoie de donne et reception */
int value = htons( 4 );
write( to_server_socket, &value, sizeof( value ) );

printf(buffer);


}

但它不起作用。我使用 Eclipse 来编译 java 代码并为 C 代码(客户端)运行服务器和 xcode,但我认为问题不在那里

编辑:我在服务器上遇到错误

java.net.SocketException: Broken pipe at java.net.SocketOutputStream.socketWrite0(Native Method) at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92) at java.net.SocketOutputStream.write(SocketOutputStream.java:115) at java.io.DataOutputStream.writeInt(DataOutputStream.java:182) at ServiceRequest.run(ServiceRequest.java:36) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:439) at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)

我认为这是因为我服务器等待一个整数但它不是......?

最佳答案

在这句话中有两件事让我印象深刻......

write(to_server_socket,"4",4);

1) "4"不是一个整数,它是一个以 null 结尾的字符串(嗯,好吧,它是一个整数,但我认为这不是你“想要”的)

2) 您正在以主机字节顺序发送值,这可能与网络字节顺序相同也可能不同

int value = htons( 4 );
write( to_server_socket, &value, sizeof( value ) );

然而,除此之外,来自 java socketWrite() 的“管道损坏”错误往往表明您的发送端(C 应用程序)已关闭套接字,而您的 java 端仍在试图写信给它。

你的 C 客户端代码正在打开套接字,写入它然后立即打印一个你从未填充任何东西的缓冲区并退出程序。一旦程序退出,您为它创建的套接字就会关闭,因此您的 Java 服务器中会出现“管道损坏”错误。您需要从服务器读取回复...

int value = htonl( 4 );
int reply = 0;

if( send( to_server_socket, &value, sizeof( value ), 0 ) != sizeof( value ) )
{
printf( "socket write failed: %s", strerror( errno ) );
exit( -1 );
}

if( recv( to_server_socket, &reply, sizeof( reply ), MSG_WAITALL ) != sizeof( reply ) )
{
printf( "socket read failed: %s", streror( errno ) );
exit( -1 )
}

printf( "got reply: %d\n", ntohl( reply ) );

在单独的注释中...您表示您在服务器上收到 262144...是在我建议的更改之前还是之后? 262144 是 0x00040000——所以……你确实得到了 4,只是不在你期望的位置。所以,你使用的是 32 位整数(我应该意识到这一点),这意味着你想使用 htonl()ntohl() 而不是 htons ()ntohs() 是短整数转换。

关于java - 从 C 客户端向 Java 服务器发送一个整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16362303/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com