【问题标题】:TCP server written in Java client written in C receive error (encoding)用Java编写的TCP服务器用C编写的客户端接收错误(编码)
【发布时间】:2013-08-17 15:22:13
【问题描述】:

我有一个用 Java 编写的 TCP 服务器和一个用 C 编写的客户端。

我正在从客户端发送字符数组,但服务器收到的唯一内容是一个空行,没有任何字符。

您知道为什么会这样吗?我该如何解决这个问题?如何在服务器部分对消息进行编码?

也许问题在于解码?我知道在 C 编程语言中 charbyte,我知道在 Java 中它是 2 个字节。

用Java编写的服务器部分是:

public class main {

/**
 * @param args the command line arguments
 */
public static void main(String[] args) {

    TCPServerHandler handler; // Креирање на handler за TCP серверот
    handler = new TCPServerHandler() {

        //Доколку сакате да го опширите onConnect
        @Override
        public boolean onConnect(INonBlockingConnection inbc) throws IOException, BufferUnderflowException, MaxReadSizeExceededException {
            super.onConnect(inbc); //Задолжително повикување на super.onConnect(inbc)
            //Доколку сакате да го дополните onConnect
            System.out.println("Connected:"+inbc.getRemoteAddress().getHostAddress()+":"+inbc.getRemotePort());
            return true;
        }

        //Доколку сакате да го опширите onDisconnect
        @Override
        public boolean onDisconnect(INonBlockingConnection inbc) throws IOException {
            super.onDisconnect(inbc); //Задолжително повикување на super.onDisconnect(inbc)
            //Доколку сакате да го дополните onDisconnect
            System.out.println("Discconected:"+inbc.getRemoteAddress().getHostAddress()+":"+inbc.getRemotePort());
            return true;
        }

        @Override
        public boolean onData(INonBlockingConnection inbc) throws IOException, BufferUnderflowException, ClosedChannelException, MaxReadSizeExceededException {

             String data = this.readString(inbc);
             int sizeofdata = data.length();
             System.out.println(sizeofdata);
            //Што понатака зависи од самата апликација
            System.out.println(data);
          //  this.writeString(inbc, "OK");
            return true;
        }
    };
    TCPServer server = new TCPServer(9912, handler); // Иницијализирање на серверот на порта 9001 со handler
    server.start(); //Започнување на серверот
    try {
        while (true) {
            if (server.getServerStatus() == true) { //Проверка дали започнал
                System.out.println("Server started");
                break;
            }
        }

        while (true) {
            //Што и да ќе правте откако ќе започне серверот
        }
    } catch (InterruptedException ex) {
        ex.printStackTrace();
    }

}

所以,我在这里像字符串一样阅读,也许这就是问题所在。 用c写的客户端部分是:

static unsigned int barcode[17];

void PRINT_BARCODE_ONLY(void)
{
  int i;
  for (i = 0; i < 16; i++)
  {
    barcode[i] = rx_buffer[6 + i] - 0x30;
  }
  barcode[16] = 35;
  printf("%c[1;31mBARCODE: ", 27);
  for (i = 0; i < 16; i++)
  {
    printf("%X", barcode[i]);
  }
}

int SEND_BARCODE_TCP(void)
{
  int sock_descriptor;
  struct sockaddr_in serv_addr;

  struct hostent *server;
  sock_descriptor = socket(AF_INET, SOCK_STREAM, 0);

  if (sock_descriptor < 0)
    printf("Failed creating socket\n");

  bzero((char *) &serv_addr, sizeof(serv_addr));

  //server = gethostbyname("10.10.1.120");
  server = gethostbyname("192.168.123.103");
  //server = gethostbyname("127.0.0.1");

  if (server == NULL)
  {
    printf("Failed finding server name\n");
    return -1;
  }

  serv_addr.sin_family = AF_INET;
  memcpy((char *) &(serv_addr.sin_addr.s_addr), (char *) (server->h_addr),
      server->h_length);

  serv_addr.sin_port = htons(9912);
  //serv_addr.sin_port = htons(1234);

  if (connect(sock_descriptor, (struct sockaddr *) &serv_addr,
      sizeof(serv_addr)) < 0)
  {
    printf("Failed to connect to server\n");
    return -1;
  }

  else
    printf("Connected successfully \n");

  int count = write(sock_descriptor, barcode, sizeof(barcode));

  if (count < 0)
    printf("Failed writing rquested bytes to server\n");

  close(sock_descriptor);
  return 0;
}

【问题讨论】:

  • 请停止在你的标题中大喊大叫。
  • 很抱歉这不是故意的。它不会再发生了。感谢您的帮助
  • 就目的而言是可以接受的,只是标题的大写传达了对我们的呐喊。
  • 您似乎发送了 17 个unsigned ints。介意向我们展示barcode 是如何初始化/设置的吗?
  • 另外你应该检查write()是否真的写了你作为第三个参数传入的数据量。 write() 被指定在写得更少后也可能返回。所以检查它的返回值,计数并根据需要循环write()

标签: java c tcp


【解决方案1】:

TCP 套接字流是基于字节的。这就是为什么在读/写时使用编码将字符转换为字节的原因。似乎缺少 readString() 的主要方法,但我假设您已经指定了 C 程序正在使用的编码或假设默认编码是好的。

【讨论】:

    猜你喜欢
    • 2010-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 2011-11-05
    • 2011-04-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多