这段时间一直在优化Socket通讯这块,经常和Socket打交道,现在分享给大家一个小的案例,

代码如下:

byte[] m_dataBuffer = new byte [10];
        IAsyncResult m_result;
        public AsyncCallback m_pfnCallBack ;
        private System.Windows.Forms.Button btnClear;
        public Socket m_clientSocket;

//关闭连接

void ButtonCloseClick(object sender, System.EventArgs e)
        {
            if ( m_clientSocket != null )
            {
                m_clientSocket.Close ();
                m_clientSocket = null;
            }        
            Close();
        }

//连接服务器

void ButtonConnectClick(object sender, System.EventArgs e)
        {
            // See if we have text on the IP and Port text fields
            if(textBoxIP.Text == "" || textBoxPort.Text == ""){
                MessageBox.Show("IP Address and Port Number are required to connect to the Server\n");
                return;
            }
            try
            {
                UpdateControls(false);
                // Create the socket instance
                m_clientSocket = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp );
                
                // Cet the remote IP address
                IPAddress ip = IPAddress.Parse (textBoxIP.Text);
                int iPortNo = System.Convert.ToInt16 ( textBoxPort.Text);
                // Create the end point
                IPEndPoint ipEnd = new IPEndPoint (ip,iPortNo);
                // Connect to the remote host
                m_clientSocket.Connect ( ipEnd );
                if(m_clientSocket.Connected) {
                    
                    UpdateControls(true);
                    //Wait for data asynchronously
                    WaitForData();
                }
            }
            catch(SocketException se)
            {
                string str;
                str = "\nConnection failed, is the server running?\n" + se.Message;
                MessageBox.Show (str);
                UpdateControls(false);
            }        
        }

//发送消息

void ButtonSendMessageClick(object sender, System.EventArgs e)
        {
            try
            {
                string msg = richTextTxMessage.Text;
                // New code to send strings
                NetworkStream networkStream = new NetworkStream(m_clientSocket);
                System.IO.StreamWriter streamWriter = new System.IO.StreamWriter(networkStream);
                streamWriter.WriteLine(msg);
                streamWriter.Flush();
                  
              
            }
            catch(SocketException se)
            {
                MessageBox.Show (se.Message );
            }    
        }

//等待接收数据

public void WaitForData()
        {
            try
            {
                if  ( m_pfnCallBack == null )
                {
                    m_pfnCallBack = new AsyncCallback (OnDataReceived);
                }
                SocketPacket theSocPkt = new SocketPacket ();
                theSocPkt.thisSocket = m_clientSocket;
                // Start listening to the data asynchronously
                m_result = m_clientSocket.BeginReceive (theSocPkt.dataBuffer,
                                                        0, theSocPkt.dataBuffer.Length,
                                                        SocketFlags.None,
                                                        m_pfnCallBack,
                                                        theSocPkt);
            }
            catch(SocketException se)
            {
                MessageBox.Show (se.Message );
            }

}
        public class SocketPacket
        {
            public System.Net.Sockets.Socket thisSocket;
            public byte[] dataBuffer = new byte[1024];
        }
      
        public  void OnDataReceived(IAsyncResult asyn)
        {
            try
            {
                SocketPacket theSockId = (SocketPacket)asyn.AsyncState ;
                int iRx  = theSockId.thisSocket.EndReceive (asyn);
                char[] chars = new char[iRx +  1];
                System.Text.Decoder d = System.Text.Encoding.UTF8.GetDecoder();
                int charLen = d.GetChars(theSockId.dataBuffer, 0, iRx, chars, 0);
                System.String szData = new System.String(chars);
                richTextRxMessage.Text = richTextRxMessage.Text + szData;
                WaitForData();
            }
            catch (ObjectDisposedException )
            {
                System.Diagnostics.Debugger.Log(0,"1","\nOnDataReceived: Socket has been closed\n");
            }
            catch(SocketException se)
            {
                MessageBox.Show (se.Message );
            }
        }    
        private void UpdateControls( bool connected )
        {
            buttonConnect.Enabled = !connected;
            buttonDisconnect.Enabled = connected;
            string connectStatus = connected? "Connected" : "Not Connected";
            textBoxConnectStatus.Text = connectStatus;
        }
        void ButtonDisconnectClick(object sender, System.EventArgs e)
        {
            if ( m_clientSocket != null )
            {
                m_clientSocket.Close();
                m_clientSocket = null;
                UpdateControls(false);
            }
        }
       //----------------------------------------------------    
       // This is a helper function used (for convenience) to
       // get the IP address of the local machine
          //----------------------------------------------------
          String GetIP()
       {       
               String strHostName = Dns.GetHostName();
        
               // Find host by name
               IPHostEntry iphostentry = Dns.GetHostByName(strHostName);
        
               // Grab the first IP addresses
               String IPStr = "";
               foreach(IPAddress ipaddress in iphostentry.AddressList){
                IPStr = ipaddress.ToString();
                   return IPStr;
               }
               return IPStr;
       }

