现在好le 用的MSDN的实例 可是数据收不全啊 ,一直收不全~~ 怎么办~~
byte[] buffer = new byte[1024];
string messages = "";
while (true) { try { //IBytes 小于buffer时停止了 怎么办 int iBytes = socket.Receive(buffer, buffer.Length, 0); messages += Encoding.Default.GetString(buffer, 0, iBytes); if (iBytes <= 0 ) { break; } System.Threading.Thread.Sleep(50); } catch (Exception ex) { messages = ex.Message; } }
当数据包小于1024KB当然会不动了…
要让楼主能理解清楚的话,要说的东西太多了…
要怎样解决啊~~。。
@锈戒: 有人加QQ帮你解答了吗?哈哈。
@Firen: 额~~ 昨天有一个 要用支付宝给他钱~~ 我这支付宝还没开呢~~ 还不如给冲个话费啥的
@锈戒: …有偿解答啊…
@Firen: 是呀~~ 还是没接收完我请求的东西 哎
@锈戒: 你大致要做一个什么东西?一定要用Socket实现?
@Firen: 我要做一个查询, 接口是C++的, 返回的是jason格式的数据 ,,但我现在一直收不全
/// <summary> /// 连接服务 /// </summary> /// <param name="url"></param> /// <param name="data"></param> /// <returns></returns> public string GetContentFromUrl(string url, string data) { try { sokClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPAddress address = IPAddress.Parse(url); IPEndPoint point = new IPEndPoint(address, 8000); sokClient.Blocking = true ; sokClient.Connect(point); char[] cmgs = data.ToCharArray(); //字符串转字符数组 byte[] message = new byte[1024]; message = Encoding.Default.GetBytes(data); sokClient.Send(message); if (data.Contains("Sport_getHistoryOfDate")) //查询接口 { byte[] buffer = new byte[1024]; Int32 bytes = sokClient.Receive(buffer, buffer.Length, 0); Message = Message + Encoding.Default.GetString(buffer, 0, bytes); while (bytes > 0) { bytes = sokClient.Receive(buffer, buffer.Length, 0); Message = Message + Encoding.Default.GetString(buffer, 0, bytes); if (bytes <1024) { break; } } //threadClient = new Thread(Recivemsg); //threadClient.Start(); } else { byte[] buffer = new byte[1024]; sokClient.Receive(buffer, buffer.Length, 0); Message += Encoding.Default.GetString(buffer, 0, buffer.Length); } return Message; } catch (Exception ex) { return ex.Message; } finally { sokClient.Close(); }
@锈戒: 如果你能把完整的环境给我,我倒是可以帮你看看。
@Firen: 可以啊
@锈戒: 加我QQ好了, 550103406
这段代码有放到一个单独的线程里面么
没有 ,, 不懂线程
@锈戒: 个人认为,接受消息应该放到一个单独的线程中,让这个线程去单独监听和接受消息。
@火悬崖: 我该怎么写这个线程呢~~
@锈戒: 这是从网上找的一段代码,关于聊天室的,你看看能不能用上。
这是客户端
using System; using System.Collections.Generic; using System.Text; using System.Windows.Forms; using System.Net; using System.Net.Sockets; using System.Threading; namespace MyChatSoftClient { public partial class ClientFrm : Form { public ClientFrm() { InitializeComponent(); TextBox.CheckForIllegalCrossThreadCalls = false; } #region 显示消息和异常消息 public void ShowErr(string msg, Exception ex) { ShowMsg("-----------------begin-------------------------"); ShowMsg(msg + "" + ex.Message); ShowMsg("-----------------end -------------------------"); } public void ShowMsg(string msg) { txtShow.AppendText(msg + "\r\n"); } #endregion Socket sokClient= null; Thread threadClient = null; private void btnConnect_Click(object sender, EventArgs e) { Connecting(); } private void Connecting() { try { sokClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPAddress address = IPAddress.Parse(txtIP.Text.Trim()); IPEndPoint endpoint = new IPEndPoint(address, int.Parse(txtPort.Text.Trim())); sokClient.Connect(endpoint); threadClient = new Thread(ReciveMsg); threadClient.Start(); } catch (Exception ex) { ShowErr("", ex); } } private void ReciveMsg() { while (true) { byte[] byteMsg = new byte[1024 * 1024 * 4]; int length = sokClient.Receive(byteMsg); string strMsg = Encoding.UTF8.GetString(byteMsg, 0, length); ShowMsg(strMsg); } } } }
这是服务器的
using System; using System.Collections.Generic; using System.Text; using System.Windows.Forms; using System.Threading; using System.Net; using System.Net.Sockets; namespace MyChatSoft { public partial class ServerFrm : Form { public ServerFrm() { InitializeComponent(); TextBox.CheckForIllegalCrossThreadCalls = false; } #region 显示消息和异常消息 public void ShowErr(string msg, Exception ex) { ShowMsg("-----------------begin-------------------------"); ShowMsg(msg + "" + ex.Message); ShowMsg("-----------------end -------------------------"); } public void ShowMsg(string msg) { txtShow.AppendText(msg + "\r\n"); } #endregion private void btnStartListen_Click(object sender, EventArgs e) { StartListening(); } //负责监听端口 Socket sokWelcome = null; //负责和客户端Socket通信 Socket sokConnection = null; //负责监听 Thread threadWatchPort = null; #region 初始化并绑定监听 public void StartListening() { try { //创建IP地址 IPAddress address = IPAddress.Parse(txtIP.Text.Trim()); //创建IP节点(包含IP和端口) IPEndPoint endpoint = new IPEndPoint(address, int.Parse(txtPort.Text.Trim())); //创建监听套接字(寻址协议,流方式,TCP协议) sokWelcome = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); sokWelcome.Bind(endpoint); sokWelcome.Listen(10);//参数:指能同时处理的连接数 threadWatchPort = new Thread(WatchPort); threadWatchPort.Start(); ShowMsg("开始监听....."); } catch (Exception ex) { ShowErr("", ex); } } #endregion #region 监听客户连接请求 public void WatchPort() { while (true) { try { sokConnection = sokWelcome.Accept(); ShowMsg("监听到连接啦....."); } catch (Exception ex) { ShowErr("", ex); } break; } } #endregion private void btnSend_Click(object sender, EventArgs e) { string strMsg = txtInput.Text.Trim(); byte[] byteMsg = Encoding.UTF8.GetBytes(strMsg); sokConnection.Send(byteMsg, byteMsg.Length, SocketFlags.None); } } }
代码可能不全,我也没有找到全的,见谅啊!
好像C# 对于Sokect 有封装好的控件吧,你可以用那个,好像是叫TcpClient 的还是什么
或者可以参考这篇博文:
http://www.cnblogs.com/cailangwei/archive/2011/11/21/2258191.html
socket的io操作是阻塞的,如果接收的数据小于缓冲区的容量,那么程序会一直等待直到缓冲区被填满或者连接断开。
可以使用非阻塞的模型或者使用异步io函数。
另外,要想知道有多少已接收的数据,使用Avaliable属性即可。
我该怎么给以上代码设置非阻塞 Socket..Blocking = false ??
@锈戒: 你去网上搜一下 winsock的select模型 就有了
先把Blocking设为false
然后用轮训Poll检查socket是否可读或可写,之后再调用Recv或Send进行发送接收。
也可以用Select批量检查多个socket的可读可写状态
@realanan: 报错说 无法立即完成一个非阻止性套接字操作。
@锈戒: 这个是WSAWOURLDBLOCK错误,不是Socket异常。还是推荐你去搜索一下WinSock的非阻塞模型,这里说不清楚