socket中字节转换成汉字的问题?急 用StringBuffer request = new StringBuffer(); 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你直接可以在处理从socket得到的流的时候,好像可以通过编码的方式使本来要占2字节的汉字直接转换为只占一个字节的代码,这些编码之间的转换关系就是通过String 中的什么getBytes("1","2")的处理,具体的我也没有处理过不过这种肯定能实现,我们实现过这样的处理! 最好是在按字节都去数据流时用readByte(),有一个结束标志.比如"/n" public String getMsgCount(DataInputStream datain){ //取出输入流的消息的长度 String msglength=null; //次"1024"可是随便的定个上限 byte[] buff=new byte[1024]; Do{ try{ buff[i]=datain.readByte(); }catch(IOException e){ e.printStackTrace(); } }while(buff[i]<>13) //msglength=buff.toString(); msglength= new String(buff); return msglength;} napoleonz(愣头青) :这样效率会低把?Arias(永恒之道):能不能帮我找一下,谢谢! gzhua99(孤浪) :我试过了,不行 你试过用一个文本作为客户端发过来 客户端保存为UTF-8或者是GBK(可以用EditPlus编辑存储选择格式)然后你接受这个文件看看我也遇到了的有时候是UTF-8 ÷可现在不行我换成GBK就可以了 byte buffer[] = new byte[8000];int nread = 0;int r = 0;int readnum=in.read(buffer,0,8000); 1、你接收有问题:网络上即使你一次指定收1024,但可能只传过来一部分,其余的会分多次传完:因此你应该循环接收。此时你必须知道本次传输大约有多少字节过来,要不就是一次你传定长的协议,如果某次数据小于定长的,也需要用特殊字符填充(如你程序里的1024个一次)。按这个方法就不可能出现你说的情况了。同时也不要用你的那种方法判断结束。2、你也应该在收到全部字节后一次转换为字符串。这样即方便处理也能提高效率(字符串处理很耗时间)。3、转换汉字,首先要确认对方传过来的编码方式(java里统一会用utf-8,但如果是不同的编码方式转换为utf-8也是不一样的),假设你对方也是中文windows系统,那一般编码为gb2312(即楼上说的gbk),那你收到后:new String(b,‘gb2312’)。 构造一个流的读取器InputStreamReader in = new InputStreamReader(socket.getInputStream());然后调用读取器的read方法,它一次读一个字符,不是字节,这样就容易处理汉字了。int charnow=in.read(); 我要说,现在还在使用原始socket编程的人是笨笨!你的问题其实是一个协议问题,首先通讯双方应该有一个协商好的通讯方式(如报文长度,格式,结束方式等),然后是应用的编码方式(譬如汉字文章一般用GB2312或UTF-8方式编码),只有这些都明确以后你才能用socket编程去实现他们。但是,为什么不采用HTTP等成熟的协议来处理呢? 建议仔细研究一下HTTP等常用协议,对协议两个字有个清晰的认识,没有协议的网络编程是没有意义的。 楼上的,http实际上也是一种socket。不知道楼上的编写过有关编码转换的程序否。这个问题在需要编码转换的地方很普遍。 socket是TCP协议的一种最常用的接口(另一个是TLI),现在的高层机制(RMI,JDBC,CORBA,COM+等)在处理网络通信时哪个不需要用到socket呢,那你就说他们都是socket吗?soap还在HTTP之上呢,那也算是socket吧,呵呵。精确理解socket编程是很有意义的,如果不做比较底层的工作,是不需要用socket编程的,太原始了。 至于具体怎么做嘛,就拿现在最热门的BT下载来说,你看看他的协议规范啦:http://bitconjurer.org/BitTorrent/protocol.html很简洁,实现起来很方便,有兴趣可以自己做一个BT客户端程序啊。顺便还可以学一下:sha校验;文件分片处理;多线程编程;多点socket传输;网络拓扑侦测;分布式发布原理;有兴趣还可以研究一下python;呵呵,当然这些都不是BT协议规定的东东。 qqbz(qqbz) 说的不错,楼主主要是对网络编程只有简单的了解,应该看一下一些应用协议的东西(如HTTP)。SOCKET只是提供物理层的东西,程序要用得上还需要自己定义应用层的协议。只有清楚自己所使用的协议才能真正编程的-因为如果你连一个完整的协议包是如何判断都不知道的话,就更不要说如何做内容的解析了。 你不要每次取1024个字节就转为String,而是把字节先存放在ByteArrayOutputStream里,取完以后再统一转为String,如果接发双方都是中文WINDOWS环境,就不会有需要换编码类型的事。 关于字母排序问题 简单问题。。求教。。 如何在应用程序中,设置选种字体的颜色 多线程高效访问网络 关于jxl的问题。(在线等待) 关于JAVA的执行(JAVA)。能执行JSP,但....请帮忙。 请问网上何处有关于JUnit的使用例子程序? 哪里有java的examples(源代码)和java的类库的说明? 想做网络数据库,但有个问题,请高手指点!谢谢! 大侠们!请大家帮忙! 谁帮我改改这段代码,谢谢 紧急请问tomcat4的问题
使本来要占2字节的汉字直接转换为只占一个字节的代码,这些编码之间的转换
关系就是通过String 中的什么getBytes("1","2")的处理,具体的我也没有处理过
不过这种肯定能实现,我们实现过这样的处理!
最好是在按字节都去数据流时用readByte(),有一个结束标志.比如"/n" public String getMsgCount(DataInputStream datain){
//取出输入流的消息的长度
String msglength=null;
//次"1024"可是随便的定个上限
byte[] buff=new byte[1024];
Do{
try{
buff[i]=datain.readByte();
}catch(IOException e){
e.printStackTrace();
}
}while(buff[i]<>13)
//msglength=buff.toString();
msglength= new String(buff);
return msglength;
}
Arias(永恒之道):能不能帮我找一下,谢谢!
然后你接受这个文件看看
我也遇到了的有时候是UTF-8 ÷可现在不行我换成GBK就可以了
int nread = 0;
int r = 0;
int readnum=in.read(buffer,0,8000);
2、你也应该在收到全部字节后一次转换为字符串。这样即方便处理也能提高效率(字符串处理很耗时间)。
3、转换汉字,首先要确认对方传过来的编码方式(java里统一会用utf-8,但如果是不同的编码方式转换为utf-8也是不一样的),假设你对方也是中文windows系统,那一般编码为gb2312(即楼上说的gbk),那你收到后:new String(b,‘gb2312’)。
InputStreamReader in = new InputStreamReader(socket.getInputStream());然后调用读取器的read方法,它一次读一个字符,不是字节,这样就容易处理汉字了。int charnow=in.read();
你的问题其实是一个协议问题,首先通讯双方应该有一个协商好的通讯方式(如报文长度,格式,结束方式等),然后是应用的编码方式(譬如汉字文章一般用GB2312或UTF-8方式编码),只有这些都明确以后你才能用socket编程去实现他们。但是,为什么不采用HTTP等成熟的协议来处理呢?
不知道楼上的编写过有关编码转换的程序否。
这个问题在需要编码转换的地方很普遍。
http://bitconjurer.org/BitTorrent/protocol.html
很简洁,实现起来很方便,有兴趣可以自己做一个BT客户端程序啊。
顺便还可以学一下:
sha校验;
文件分片处理;
多线程编程;
多点socket传输;
网络拓扑侦测;
分布式发布原理;
有兴趣还可以研究一下python;
呵呵,当然这些都不是BT协议规定的东东。
楼主主要是对网络编程只有简单的了解,应该看一下一些应用协议的东西(如HTTP)。
SOCKET只是提供物理层的东西,程序要用得上还需要自己定义应用层的协议。
只有清楚自己所使用的协议才能真正编程的-因为如果你连一个完整的协议包是如何判断都不知道的话,就更不要说如何做内容的解析了。