1,客户端给服务器发送文件的时候,如果客户端发的是1.TXT,服务器端如何在接收此文件之前就知道原始文件名1.TXT?是先发送文件名1.TXT,然后再发文件流吗?如果是这样,像QQ那样发送多个文件应该怎样处理?2,发送类或结构体,有没有发送方和接收方的代码借小弟参考一下?3,像QQ软件,多数时候收发消息都是点对点的,也就是A客户端直接发到B客户端,很少需要服务器中转,这种情况是怎样实现的?是每个客户端扮演两个角色,既是服务器又是客户端吗??
刚学SOKET,项目中已经实现了异步收发文本消息,但对项目以后的需求,也就是以上问题不是很了解,希望大鸟给予帮助

解决方案 »

  1.   

    1,客户端给服务器发送文件的时候,如果客户端发的是1.TXT,服务器端如何在接收此文件之前就知道原始文件名1.TXT?是先发送文件名1.TXT,然后再发文件流吗?如果是这样,像QQ那样发送多个文件应该怎样处理? 建立文件头结构体..
    2 发送类或结构体,有没有发送方和接收方的代码借小弟参考一下? 
     public struct SendFileByte
            {
                public string FileName;  //文件名
                public uint FileSize;   //文件总大小       
                public byte[] Guid;  //文件分成多个包使用 
                  publci ushort PakcIndex;  //包索引
                  public ushort PackSize;  //数据大小 
                  public ushort CRC16;  //本包数据验效
                public byte[] FileDate;  //数据区
            }
    3 这个不好实现...要过NAT..
      

  2.   

    1,客户端给服务器发送文件的时候,如果客户端发的是1.TXT,服务器端如何在接收此文件之前就知道原始文件名1.TXT?是先发送文件名1.TXT,然后再发文件流吗?如果是这样,像QQ那样发送多个文件应该怎样处理? 如果你传多个文件的话,是要先将文件名传过去,在客户端建立文件,然后以流的方式写进文件中。
    把所有你要传的文件名传过去,建好文件后,以流的方式写进文件中,其中,你要获得文件的大小,来判断文件是否传完,这个大小指一个文件的大小。在传输中,你最好要飞片传输,因为网络传输,是要一定的流量限制,默认为1024b.2,发送类或结构体,有没有发送方和接收方的代码借小弟参考一下?  
    这个你去网上找找吧。。建议:你可以将文件的大小,名称放到一个容器中,这样方便你使用。3,像QQ软件,多数时候收发消息都是点对点的,也就是A客户端直接发到B客户端,很少需要服务器中转,这种情况是怎样实现的?是每个客户端扮演两个角色,既是服务器又…点对点的发送,需要建立socket,分别侦听你要接收文件的那一方 。。如果有文件传来,那么你就接收,并做处理,如果扮演两者的话,两者都要建立socket ..分别侦听对方的端口。
      

  3.   

    支持楼上.
    QQ发送消息 好像是SOCKET UDP方式:和TCP套接字一样,UDP套接字也通过socket( )函数创建,不同的是UDP套接字可以通过一个套接字描述符在不同的主机之间发送和接收报文
      

  4.   

    我是楼主感谢几位赐教关于第一个问题,过程我都明白,只是不知道代码上怎样实现,比如:先发一个描述文件信息的结构体,先把这个结构体传过去,然后再传文件,这中间,我怎样能知道A结构体是对应A文件的?或者当双方正在聊天的时候,在文本消息往返于客户端和服务端的时候,客户端突然向服务端发了一个结构体,这时怎样能区别这个结构体不是文本消息?
    第三个问题,其实我想问的是,用QQ即时通讯的时候,是不是多数时间每个人的QQ软件都在扮演着服务端和客户端的双重角色??再追加一个问题,是刚刚遇到的,一般断开SOKET连接,是由客户端断开还是由服务端断开?我想由客户端断开,为什么
    socket.LinkObject.Shutdown(System.Net.Sockets.SocketShutdown.Both);
                            socket.LinkObject.Close();
                            socket.LinkObject.Disconnect(false);
    这样都不行?
    请告诉我客户端断开连接和服务器断开连接分别应该怎样做,多谢
      

  5.   


    1、其实不管什么消息,你都应该为其设计一个协议,告诉对方这个数据包的含义。2、QQ对话的时候用的是UDP协议,无所谓服务端和客户端的说法。3、socket.LinkObject.Shutdown(System.Net.Sockets.SocketShutdown.Both); 
                            socket.LinkObject.Close(); 
                            socket.LinkObject.Disconnect(false); //这行是多余的,删掉。
      

  6.   

    感谢楼上1,所谓的协议,是不是指这样:每条信息如果第一个字符是1,则此包是文本消息,如果第一个字符是2,则此包是发送的文件.可以这样理解吗?比如:"1;ABC"是发送一个ABC的字符串,那我的问题是:我如果想发送一个文件,SOCKET.SEND的参数应该怎样写?也就是"2;后面是什么?"2,意思也就是说QQ消息是不可靠的,有可能丢包的?那他是如何尽量防止丢包的呢??3,明白了多谢.还有个问题是,当SERVER和CLIENT建立起连接后,如果想断开连接,一般是由服务器断开还是由客户端来断开?服务器和客户端断开连接的代码分别是什么?
      

  7.   

    补充一下第三个问题,在什么情况下用心跳包来维持连接?什么情况下不用心跳包?
    在非正常断开连接尤其是物理设备上的时候,网络拥挤等情况心跳就有用了,tcp/ip我很少不用心跳包
      

  8.   

    补充一下第三个问题,在什么情况下用心跳包来维持连接?什么情况下不用心跳包?
    在非正常断开连接尤其是物理设备上的时候,网络拥挤等情况心跳就有用了,tcp/ip我很少不用心跳包
      

  9.   


    1、可以这样想,具体的你可以去看看我的Blog:http://wzd24.cnblogs.com
    2、是的,一般来说UDP通讯接收端会在收到信息后发送一个确认消息给发送端,如果发送端在指定的时间内没有收到确认消息的话,就重新发送信息。
    3、这其实不是一个问题,两端都可以断开连接,需要哪端断开连接是看业务需求而决定的,而且断开代码都是一样的。
      

  10.   

    不知道有没有专门的soket编程教程