gpt4 book ai didi

java - C服务器和java客户端

转载 作者:行者123 更新时间:2023-11-30 06:56:08 25 4
gpt4 key购买 nike

我创建了一个 C 服务器和一个 Java 客户端。我正在通过客户端发送类似 ls 的命令,服务器应该执行它。然而在c服务器中读取仍然在等待输入。如何解决这个问题。

Java 客户端

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;


class HelloWorld
{
public static void main(String... abc) {

try
{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.println("Enter ip and port : ");
String ip ;
String p;
String ss;
int port;

ip = br.readLine();
p = br.readLine();
port = Integer.parseInt(p);
Socket s = new Socket(ip,port);
OutputStream os = s.getOutputStream();
PrintWriter pw = new PrintWriter(os);

Scanner in = new Scanner(System.in);
ss = in.nextLine();
pw.print(s);
pw.flush();
pw.close();
}
catch(Exception e){
System.out.println("ERROR!!!");}
}
}

这里是c服务器。

#include"Headers.h"

void comm(char * s_port)
{
int sockfd, newsockfd, portno;
socklen_t clilen;
char buffer[MAXBUFFER];
char newbuffer[MAXBUFFER];
char var[MAXBUFFER] = " > file.txt";
int n;

struct sockaddr_in serv_addr, cli_addr;

FILE *fp = NULL;

sockfd = socket(AF_INET, SOCK_STREAM, 0);

if (sockfd < 0)
error("ERROR opening socket");

bzero((char *) &serv_addr, sizeof(serv_addr));
portno = atoi(s_port);

serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY;
serv_addr.sin_port = htons(portno);

if (bind(sockfd, (struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0)
error("ERROR on binding");

listen(sockfd,5);
clilen = sizeof(cli_addr);
newsockfd = accept(sockfd,(struct sockaddr *) &cli_addr,&clilen);

if (newsockfd < 0)
error("ERROR on accept");
while (1)
{
bzero(buffer,1024);
n = read(newsockfd,buffer,1024);

if (strcmp(buffer , "exit\n") == 0)
break;

if (n < 0) error("ERROR reading from socket");
printf("Here is the message: %s\n",buffer);
strcpy(newbuffer,"");
if (buffer[strlen(buffer) - 1] == '\n')
buffer[strlen(buffer) - 1] = '\0';

strcat(newbuffer, buffer);
strcat(newbuffer, var);
printf("%s",newbuffer);
system(newbuffer);
break;

if (n < 0) error("writing to socket");
}
close(newsockfd);
close(sockfd);
}

最佳答案

    n = read(newsockfd,buffer,1024);

if (strcmp(buffer , "exit\n") == 0)
break;

您忘记实现协议(protocol)。您不能只从连接中读取任意一堆字节,然后将其视为一条消息。 TCP 没有消息的概念。如果您想发送和接收消息,您必须定义“消息”的含义,并编写代码来发送和接收实现该定义的代码。

您的代码可能还有其他问题,但这个缺陷是如此严重和根本,您确实需要先修复它。

如果您对消息的定义是“不包括零字节或由换行符终止的换行符的 ASCII 字符序列”,那么您需要编写代码来接收这样的序列。您不能只调用 read 并期望它找到消息边界,因为它不知道您使用换行符作为消息边界。

关于java - C服务器和java客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34651806/

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