首页 新闻 会员 周边

C# Socket

0
悬赏园豆:80 [已解决问题] 解决于 2014-06-26 13:44

现在好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; } }
SSS.M.AAA的主页 SSS.M.AAA | 初学一级 | 园豆:5
提问于:2014-06-24 19:31
< >
分享
最佳答案
0

当数据包小于1024KB当然会不动了…

要让楼主能理解清楚的话,要说的东西太多了…

收获园豆:50
Firen | 大侠五级 |园豆:5385 | 2014-06-25 11:29

   要怎样解决啊~~。。

SSS.M.AAA | 园豆:5 (初学一级) | 2014-06-25 11:31

@锈戒: 有人加QQ帮你解答了吗?哈哈。

Firen | 园豆:5385 (大侠五级) | 2014-06-25 12:13

@Firen:   额~~  昨天有一个  要用支付宝给他钱~~  我这支付宝还没开呢~~   还不如给冲个话费啥的

SSS.M.AAA | 园豆:5 (初学一级) | 2014-06-25 16:27

@锈戒: …有偿解答啊…

Firen | 园豆:5385 (大侠五级) | 2014-06-25 16:57

@Firen:   是呀~~   还是没接收完我请求的东西  哎

SSS.M.AAA | 园豆:5 (初学一级) | 2014-06-25 17:00

@锈戒: 你大致要做一个什么东西?一定要用Socket实现?

Firen | 园豆:5385 (大侠五级) | 2014-06-25 17:50

@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();
        }

 

SSS.M.AAA | 园豆:5 (初学一级) | 2014-06-25 17:54

@锈戒: 如果你能把完整的环境给我,我倒是可以帮你看看。

Firen | 园豆:5385 (大侠五级) | 2014-06-25 18:01

@Firen:     可以啊

SSS.M.AAA | 园豆:5 (初学一级) | 2014-06-25 18:01

@锈戒: 加我QQ好了, 550103406

Firen | 园豆:5385 (大侠五级) | 2014-06-25 18:06
其他回答(3)
0

这段代码有放到一个单独的线程里面么

收获园豆:20
火悬崖 | 园豆:434 (菜鸟二级) | 2014-06-24 20:01

   没有 ,,  不懂线程 

支持(0) 反对(0) SSS.M.AAA | 园豆:5 (初学一级) | 2014-06-24 20:02

@锈戒: 个人认为,接受消息应该放到一个单独的线程中,让这个线程去单独监听和接受消息。

支持(0) 反对(0) 火悬崖 | 园豆:434 (菜鸟二级) | 2014-06-24 20:05

@火悬崖:   我该怎么写这个线程呢~~

支持(0) 反对(0) SSS.M.AAA | 园豆:5 (初学一级) | 2014-06-24 20:07

@锈戒: 这是从网上找的一段代码,关于聊天室的,你看看能不能用上。

这是客户端

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);
        }
    }
}

代码可能不全,我也没有找到全的,见谅啊!

支持(0) 反对(0) 火悬崖 | 园豆:434 (菜鸟二级) | 2014-06-24 20:11
0

好像C# 对于Sokect 有封装好的控件吧,你可以用那个,好像是叫TcpClient 的还是什么

或者可以参考这篇博文:

http://www.cnblogs.com/cailangwei/archive/2011/11/21/2258191.html

Sake.Z.L.B | 园豆:262 (菜鸟二级) | 2014-06-24 21:36
0

socket的io操作是阻塞的,如果接收的数据小于缓冲区的容量,那么程序会一直等待直到缓冲区被填满或者连接断开。

可以使用非阻塞的模型或者使用异步io函数。

另外,要想知道有多少已接收的数据,使用Avaliable属性即可。

收获园豆:10
realanan | 园豆:232 (菜鸟二级) | 2014-06-25 08:34

   我该怎么给以上代码设置非阻塞  Socket..Blocking = false   ??

支持(0) 反对(0) SSS.M.AAA | 园豆:5 (初学一级) | 2014-06-25 08:48

@锈戒: 你去网上搜一下 winsock的select模型 就有了

支持(0) 反对(0) realanan | 园豆:232 (菜鸟二级) | 2014-06-25 08:51

先把Blocking设为false

然后用轮训Poll检查socket是否可读或可写,之后再调用Recv或Send进行发送接收。

也可以用Select批量检查多个socket的可读可写状态

支持(0) 反对(0) realanan | 园豆:232 (菜鸟二级) | 2014-06-25 08:56

@realanan:   报错说 无法立即完成一个非阻止性套接字操作。

支持(0) 反对(0) SSS.M.AAA | 园豆:5 (初学一级) | 2014-06-25 09:54

@锈戒: 这个是WSAWOURLDBLOCK错误,不是Socket异常。还是推荐你去搜索一下WinSock的非阻塞模型,这里说不清楚

支持(0) 反对(0) realanan | 园豆:232 (菜鸟二级) | 2014-06-25 10:37
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册