socket中字节转换成汉字的问题?急

wxf4961 2004-04-30 10:49:40
in = new DataInputStream(socket.getInputStream());
String request="";
while(true){
byte[] b = new byte[1024];
int num = in.read(b, 0, 1024);
if(request中不包括结束符){
request = request+new String(b).trim();
}else request="";
}
假如读出的数据中存在汉字,并且一个汉字处于字节数组中的1024和1025两个位置。按照上述程序,读出来的处于1024和1025的汉字是乱码(例如:?),怎么解决上述问题呢?盼望高人指点。
...全文
153 22 点赞 打赏 收藏 举报
写回复
22 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
bigcrazy 2004-05-09
你不要每次取1024个字节就转为String,而是把字节先存放在ByteArrayOutputStream里,取完以后再统一转为String,如果接发双方都是中文WINDOWS环境,就不会有需要换编码类型的事。
  • 打赏
  • 举报
回复
cloudysunny 2004-05-09
qqbz(qqbz) 说的不错,
楼主主要是对网络编程只有简单的了解,应该看一下一些应用协议的东西(如HTTP)。
SOCKET只是提供物理层的东西,程序要用得上还需要自己定义应用层的协议。
只有清楚自己所使用的协议才能真正编程的-因为如果你连一个完整的协议包是如何判断都不知道的话,就更不要说如何做内容的解析了。
  • 打赏
  • 举报
回复
goldenhua 2004-05-09
至于具体怎么做嘛,就拿现在最热门的BT下载来说,你看看他的协议规范啦:
http://bitconjurer.org/BitTorrent/protocol.html
很简洁,实现起来很方便,有兴趣可以自己做一个BT客户端程序啊。
顺便还可以学一下:
sha校验;
文件分片处理;
多线程编程;
多点socket传输;
网络拓扑侦测;
分布式发布原理;
有兴趣还可以研究一下python;
呵呵,当然这些都不是BT协议规定的东东。
  • 打赏
  • 举报
回复
goldenhua 2004-05-09
就你说的问题而言,你可以让服务端告诉客户端完整的字符串是多长啊,然后完整接收那么长之后再显示不行么?
  • 打赏
  • 举报
回复
yunuo2010000 2004-05-09
学习
  • 打赏
  • 举报
回复
goldenhua 2004-05-09
socket是TCP协议的一种最常用的接口(另一个是TLI),现在的高层机制(RMI,JDBC,CORBA,COM+等)在处理网络通信时哪个不需要用到socket呢,那你就说他们都是socket吗?soap还在HTTP之上呢,那也算是socket吧,呵呵。精确理解socket编程是很有意义的,如果不做比较底层的工作,是不需要用socket编程的,太原始了。
  • 打赏
  • 举报
回复
qqbz 2004-05-08
楼上的,http实际上也是一种socket。
不知道楼上的编写过有关编码转换的程序否。
这个问题在需要编码转换的地方很普遍。
  • 打赏
  • 举报
回复
goldenhua 2004-05-08
建议仔细研究一下HTTP等常用协议,对协议两个字有个清晰的认识,没有协议的网络编程是没有意义的。
  • 打赏
  • 举报
回复
goldenhua 2004-05-08
我要说,现在还在使用原始socket编程的人是笨笨!
你的问题其实是一个协议问题,首先通讯双方应该有一个协商好的通讯方式(如报文长度,格式,结束方式等),然后是应用的编码方式(譬如汉字文章一般用GB2312或UTF-8方式编码),只有这些都明确以后你才能用socket编程去实现他们。但是,为什么不采用HTTP等成熟的协议来处理呢?
  • 打赏
  • 举报
回复
wxf4961 2004-04-30
gzhua99(孤浪) :我试过了,不行
  • 打赏
  • 举报
回复
gzhua99 2004-04-30
用gbk的编码方式
  • 打赏
  • 举报
回复
wxf4961 2004-04-30
napoleonz(愣头青) :这样效率会低把?
Arias(永恒之道):能不能帮我找一下,谢谢!
  • 打赏
  • 举报
回复
panpan221 2004-04-30
新手学习
  • 打赏
  • 举报
回复
napoleonz 2004-04-30

最好是在按字节都去数据流时用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 2004-04-30
你直接可以在处理从socket得到的流的时候,好像可以通过编码的方式
使本来要占2字节的汉字直接转换为只占一个字节的代码,这些编码之间的转换
关系就是通过String 中的什么getBytes("1","2")的处理,具体的我也没有处理过
不过这种肯定能实现,我们实现过这样的处理!
  • 打赏
  • 举报
回复
geniuscom 2004-04-30
用StringBuffer request = new StringBuffer();
  • 打赏
  • 举报
回复
show90 2004-04-30
学习中!!
  • 打赏
  • 举报
回复
CoolAbu 2004-04-30
构造一个流的读取器
InputStreamReader in = new InputStreamReader(socket.getInputStream());

然后调用读取器的read方法,它一次读一个字符,不是字节,这样就容易处理汉字了。

int charnow=in.read();
  • 打赏
  • 举报
回复
qqbz 2004-04-30
1、你接收有问题:网络上即使你一次指定收1024,但可能只传过来一部分,其余的会分多次传完:因此你应该循环接收。此时你必须知道本次传输大约有多少字节过来,要不就是一次你传定长的协议,如果某次数据小于定长的,也需要用特殊字符填充(如你程序里的1024个一次)。按这个方法就不可能出现你说的情况了。同时也不要用你的那种方法判断结束。
2、你也应该在收到全部字节后一次转换为字符串。这样即方便处理也能提高效率(字符串处理很耗时间)。
3、转换汉字,首先要确认对方传过来的编码方式(java里统一会用utf-8,但如果是不同的编码方式转换为utf-8也是不一样的),假设你对方也是中文windows系统,那一般编码为gb2312(即楼上说的gbk),那你收到后:new String(b,‘gb2312’)。
  • 打赏
  • 举报
回复
gzhua99 2004-04-30
byte buffer[] = new byte[8000];
int nread = 0;
int r = 0;
int readnum=in.read(buffer,0,8000);
  • 打赏
  • 举报
回复
加载更多回复
相关推荐
发帖
Java SE
加入

6.2w+

社区成员

Java 2 Standard Edition
申请成为版主
帖子事件
创建了帖子
2004-04-30 10:49
社区公告
暂无公告