socket 传输速度很慢? 你为什么要通过socket发送一个dataset?如果是socket慢,首先检查你的网络通信是否正常,然后检查你的通信量或者说通信的底层是否存在问题,比如:通信量太大等。然后检查你的通信机制,注意到你用到了“同步传输”这个概念,是否这个慢表示为界面停止响应? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我自己做过一个用Socket编程的小项目,用一个后台线程去循环侦听组播组的信息(其他用户上下线等),用主线程去接收和发送数据,速度还行,也不是很慢啊!不知道你的是什么原因。 不过我套接字编程还不是很熟悉,所以也不能提一些好点的建议。 PHY:1.DataSet 是已经转换成二进制的,这个应该没有关系.2.同步的代码我已经把它放在线程里执行了.hao1hao2hao3:我想知道怎样实现用两个线程去处理一个同步的Socket?因为是同步,在一个数据没传完之前,Soekct应该是处于忙的状态啊? 跟socket无关。你用http, ftp传输文件都是通过socket 检查你的buffer是不是设得太小了? Buffer大小已经设置成了4096,不过我接回来的DataSet在WriteXML之后有1M多. 我用Webservice写了一个方法,传同样的DataSet,Webservice竟然比Socket还要快,真是奇怪. 我把代码帖出来,大家帮我看看.以下是服务端的代码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; }} 当客户端发送一个GetFriendList的命令过去时,服务端传回一个DATASET,就是这个过程慢. 刚才想起来上面两位兄弟说BUFFER大小设置,我把byte[] byteMessage = new byte[10];改成byte[] byteMessage = new byte[1024];之后,速度明显有了提升,但是还是比Webservice慢,不知道为何? 如果在局域网内的话你可以直接新建一个和要发送的DATASET的大小一样的数组做为接收缓冲区,这样会更快的!比如:DATASET的大小为:102400,那么你可以改成:byte[] byteMessage = new byte[102400];这样来接收,那速度会和飞一样的! socket应该最快了吧,除了读内存. 求关于.NET的错误解决方案 求助!!!高手!!! 这样的软件开发收多少钱合适啊? 用什么函数,去掉左边空格或者右边空格? public 修饰的方法无法的找到,请帮忙解决一下 请大家帮忙分析一下这个网页 C#调用COM+老出错。。。真愁人啊! 日本人投降了。 如何让DataGridBoolColumn 在每个单元格中只包含两个状态的复选框即:已选中(true)、未选中(false),而没有和 DBNull.Value? sql 语句的写法 用oledbcommand执行sql语句更新access数据库不成功! 请教listView1.SelectedItems为什么老出错?
1.DataSet 是已经转换成二进制的,这个应该没有关系.
2.同步的代码我已经把它放在线程里执行了.
hao1hao2hao3:
我想知道怎样实现用两个线程去处理一个同步的Socket?因为是同步,在一个数据没传完之前,Soekct应该是处于忙的状态啊?
{
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;
}
}
我把byte[] byteMessage = new byte[10];
改成byte[] byteMessage = new byte[1024];
之后,速度明显有了提升,但是还是比Webservice慢,不知道为何?
比如:DATASET的大小为:102400,那么你可以改成:byte[] byteMessage = new byte[102400];这样来接收,那速度会和飞一样的!