转载于:https://www.cnblogs.com/kevinGao/archive/2011/12/20/2776051.html

[置顶] 【C#】 Socket通讯客户端程序相关推荐

  1. 请教如何改善C#中socket通信机客户端程序的健壮性

    请教如何改善c#中socket通信机客户端程序的健壮性 我是做socket的新手,最近做了一个socket客户端程序,连接server的时候,如果server存在,并且允许连接的话,程序无错,正常执行 ...

  2. 窗口置顶(置于桌面所有程序之上)VC/MFC 怎么将窗口置顶

    软件界面全屏显示后,需要把窗体置于其他桌面程序之上,但总是置于其他弹出框之下,会造成用户忽略了导致用户不明什么原因. 百度查了好多方法总是失败. 后来查到了CSND的一个帖子http://bbs.cs ...

  3. [置顶] Java Socket实战之一 单线程通信

    本文地址:http://blog.csdn.net/kongxx/article/details/7259436 现在做Java直接使用Socket的情况是越来越少,因为有很多的选择可选,比如说可 ...

  4. [置顶] Android仿人人客户端(v5.7.1)——应用主界面之左侧面板UI实现

    转载请标明出处:http://blog.csdn.net/android_ls/article/details/8749188  声明:仿人人项目,所用所有图片资源都来源于其它Android移动应用, ...

  5. Qt笔记-窗口程序在任务栏中隐藏及永久置顶

    这里主要是因为想搞个水印的程序. 感觉视频加水印比较麻烦,不如自己写个加水印的程序. 如下的效果: 这里有两点要注意,一个是在任务栏中隐藏: 主要是 Qt::Tool setWindowFlags(Q ...

  6. 窗口置顶器 TopWindow

    N年前写的陈年老物...但是却很有用 最近改进下,不用全局钩子了,用全局热键. 对管理员权限创建的程序窗口,本程序也需要管理员权限才能对其操作 Ctrl + F2 置顶当前激活窗口 Ctrl + F3 ...

  7. [置顶] C#中Socket服务端代码分享

    最近在对项目中Socket通讯中的服务端代码进行优化,保证能接受尽可能多的客户端的连接,并且不会丢掉连接,不会掉数据包.经过一段时间的反复测试和修改,终于达到了这一要求.服务端代码采用了异步通讯的方式 ...

  8. 微信小程序与Node服务器 Socket通讯

    Socket通讯概述 多应用在软件开发中两个应用程序之间的通讯,俗称Socket通讯. 用于在两个的应用程序之间相互通信,socket是属于TCP\IP的上一层.最早出现在UNIX系统中,是UNIX系 ...

  9. linux c socket 服务器 客户端 简单通讯

    1.socket简介 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket. Socket的英文原义是"孔"或"插座".作为 ...

最新文章

  1. 2、Ktor学习-自动重新加载;
  2. [scala-spark]7. list 与 map
  3. 了解下广告计费模式CPC、CPA和CPM
  4. Java程序猿面试体会,还没找到工作的“猿猿们”看过来!
  5. iframe 父页面与子页面之间的方法、属性的相互调用
  6. xmp文件格式怎么导入ps?ACR预设安装方法
  7. 【linux】linux下修改鼠标指针
  8. 怎么把PDF文件拆分开来?教你两种拆分方法
  9. 水逆了一整年的王源,2020年年初能靠《大主宰》翻身吗?
  10. 【C基础】11 指针与数组
  11. EduSoho网校系统产品更新:PPT动画转码
  12. 百度二年级手工机器人_小学二年级手工科技制作方案
  13. 麻省理工成立计算机学院,麻省理工学院斥资10亿美元建新计算机学院
  14. TigerGraph首将模式匹配与高效图计算相结合,为欺诈检测、网络安全保护、人工智能等应用增砖加瓦!
  15. c语言九三字符串的字母个数,C语言判断闰年和平年
  16. 便携式打印机连接蓝牙方式
  17. 代驾行业开发APP需要注意哪些
  18. js实现简单的掷骰子效果
  19. 这些比较前沿的设计网站,你知道吗?
  20. c语言字符数组英文倒序输出,字符串中的每个单词倒序输出问题

热门文章

  1. Mongoose源码剖析:外篇之web服务器
  2. linux qt creator git,Building Qt Creator from Git/zh
  3. python爬取网页上的特定链接_python3下scrapy爬虫(第三卷:初步抓取网页内容之抓取网页里的指定数据)...
  4. php笔试判断题,php笔试题收藏
  5. 远程桌面计算机让输入密码,解决Windows远程桌面连接每次都提示输入密码的问题...
  6. 刷新序号公共方法 公司内部用
  7. html中看到php代码_如何在HTML中嵌入PHP代码
  8. assign深拷贝_经典前端面试题: Object.assign 是浅拷贝还是深拷贝?实现深拷贝的方法有哪些?...
  9. 奇数页分节符什么意思_删除分节符问题
  10. php windows应用开发,开发老手谈Windows平台的PHP应用开发