当前位置: 代码迷 >> Java Web开发 >> 请问怎么判断java socket流格式
  详细解决方案

请问怎么判断java socket流格式

热度:57   发布时间:2016-04-16 22:24:50.0
请教如何判断java socket流格式
        大家好,最近在学java socket通讯,客户端给服务器端传输各种文件,文件以流的形式发送,服务器接收到文件流后进行保存,我想请问下服务器端进行保存时如何判断流的格式?谢谢
------解决方案--------------------
流是没有格式的。
一般是通过截取特定长度的byte[],  
或判断byte[],直到byte里的值与自己设定的那个结束的那个值相同为止。

截去头部,剩下的按特定格式保存。
------解决方案--------------------
你做CS架构的应用,数据传输是提前约定的。比如你客户端和服务器端都定义一个10k大小的byte数组,客户端把要发送的数据读到数组中,数组读满或者数据读完开始发送,服务器端用数组接收,数组读满了或者数据传完了开始写入文件中。一般的话数据都是加密传输的。
至于文件名和文件格式,你也可以自己实现,很简单方便的。你定义一个文件开始传输和文件传输结束的标志。先发送文件传输标志,然后发送文件名和文件格式。当接收方检测到你要开始传输一个文件了。首先从你发送的数据中读取文件和文件名,一般服务器的文件名要处理下,比如日期加文件名。然后在服务器相应目录建立该文件,完了就是读写数据了。最后收到传输结束标志关闭输出流,关闭文件。
不知道你是TCP还是UDP不过都差不多。TCP传输可靠,UDP效率高。

------解决方案--------------------
引用:
Quote: 引用:

Quote: 引用:

Quote: 引用:

你做CS架构的应用,数据传输是提前约定的。比如你客户端和服务器端都定义一个10k大小的byte数组,客户端把要发送的数据读到数组中,数组读满或者数据读完开始发送,服务器端用数组接收,数组读满了或者数据传完了开始写入文件中。一般的话数据都是加密传输的。
至于文件名和文件格式,你也可以自己实现,很简单方便的。你定义一个文件开始传输和文件传输结束的标志。先发送文件传输标志,然后发送文件名和文件格式。当接收方检测到你要开始传输一个文件了。首先从你发送的数据中读取文件和文件名,一般服务器的文件名要处理下,比如日期加文件名。然后在服务器相应目录建立该文件,完了就是读写数据了。最后收到传输结束标志关闭输出流,关闭文件。
不知道你是TCP还是UDP不过都差不多。TCP传输可靠,UDP效率高。

谢谢, 终于实现了~~
把文件后缀的长度和后缀名转成字节先传输过去,在服务器端进行截取,根据实践,传到服务器的要进行trim去掉空字节。

还有个问题,后缀的长度是变化的,当超过4个字节时(尽管这种情况很少出现),应该如何去判断?
能不能指定字节长度,不够时自动补齐字节。

正常情况下文件的后缀名是最后一个“.”开始往后的才是。比如“新建文本文档.doc.rmvb.pdf.txt”不管它多少个“.”最后一个还是".txt"所以你只需要用String类的lastIndexOf检查接收的字符串,前面的是文件名,后面的是后缀名。而且不要用trim方法去空格,因为文件名有空格很正常。




服务器读取后缀长和名称时,用的一个固定字节缓存,当读取的字符不够时,会自动补齐,没有trim时,保存时是看上去文件名称是对的,但是打开报格式不支持,长按进行重命名,后退10下,才开始删字符,后缀前面也有空的,不删时是看不出来的

我知道你的意思了。数组不像其他集合,元素不够时会在后面自动用初始值补充,所以会有空格。其实C/S架构数据传输不是你想的这样的,很多都是提前约定好的。比如传输byte字节数组的话,根据你定的数组长度会把数组前几位元素独立出来。用来存放传输的数组实际长度。比如数组实际长度100,对应的byte字节就是49, 48, 48,多出来的用0填充。服务器端收到数据后先把约定好的前几位数组元素读出来,完了把0前面的解析成int值,然后根据起始索引和实际长度解析数组。不然你定义的数组长度是1024*1024但是就传送了10个元素,服务器端还是解析固定长,不浪费资源么。
做C/S架构的软件就是这样,很多东西都是自己定义,怎么方便,效率高怎么来,所以需要考虑的就要很全面了。
  相关解决方案