目前做了一个TCP聊天工具,能够实现群聊私聊. 我的程序模仿的网上的一个例子,我将他改了一点(登陆:11--用户,群聊:22--发送者--时间--内容,私聊:33--接受者--发送者--发送时间--内容)现在想加入客户端之间文件传输.目前想法是发送文件的时候,通过服务器双方获取到对方主机名.IP.使用DatagramSocket(客户端互连),将文件发送出去.方法是否可行.DatagramSocket的端口号是否要跟ServerSocket的端口区别开.
如果想用TCP传输文件,假设文件接受消息头为55 ,就变成 55--接受者--发送者--文件名--文件数据  ???
还是怎么做呢,,求思路,,不要代码..我的脑子有点笨, 望高人用通俗点的话解答...~~~Orz

解决方案 »

  1.   

    lz的想法已经很常用了
    我这里建议你每一个传输文件可以开一个线程输送,用1个socket,当然这是为了方便,性能上的话可以用多个socket,每个socket传送文件的一部分
      

  2.   

       我最近也在一个课程设计,也是要设计文件传输模块,用udp传输会出现丢包现象,还有我还不能实现你说的多个人一起聊天,我现在只能实现单点聊天,而且还必须输入对放的ip和端口号才可以连上,怎么才能做到像QQ那样的或者说是飞秋那样的啊,一上线就可以看到有哪些人在线啊?望高手指教,本人QQ:362392585
      

  3.   

    记录某个用户登陆后的IP和端口,并放到数据库中,发送时候从数据库中把数据取出来,关于文件的传输过程楼主的想法不错,我原来没做的是传递可序列化的OBJECT对象,发送后让另一个客户端相应一次,发送端接到相应表示发送成功,每个发送端即在充当服务器端的工作又在充当客户端的工作,这仅仅是我个人的看法~~
      

  4.   

    传输文件可以另开socket,可以用如下方式实现断点续传:
    sendID+receiveID+fileID+fileTotolBlockLeng+fileBlockSeq+fileBlockContent
    发送方:
    发送方ID,接收方ID,文件ID,文件总块数,文件块顺序(包头),文件块内容(包体)。
    接收方需保存:
    发送方ID,接收方ID,文件ID,文件总块数,已接收块数,文件块内容(包体)的合并。
    可以用多线程实现多个连接(类似BT、emule)。
    每次接受方收到包头后,追加到buffer,当总块数=已接收块数,且文件内容完成当次接收后,可以断开连接。其他的都要在程序里面控制。哎,几句话说不清楚啊
      

  5.   


    飞Q是使用IPMSG协议,这个协议目前我还没看源码,大概了解了它的消息是通过UDP.用户启动客户端广播我来拉其中还包括了他的机器名,主机名,IP.其他的就把他加到用户链表中..文件传输是TCP,具体怎么实现,就不清楚了,才疏学浅,嘎嘎..
      

  6.   

    另开SOCKET,接受就是ServerSocket,发送就是Socket,端口需要跟原来的ServerSocket区分开吗??
    断点是用户需要多开一个文件保存上次接收到的信息?通过计算出接受的长度,返回给对方,对方则从接受的长度开始继续传输???
      

  7.   

    端口也可以相同啊,只是包头不一样嘛。
    断点需要另开文件,比如emule就有个同名的.part文件,你的思路是对的。