socket问题可以归结为:发送非ASCII接收就有问题

解决方案 »

  1.   

    是不是java自动做了内码转换了?你用的char数组,恐怕...........
      

  2.   

    发送的时候是以byte[] ,还是char[]???
      

  3.   

    你搞得太复杂了..用面向对象方法封装一个数据包不就得了..解包也容易!!
      下面是一个封装包的类ITPPacket,putValue()方法用于填充包,getValue()方法,接收端从包中取得数据:------------------------------------------------------------
    package com.bySoft.acee.comm;import java.io.PrintStream;
    import java.util.ArrayList;
    import java.util.StringTokenizer;public class ITPPacket
    {    private byte hdrBuf[];
        private ArrayList header;
        private String method;
        private String ver;
        public String ip;
        public static final String ITP_VER = "ITP1.1";
        public static final String ITP_CR = String.valueOf('\n');
        public static final String ITP_REQ_ECHO = "ITP-REQ-ECHO";
        public static final String ITP_REQ_WHOAMI = "ITP-REQ-WAI";
        public static final String ITP_REQ_WHOISWHO = "ITP-REQ-WIW";
        public static final String ITP_REQ_LOIGIN = "ITP-REQ-LOGIN";
        public static final String ITP_REQ_LOGOUT = "ITP-REQ-LOGOUT";
        public static final String ITP_REQ_KILL = "ITP-REQ-KILL";
        public static final String ITP_RPL_OK = "ITP-RPL-OK";
        public static final String ITP_RPL_FAILED = "ITP-RPL-FAILED";
        public static final String ITP_PSH_TXT = "ITP-PSH-TEXT";
        public static final String ITP_PSH_MMS = "ITP-PSH-MMS";
        public static final String ITP_PSH_URL = "ITP-PSH-URL";
        public static final String ITP_END = "\t\t";    public ITPPacket(String method)
        {
            header = new ArrayList();
            header.add(method + " " + "ITP1.1");
        }    public ITPPacket(byte hdrBuf[])
            throws Exception
        {
            this.hdrBuf = hdrBuf;
            String tmp = new String(this.hdrBuf, 0, this.hdrBuf.length);
            StringTokenizer st = new StringTokenizer(tmp, ITP_CR);
            header = new ArrayList();
            for(; st.hasMoreTokens(); header.add(st.nextToken()));
            String l = (String)header.get(0);
            st = new StringTokenizer(l, " ");
            method = st.nextToken();
            ver = st.nextToken();
        }    public String getValue(String f)
        {
            String search = f + ":";
            String find = "";
            for(int i = 0; i < header.size(); i++)
            {
                String l = (String)header.get(i);
                if(!l.toLowerCase().startsWith(search))
                    continue;
                find = l.substring(search.length()).trim();
                break;
            }        return find;
        }    public ArrayList getValueList(String f)
        {
            String search = f + ":";
            String find = "";
            ArrayList tmp = new ArrayList();
            for(int i = 0; i < header.size(); i++)
            {
                String l = (String)header.get(i);
                if(l.toLowerCase().startsWith(search))
                    tmp.add(l.substring(search.length()).trim());
            }        return tmp;
        }    public void putValue(String f, String v)
        {
            System.out.println("added");
            header.add(f + ": " + v);
        }    public String getMethod()
        {
            return method;
        }    public String getVer()
        {
            return ver;
        }    public byte[] toBytes()
        {
            String tmp = "";
            for(int i = 0; i < header.size(); i++)
            {
                String l = (String)header.get(i);
                tmp = tmp + l;
                tmp = tmp + ITP_CR;
            }        tmp = tmp + "\t\t";
            tmp = tmp + ITP_CR;
            return tmp.getBytes();    }}------------------------------------------------------- 
    我同情你们,你们程序员,不幸的星辰,   你们聪明而又晶莹,   乐于为迷途的老板照亮道路,   可没谁报答你们,不论神或人:   你们不恋爱,也从不知道爱!   永恒的时光带领你们   无休止地在广袤的空中行进。   你们走完了几多旅程,   自从老板沉湎在情人的怀抱里,   忘记了星已白,夜已深。 
      

  4.   

    谢谢Kylix_XP,但你的程序不能解决我的问题
      

  5.   

    用netxray接在网上跟踪一下吧,看看到底是发出端还是接收端除了问题。然后就自己看程序吧,哪里比特顺序搞错了。
      

  6.   

    这个我了解一点。你要发送 0xBF是不能直接发送的,需要发送-0x41,不然最高位会丢失。这个问题我没有解决。