大家好,最近在学java socket通讯,客户端给服务器端传输各种文件,文件以流的形式发送,服务器接收到文件流后进行保存,我想请问下服务器端进行保存时如何判断流的格式?谢谢
------解决方案--------------------
流是没有格式的。
一般是通过截取特定长度的byte[],
或判断byte[],直到byte里的值与自己设定的那个结束的那个值相同为止。
截去头部,剩下的按特定格式保存。
------解决方案--------------------
你做CS架构的应用,数据传输是提前约定的。比如你客户端和服务器端都定义一个10k大小的byte数组,客户端把要发送的数据读到数组中,数组读满或者数据读完开始发送,服务器端用数组接收,数组读满了或者数据传完了开始写入文件中。一般的话数据都是加密传输的。
至于文件名和文件格式,你也可以自己实现,很简单方便的。你定义一个文件开始传输和文件传输结束的标志。先发送文件传输标志,然后发送文件名和文件格式。当接收方检测到你要开始传输一个文件了。首先从你发送的数据中读取文件和文件名,一般服务器的文件名要处理下,比如日期加文件名。然后在服务器相应目录建立该文件,完了就是读写数据了。最后收到传输结束标志关闭输出流,关闭文件。
不知道你是TCP还是UDP不过都差不多。TCP传输可靠,UDP效率高。
------解决方案--------------------
我知道你的意思了。数组不像其他集合,元素不够时会在后面自动用初始值补充,所以会有空格。其实C/S架构数据传输不是你想的这样的,很多都是提前约定好的。比如传输byte字节数组的话,根据你定的数组长度会把数组前几位元素独立出来。用来存放传输的数组实际长度。比如数组实际长度100,对应的byte字节就是49, 48, 48,多出来的用0填充。服务器端收到数据后先把约定好的前几位数组元素读出来,完了把0前面的解析成int值,然后根据起始索引和实际长度解析数组。不然你定义的数组长度是1024*1024但是就传送了10个元素,服务器端还是解析固定长,不浪费资源么。
做C/S架构的软件就是这样,很多东西都是自己定义,怎么方便,效率高怎么来,所以需要考虑的就要很全面了。