梦说别停留等待 2019-12-23 16:22 采纳率: 0%
浏览 731
已结题

java和c使用socket通信时,发送报文的问题

问题详细描述:java是客户端,c语言是服务端。程序的目的是java发送报文过去 ,服务器能够识别。但是c语言写的服务端是很多年前的,目前已经无法对服务端作任何修改,c接收报文是用char定义的,报文是定长报文,不够的用空格补全,格式为包头+报文长度+报文内容(1字节+4字节+300字节),包头是6,报文长度是0300,报文内容由下图的结构体定义。图片说明java使用getBytes()方法,获取了字节数组,发送过去后服务端报错,报错信息为包头错误,后来发现那边接收的是6对应ASCII码,请问这应该如何解决呢?java测试代码如下

package Demo01;

import java.io.BufferedOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class send {
    public static void main(String[] args) {
        try {
            iSend("172.33.xx.xx",10000);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void iSend(String IP,int PORT) throws IOException{
         String baotou = "6";
         String blen= "0300";
         String id = "0001";
         String sysid = "1111";
         String sysname = "disk";
         String type = "11";
         String level = "1";
         String content = "sendcontent";

            Socket socket = null;
            BufferedOutputStream bos = null;
            String message = "" ;

        List <Object> messList = new ArrayList();
        messList.add(baotou);       
        messList.add(blen); 
        messList.add(id);       
        messList.add(sysid);        
        messList.add(sysname);  
        messList.add(type);     
        messList.add(level);        
        messList.add(content);

        List <Object> messList2 = new ArrayList();
        messList2.add(changeString(messList.get(0).toString(),1));
        messList2.add(changeString(messList.get(1).toString(),4));
        messList2.add(changeString(messList.get(2).toString(),4));
        messList2.add(changeString(messList.get(3).toString(),8));
        messList2.add(changeString(messList.get(4).toString(),16));
        messList2.add(changeString(messList.get(5).toString(),16));
        messList2.add(changeString(messList.get(6).toString(),16));
        messList2.add(changeString(messList.get(7).toString(),240));
        for(Iterator<Object> it = messList2.iterator();it.hasNext();){
            message += it.next();
        }
        System.out.println("报文为:"+message);
            try {
                 socket = new Socket(IP,PORT);
                 bos = new BufferedOutputStream(socket.getOutputStream());
                  byte [] buf = message.getBytes();
                    bos.write(buf,0,buf.length);
                    bos.flush();
            } catch (UnknownHostException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }finally{
                if(socket != null){
                    socket.close();
                }

            }
    }
/**
     * 
     *设置定长报文,用空格补齐
     * @param object 报文集合
     * @param len 报文的规定长度
     * @return 
     */
    public static  String  changeString(String list,int len){
        for(int ListLen = list.length();ListLen < len;ListLen++){
            list +=" ";
        }
        return list;
    }
}

  • 写回答

3条回答 默认 最新

  • dabocaiqq 2019-12-23 17:05
    关注
    评论

报告相同问题?

悬赏问题

  • ¥20 腾讯企业邮箱邮件可以恢复么
  • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?
  • ¥15 错误 LNK2001 无法解析的外部符号
  • ¥50 安装pyaudiokits失败
  • ¥15 计组这些题应该咋做呀
  • ¥60 更换迈创SOL6M4AE卡的时候,驱动要重新装才能使用,怎么解决?
  • ¥15 让node服务器有自动加载文件的功能
  • ¥15 jmeter脚本回放有的是对的有的是错的
  • ¥15 r语言蛋白组学相关问题
  • ¥15 Python时间序列如何拟合疏系数模型