【问题标题】:C server and java clientC服务器和java客户端
【发布时间】:2016-01-07 09:41:22
【问题描述】:

我创建了一个 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);
}

【问题讨论】:

  • 而c代码在一个名为“Sources.c”的文件中? :))
  • 你能详细说明一下
  • @Tejas 他在拖钓,因为你有 include "Headers.h"

标签: java c sockets networking


【解决方案1】:
    n = read(newsockfd,buffer,1024);

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

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

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

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

【讨论】:

  • 你能解释我如何继续@david
  • 如果您需要消息,请确定消息格式并编写代码以您决定的格式发送和接收消息。
【解决方案2】:

您的代码的主要问题是您在 C 中处理字符串的方式。

您的服务器似乎假定您通过网络发送 UTF-8 编码的字符串,但 Java 中的字符串默认以 UTF-16 编码。您还需要一种方法来确保每个消息缓冲区仅包含有效的 Unicode 字符。 Unicode 字符串中的每个字符都可以使用多个字节,您可能会在服务器端收到部分发送的字符。

【讨论】:

    【解决方案3】:

    你在java程序中有一个小错字:

       pw.print(s);
    

    s 是套接字,因此您发送的是s.toString()。 我想你的意思是:

       pw.print(ss);
    

    此外,正如@DavidSchwartz 指出的那样,您需要决定消息协议。

    一些有用的链接:

    Protocol types

    Understanding and designing socket message protocols

    【讨论】:

    • 你能告诉我如何处理消息协议部分
    • 是的,这是一个错误,但它不会导致问题
    • 我添加了一些涵盖基础知识的链接。
    猜你喜欢
    • 2013-11-12
    • 1970-01-01
    • 1970-01-01
    • 2019-02-26
    • 2012-10-09
    • 2022-06-16
    • 2011-06-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多