我使用TcpClient在客户端和服务端建立了一个连接,两边的流也都已经打开了。如果客户端只向这个流中写入字符串或者文件,则服务器端可以处理,因为它不需要进行判断。但是如果我想客户端输入“1”发送字符串“xxx...”,输入“2”发送一张图片文件;而服务端是以流的形式接收,最后保存到了byte[]数组中,那么服务器如何知道发送的是字符串还是图片,又应该如何还原呢?
还是方法本身就有问题,应该在客户端开辟两个端口与服务器通信,一个命令端口,专门传输字符串;一个数据端口,专门用于传输图片?
谢谢!
服务端数组使用两个,Byte[] FileType, FileDatas.
类似张小虾说的,客户端传来的文件流保存到 Byte[] Temp 中,而与客户端约定 Temp 前16 位(或更多)存放文件类型(.jpg、.gif等),字符串时则用空或某个约定标识表示(比如_STR),服务端接收时进行类似 Temp.CopyTo(FileType, 0, 16),Temp.CopyTo(FileDatas, 16) 的处理就可以了。在需要处理的地方转换 FileType 到 FileTypeString,然后 switch(TileTypeString) 当就可以了。
这时看,你说的先发送 1、2 等似乎没必要了,一来功能被 Temp 的前 16 位(?)取代,二来一次文件或内容传送,分成两次发送与接收,在性能上可能不够后者好(网络开销更高?)。
客户端就把"1abcdef"通过UTF16发过去,服务器端取到流后转成byte[]再用UTF16解码前2个字节看看是不是1,是的话就把第3个字节开始的内容以字符串形式处理,如果是2就把第3个字节开始的内容以图片形式处理
一定要UTF16,不然取字节会有问题