gpt4 book ai didi

java - 用Java编写的TCP服务器用C编写的客户端接收错误(编码)

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

我有一个用 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;
}

最佳答案

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

关于java - 用Java编写的TCP服务器用C编写的客户端接收错误(编码),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18252652/

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