java - C服务器和java客户端

标签 java c sockets networking

我创建了一个 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/

相关文章:

java - 如何从 JSP tomcat 服务器运行 jar

c++ - 浮点值的范围分析?

javascript - WebSocket 开销和手动缓冲数据包

java - 如何分离Tomcat中的web应用日志记录

java - Java 中的 EOFException

c - 递归函数返回难以理解的答案

c - 获取空初始化字符串数组的第一个值

linux - Python 服务器在 Linux 中不工作

javascript - 监听特定房间的 Socket.io 事件

java - 尝试使用回收位图的 Canvas