你为什么要通过socket发送一个dataset?如果是socket慢,首先检查你的网络通信是否正常,然后检查你的通信量或者说通信的底层是否存在问题,比如:通信量太大等。然后检查你的通信机制,注意到你用到了“同步传输”这个概念,是否这个慢表示为界面停止响应?

解决方案 »

  1.   

    我自己做过一个用Socket编程的小项目,用一个后台线程去循环侦听组播组的信息(其他用户上下线等),用主线程去接收和发送数据,速度还行,也不是很慢啊!不知道你的是什么原因。   不过我套接字编程还不是很熟悉,所以也不能提一些好点的建议。
      

  2.   

    PHY:
    1.DataSet 是已经转换成二进制的,这个应该没有关系.
    2.同步的代码我已经把它放在线程里执行了.
    hao1hao2hao3:
    我想知道怎样实现用两个线程去处理一个同步的Socket?因为是同步,在一个数据没传完之前,Soekct应该是处于忙的状态啊?
      

  3.   

    跟socket无关。你用http, ftp传输文件都是通过socket
      

  4.   

    检查你的buffer是不是设得太小了?
      

  5.   

    Buffer大小已经设置成了4096,不过我接回来的DataSet在WriteXML之后有1M多.
      

  6.   

    我用Webservice写了一个方法,传同样的DataSet,Webservice竟然比Socket还要快,真是奇怪.
      

  7.   

    我把代码帖出来,大家帮我看看.以下是服务端的代码private void SynConnet()
    {
    IPAddress ip = IPAddress.Any;
    IPEndPoint ipep = new IPEndPoint(ip, 3434);
    serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    serverSocket.Bind(ipep);
    serverSocket.Listen(20); while (Isruning)
    {
    Socket clientSocket = serverSocket.Accept(); byte[] request = new byte[5120];
    int bytesRead = clientSocket.Receive(request);
    Data msgReceived = new Data(request); Data msgToSend = new Data();
    byte[] message;
    DataSet ds;
    string sql;
    try
    {
    Chat.BLL.ChatInfo bllChatInfo = new Chat.BLL.ChatInfo();
    Chat.Model.ChatInfo modelChatInfo = new Chat.Model.ChatInfo();
    string strUser = msgReceived.strUserID;
    switch (msgReceived.cmdCommand)
    {
    case Command.Login:
    #region Login...
    //...
    #endregion
    break;
    case Command.GetFriendList:
    #region
    strUser = msgReceived.strUserID;
    //ChatEngine.GetWinFriends
    sql = "SELECT * from tableA";
    ds = Chat.DAL.DbHelperSQL.Query(sql);
    msgToSend.ds = ds;
    msgToSend.strMessage = null;
    message = msgToSend.ToByte();
    clientSocket.Send(message);
    clientSocket.Shutdown(SocketShutdown.Both);
    clientSocket.Close();
    #endregion
    break;
      
    }
    }
    catch (System.Exception ex)
    {
    this.SetMessage(ex.ToString());
    }
    }}
    以下是客户端的代码public static Data SendAndRecieve(Data msgToSend)
    {
    IPAddress ServerIp = IPAddress.Parse(WinUserClient.Properties.Settings.Default.ServerIP);
    IPEndPoint iep = new IPEndPoint(ServerIp, 3434); byte[] byteData = msgToSend.ToByte();
    Data dataRecieved; Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    try
    {
    string rmsg = "";
    System.Collections.ArrayList arrMsg = new System.Collections.ArrayList();
    socket.Connect(iep);
    socket.Send(byteData);
    int bytes = 0;
    while (true)
    {
    byte[] byteMessage = new byte[10];
    //循环执行,它会从头到尾自动接收数据给存放对象。
    //Receive的返回值是一个接收数据的字节数,必须得到该值,用以控制循环的次数和转换成字符串的字符数。                        
    bytes = socket.Receive(byteMessage);
    //或
    //bytes=newSocket.Receive(byteMessage,byteMessage.Length,0); //控制循环次数
    if (bytes <= 0)
    break;
    System.Text.Encoding encoding = System.Text.Encoding.ASCII;
    string msg = encoding.GetString(byteMessage, 0, bytes);
    rmsg = rmsg + msg;
    arrMsg.AddRange(byteMessage);
    }
    byte[] endreceive = new byte[arrMsg.Count];
    arrMsg.CopyTo(endreceive); socket.Shutdown(SocketShutdown.Both);
    socket.Close(); dataRecieved = new Data(endreceive);
    return dataRecieved;
    }
    catch (SocketException ex)
    {
    return null;
    }
    }
      

  8.   

    当客户端发送一个GetFriendList的命令过去时,服务端传回一个DATASET,就是这个过程慢.
      

  9.   

    刚才想起来上面两位兄弟说BUFFER大小设置,
    我把byte[] byteMessage = new byte[10];
    改成byte[] byteMessage = new byte[1024];
    之后,速度明显有了提升,但是还是比Webservice慢,不知道为何?
      

  10.   

    如果在局域网内的话你可以直接新建一个和要发送的DATASET的大小一样的数组做为接收缓冲区,这样会更快的!
    比如:DATASET的大小为:102400,那么你可以改成:byte[] byteMessage = new byte[102400];这样来接收,那速度会和飞一样的!
      

  11.   

    socket应该最快了吧,除了读内存.