TCP服务器用Java编写客户端用C编写接收错误(编码)
我有一个用Java编写的TCP服务器和一个用C编写的客户端 我正在从客户端发送字符数组,但服务器中收到的唯一内容是一个空行,没有任何字符 你知道为什么会发生这种情况,我怎样才能解决这个问题?如何在服务器部分对消息进行编码 也许问题出在解码上?我知道在C编程语言中char是TCP服务器用Java编写客户端用C编写接收错误(编码),java,c,tcp,Java,C,Tcp,我有一个用Java编写的TCP服务器和一个用C编写的客户端 我正在从客户端发送字符数组,但服务器中收到的唯一内容是一个空行,没有任何字符 你知道为什么会发生这种情况,我怎样才能解决这个问题?如何在服务器部分对消息进行编码 也许问题出在解码上?我知道在C编程语言中char是byte,在Java中是2个字节 用Java编写的服务器部分是: public class main { /** * @param args the command line arguments */ public sta
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;
}
静态无符号整数条码[17];
作废仅打印条形码(作废)
{
int i;
对于(i=0;i<16;i++)
{
条形码[i]=rx_缓冲区[6+i]-0x30;
}
条码[16]=35;
printf(“%c[1;31mBARCODE:”,27);
对于(i=0;i<16;i++)
{
printf(“%X”,条形码[i]);
}
}
int发送\条形码\ TCP(无效)
{
int-sock_描述符;
服务地址中的结构sockaddr\u;
结构主机*服务器;
sock\u描述符=套接字(AF\u INET,sock\u STREAM,0);
if(sock_描述符<0)
printf(“创建套接字失败\n”);
bzero((char*)&serv_addr,sizeof(serv_addr));
//服务器=gethostbyname(“10.10.1.120”);
服务器=gethostbyname(“192.168.123.103”);
//服务器=gethostbyname(“127.0.0.1”);
如果(服务器==NULL)
{
printf(“查找服务器名称失败\n”);
返回-1;
}
serv_addr.sin_family=AF_INET;
memcpy((char*)和(serv_addr.sin_addr.s_addr),(char*)(server->h_addr),
服务器->h_长度);
serv_addr.sinu port=htons(9912);
//serv_addr.sin_port=htons(1234);
if(connect(sock\u描述符,(struct sockaddr*)和serv\u addr,
sizeof(服务地址))<0)
{
printf(“无法连接到服务器\n”);
返回-1;
}
其他的
printf(“连接成功\n”);
int count=写入(sock_描述符、条形码、sizeof(条形码));
如果(计数<0)
printf(“将请求的字节写入服务器失败\n”);
关闭(sock_描述符);
返回0;
}
TCP套接字流是基于字节的。这就是为什么在读/写时使用编码将字符转换为字节。它似乎是主方法readString()
缺失,但我假设您已经指定了C程序正在使用的ENOCD,或者假设默认编码是正确的。请不要在标题中大喊大叫。我很抱歉这不是故意的。不会再发生了。感谢您的帮助。就目的而言,这是可以接受的,只是标题的大写字母在向我们喊叫。您看起来要发送17unsigned int
s。请告诉我们如何初始化/设置barcode
?您还应该检查write()
是否确实写入了作为第三个参数传入的数据量。write()
被指定为在写入更少的内容后也可能返回。因此,检查其返回值,根据需要计数并循环write()
。