【问题标题】:try sending file and string through same sockt (in java)尝试通过同一个套接字发送文件和字符串(在java中)
【发布时间】:2011-09-02 12:34:16
【问题描述】:

我需要通过一些 sockt(比如说端口 8478)和按摩(在文件传输的中间部分)将文件从服务器发送到客户端(类似“hi”或“你达到你的 limt”或“你达到到你的 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, 0, 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, 0, read);
            outStream.flush();
            if(ifContinun)
            {
                System.out.println("after write to file...");
                ifContinun=false;
            }
        }

【问题讨论】:

    标签: java sockets file-transfer client-server


    【解决方案1】:

    为此,您需要在 TCP 之上定义一个协议。例如,协议可以是:

    1. 有一系列消息
    2. 每条消息都有一个类型
    3. 每条消息前面都有 4 个字节,用于携带下一条消息的大小
    4. 每条消息都以类型字节开头
    5. 类型有:1——StartFile,2——NextFileChunk,3——TextMessage
    6. 第二个字节以后包含消息正文
    7. 对于 StartFile,其余字节构成文件名和您要发送的任何其他属性。 (您可以选择使用常规 Java 序列化。)
    8. 对于 NextFileChunk,您只需传输文件的下 n 个字节
    9. 对于 TestMessage,其余字节将携带文本消息

    【讨论】:

    • 我编辑了我的第一篇文章。如果我安德斯塔德,我需要使用缓冲缓冲区 [0] 进行按摩吗?以及缓冲区的其余部分到文件信息?
    【解决方案2】:

    您需要分批发送文件。你可以发明一个像

    这样的协议
     short stream-id
     short length of message
     bytes of the message
    

    这将允许您在同一个套接字中交错多个数据流,并让另一端分解不同的流。

    但是,打开两个连接可能要简单得多,这样就不需要像这样的协议。例如FTP 执行此操作。 ;)

    【讨论】:

      【解决方案3】:

      一种方法是使用一些转义码来指示何时从文件传输更改为文本传输,反之亦然。因为二进制文件可能包含您的转义码,所以您必须以某种方式处理这些代码。

      但消息协议更可取。

      【讨论】:

      • 可以是单字节,有约定的固定值。例如 0xFF。当您想在文件传输过程中发送文本时:发送 0xFF,然后是文本,再发送 0xFF,然后继续文件传输。有关更多信息,请参阅:维基百科的“转义字符”asn“转义序列”文章。
      猜你喜欢
      • 1970-01-01
      • 2016-12-08
      • 1970-01-01
      • 2012-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多