问题描述
||
我需要通过一些sockt(让我们说端口8478)将文件从服务器发送到客户端,还要进行按摩(在文件传输过程中)(诸如“ hi”或“您达到极限”之类的东西)。您将达到50%的极限”。
现在只发送文件,很容易使用
客户端和服务器端的BufferedInputStrear和bufferedoutputstream。
现在我该如何在同一个端口的文件传输中发送按摩消息(8478)。
谢谢你们..
这是我如何传输文件
服务器端:
BufferedInputStream d=new BufferedInputStream(new FileInputStream(s));
bufferedoutputstream outStream = new bufferedoutputstream(cs.getoutputStream());
ObjectOutputStream msgoutStream = new ObjectOutputStream(cs.getoutputStream());
byte buffer[] = new byte[1024];
int read;
while((read = d.read(buffer))!=-1)
{
//msgoutStream.writeUTF(\"hjlhkhjk\");
outStream.write(buffer,read);
outStream.flush();
}
客户端:
byte buffer[] = new byte[1024];
int read;
int f=0;
while((read = d.read(buffer))!=-1)
{
if(ifContinun)
{
System.out.println(\"strat write to file...\");
}
//String s1=msginPutStream.readLine();
//String s2=msginPutStream.readUTF();
outStream.write(buffer,read);
outStream.flush();
if(ifContinun)
{
System.out.println(\"after write to file...\");
ifContinun=false;
}
}
解决方法
您需要分批发送文件。您可以发明类似的协议
short stream-id
short length of message
bytes of the message
这将允许您在同一套接字中交错多个数据流,并使另一端分解不同的流。
但是,打开两个连接可能会更简单,从而避免了需要这样的协议。例如FTP执行此操作。 ;)
,为此,您需要在TCP之上定义一个协议。例如,协议可以是:
有一系列消息
每个消息都有一个类型
每个消息前面都有4个字节,这些字节携带下一条消息的大小
每个消息都以一个类型字节开头
类型为:1-StartFile,2-NextFileChunk,3-TextMessage
第二个字节开始包含消息的正文
对于StartFile,其余字节构成文件名以及您要发送的其他任何属性。 (您可以选择使用常规Java序列化。)
对于NextFileChunk,您只需传输文件的下n个字节
对于TestMessage,其余字节将携带文本消息
,一种方法是使用一些转义代码来指示何时从文件传输更改为文本转换器,反之亦然。因为二进制文件可能包含您的转义码,所以您必须以某种方式处理它们。
但是消息协议是可取的。