java 生成tcp字节流头部_java通过TCP字节流传输和读取数据

news/2024/7/5 14:46:37

java使用tcp协议时,客户端和服务端都有一个输入流和输出流.但是当需要通过这个流来传输多种信息的时候,比如传文件时先传文件名,再传文件内容,单从流本身来看是无法知道从流中读取多少字节是文件名,多少字节是文件内容.

曾经试过在服务端传送文件名时,自己在后面加一个换行符'\n',然后客户端用BufferedReader把输入流(命名为is)封装,然后调用它的readline方法,就可以成功读出文件名,但是同时通过BufferedReader和is本身来读取字节流中内容时,很容易出错.我猜想是因为同时通过两个方式来读取同一个流,有可能是流的位置指针并不会同步把...所以后来我就完全用is来读取流中的内容了.

自己写一个readline函数

private String readline()

{

//这个类就跟StringBuffer作用类似,可以动态的扩展字节数组的大小

ByteArrayOutputStream baos = new ByteArrayOutputStream();

try {

byte[] b = new byte[1];

while(-1 != (is.read(b)))

{

if(b[0] == '\n')

break;

else

baos.write(b);

}

if(baos.size() == 0)

return null;

return new String(baos.toByteArray());

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

return null;

}

}

能从流中读取一行出来,当然还需要往流中写一行进去

private void writeLineToServer(String s) throws IOException {

StringBuffer sb = new StringBuffer(s);

sb.append("\n"); //\n的作用相当于分隔符

os.write(sb.toString().getBytes());

}

还有一个,从流中读取一定数量的字节,用byte[]返回

public byte[] readBytes(int count)

{

ByteArrayOutputStream baos = new ByteArrayOutputStream();

//这里注意不能直接new byte[count],因为可能跟输入流的缓冲大小有关,如果count大于缓冲区大小,则缓冲区直接会被读空而返回,但实际上还有

//想读的字节没有读出来.这时整个输入流位置指针就乱了,读不到自己想要的内容了.

//所以要一点一点的读,给tcp滑动窗口进行滑动的时间

byte[] buf = new byte[1024];

int n;

try {

while(count > buf.length)

{

n = is.read(buf);

baos.write(buf, 0, n);

count -= n;

}

if(count>0)

{

buf = new byte[count];

is.read(buf);

baos.write(buf);

}

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

return baos.toByteArray();

}

我也不知道别人在使用tcp字节流来传输多种信息的时候是怎么把他们区分开的,但是我用\n做分割符还是挺好用的.上面的三个方法应该是客户端和服务端都可以用到的.


http://www.niftyadmin.cn/n/2643103.html

相关文章

java基础流程控制语句_JAVA基础知识点梳理三:流程控制语句-Go语言中文社区

条件语句之 if语法:执行过程:例:int score 65;if (score > 60) {System.out.println("该学生及格");}//注:如果 if 条件成立时的执行语句只有一条,大括弧可以省略,但如果执行语句有多条&…

版本管理工具:linux下svn的基本使用

参考: linux下安装SVN    http://jingyan.baidu.com/article/3c343ff7039de20d37796306.html svn客户端使用linux篇 http://jeanlyn.sinaapp.com/svn_linux/ svn使用简介 1)创建目录: mkdir /home/svn_hl_gg/ cd /home/svn_hl_gg/ 2&am…

CSS块级元素、内联元素

在css盒子模型中,我们提到了html元素中的块元素(block element)和内联元素(inline element)。那么它们究竟是什么呢? 其实,这两种元素都是html规范中的概念。块元素(block element)一般是其…

php discuzSQL注入_Discuz 7.2 /search.php SQL注入漏洞

在文件/include/search_sort.inc.php150行include_once DISCUZ_ROOT../forumdata/cache/threadsort_.$selectsortid..php;这个$selectsortid变量没有做过任何处理,而且最后进入到了170行的SQL语句$query $db->query("SELECT tid FROM {$tablepre}optionval…

php微信抽奖系统源码,微信互动游戏营销活动抽奖系统 v1.1

口号帮微信互动游戏营销活动抽奖DIY在线制作系统,支持微信游戏活动自定义,可以应用微信抽奖活动系统。系统可以自定义游戏名称、奖品、产品核销等功能。v1.11.修复后台数据显示问题2.修复无法删除游戏bug3.增加线下兑奖人员的设置4.增加数据表5.增加日志清理功能6.增…

[转载] 使用Kettle进行数据迁移(ETL)

由于开发新的系统,需要将之前一个老的C/S应用的数据按照新的数据设计导入到新库中。此过程可能涉及到表结构不一致、大数据量(千万级,甚至上亿)等情况,包括异构数据的抽取、清洗等等工作。部分复杂的工作需要我们的DBA…

Java多线程-入门知识

通用知识-名词解释 多任务:统一时间可以运行多个任务(应用程序),但存在并发(同一个CPU上)于并行(多个CPU同时处理)的区别. 进程:进程是线程的容器。是包含程序的指令、数据及其组织形式的描述,进程是程序的实体,保持着当前程序的活动状态。…

equals是判断java原理,Java中equals()与hashCode()的原理与设计

1、何时需要重写equals()当一个类有自己特有的“逻辑相等”概念(不同于对象身份的概念)。2、为什么改写equals()的时候,总是要改写hashCode()两个原则:hashCode()的返回值和equals()的关系如下:如果x.equals(y)返回“true”,那么x…