TCP-сервер, написанный на Java-клиенте, написанный с ошибкой приема C (кодирование)

У меня есть TCP-сервер, написанный на Java, и клиент, который написан на C.

Я отправляю массив символов из клиента, но единственное, что получено на сервере, - пустая строка, не существует никаких символов.

Вы знаете, почему это происходит и как я могу решить эту проблему? Как я могу кодировать сообщение в части сервера?

Может быть, проблема в декодировании? Я знаю, что в языке программирования C char byte, и я знаю, что в 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;
}
1 ответ

Потоки сокетов TCP основаны на байтах. Вот почему кодирование используется для преобразования символов в байты при чтении/записи. Похоже, что основной метод readString() отсутствует, но я предполагаю, что вы указали enocding, который использует программа C или предполагается, что кодировка по умолчанию - это нормально.

licensed under cc by-sa 3.0 with attribution.