socket中如何正确使用BufferedOutputStream,BufferedInputStream

pyb521 2002-07-11 11:32:55
在网络传输中我们不希望一个一个字节去传输数据。因此通常需要用输出缓冲来提高效率。大家看看我的这个设计合不合理,谢谢!!!!

大致结构:向服务发送不定数量的消息(有可能是几十条也有可能十几百条),每条消息的长度不一样,最大的差距在2000个字节左右。首先,我取出这些消息的最长的长度,用这个长度定义了BufferedOutputStream,每写一次,调用一次flush方法。程序如下,由于相关的东西较多,所以我只取了其中一段:

MessageContent:存放消息内容的类
messagelist:vector 消息列表

int maxmessagelength=0;
for(int i=0;i<messagelist.size();i++)
{
message = (MessageContent)messagelist.get(i);
if (message.getMessagelength()>maxmessagelength)
{
maxmessagelength = message.getMessagelength();
}
}
BufferedOutputStream bufferout= new BufferedOutputStream(client.getOutputStream(),maxmessagelength+4);

in = new DataInputStream(client.getInputStream());
out = new DataOutputStream(bufferout);

//发送数据
for(int i=0;i<messagelist.size();i++)
{
message = (MessageContent)messagelist.get(i);
out.writeInt(SEND_CONTINUE);//代表还有消息发送
message.sendMessage(out);
out.flush();
}
out.writeInt(SEND_END);//指发送完毕

我不知道这样做有没有问题,大家指教

...全文
440 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
gularess 2002-07-11
  • 打赏
  • 举报
回复
既然提高效率,为什么不一次多传一点呢?
我觉得最好将消息全部写入后,来一次flush呢,构造BufferedOutputStream的时候,size在大一点,maxmessagelength += message.getMessagelength() + 16;//4为writeInt的字节数。这样缓冲一次就可以了。

个人意见!
hccpro 2002-07-11
  • 打赏
  • 举报
回复
缓存没必要设置太大,默认值就可以。

你取消息最长的设置缓存的长度,花费的时间也不少。

另外,可以用PrintStream代替DataInputStream,然后在构造器里设置autoFlush为true。

vector是同步的,如果你处在单线程中,而且没有并发存取问题,可以用ArrayList代替。
hccpro 2002-07-11
  • 打赏
  • 举报
回复
差别确实不太大,俺也不是很清楚,反正PringStream比较灵活些,可以

在构造器里设置autoFlush。

但出现错误时不会throw IOException,你需要用checkError方法。
pyb521 2002-07-11
  • 打赏
  • 举报
回复
gularess(无吃哪拉)

对不起,我忘了吧挺重要的东西拷上来,我的每条消息都要得到服务器的验证,得到相应的response,处理已发送的消息后才能处理下一个

hccpro(hcc)
PrintStream和DataOutputStream的差别我查了一下资料,我看不懂它们之间到底有多大差别,能讲将它们之间的差别、优缺点吗?

62,616

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