Socket网络编程第一篇:

本文主要是以代码为主。

.NET技术交流群 199281001 .欢迎加入

 1       //负责监听的套接字
private Socket socketServer;
     //通知一个或多个正在等待的线程已发生事件。
    ManualResetEvent manager = new ManualResetEvent(false);
2 /// <summary>
3 /// 启动服务
4 /// </summary>
5 private void CreateSocketService()
6 {
7 try
8 {
9 //获取IP
10 var address = IPAddress.Parse(txtIP.Text.Trim());
11 //创建一个包含ip port 的网络节点对象
12 var ipPoint = new IPEndPoint(address, Convert.ToInt32(txtPort.Text.Trim()));
13 //创建一个套接字socket,参数(IP4寻址协议,流式连接,使用TCP协议传输数据)
14 socketServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
15 //将负责监听的套接字绑定到唯一的IP和端口上
16 socketServer.Bind(ipPoint);
17 //设置监听队列的长度
18 socketServer.Listen(100);
19 //线程开始监听客户端的请求
20 threadService = new Thread(StartSocketService);
21 //设置线程为后台线程
22 threadService.IsBackground = true;
23 //启动线程
24 threadService.Start();
25 //显示消息
26 ShowMsg("服务器监听开启成功!");
27 28
29 }
30 catch (Exception e)
31 {
32
33 ShowMsg(e.Message);
34 }
35 }
 1        /// <summary>
2 /// 启动服务监听
3 /// </summary>
4 private void StartSocketService()
5 {
6 while (true)
7 {
8 try
9 {
              //将事件状态设置为非终止状态,导致线程阻止
10 manager.Reset();
11 //开始监听客户端的连接请求
12 var args = new SocketAsyncEventArgs();
13 args.Completed += args_Completed;
14 socketServer.AcceptAsync(args);
              //阻止当前线程,直到当前 WaitHandle 收到信号。
15 manager.WaitOne();
16 }
17 catch (Exception ex)
18 {
19
20 ShowMsg(ex.Message);
21 break;
22 }
23 }
24 }
1         void args_Completed(object sender, SocketAsyncEventArgs e)
2 {
3 //监听完成客户端的请求,一但监听到返回新的套接字
4 var clientSocket = e.AcceptSocket;
5 //启动线程获取客户端发来的消息
6 if (clientSocket == null) return;
         //将事件状态设置为终止状态,允许一个或多个等待线程继续。
         manager.Set();
7 //开始接受消息.......
8 }
1    private void ShowMsg(string msg)
2 {
3 //显示消息
4 txtConneMsg.AppendText("\r\n" + DateTime.Now + "\r\n\r\n" + msg + "\r\n");
5 }

ok 服务侦听就启动成功了,正等待客户端连接。

待续......

作者:gaobing
 
 
提示:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

最新文章

  1. C#通过WMI的wind32 的API函数实现msinfo32的本地和远程计算机的系统日志查看功能
  2. 利用PhantomJS进行网页截屏,完美解决截取高度的问题
  3. EXISTS语句
  4. Swift 通用类型和通用函数 | Generic type and function
  5. puppet学习笔记(二)
  6. 学渣告诉你,到底神马是傅里叶级数!转自 新浪@工程师style
  7. Android性能优化典范 - 第5季
  8. 设置Eclipse中文API提示信息
  9. JS 改变input 输入框样式
  10. MySQL 5.6.22 win32 zip版安装
  11. DLL模块例2:使用__declspec(dllexport)导出函数,extern &quot;C&quot;规范修饰名称,隐式连接调用dll中函数
  12. 【转】一大波实用的 bash 别名和函数
  13. libunistring-0.9.9
  14. xmanagr 注册机执行ubuntu 桌面程序,ubuntu无需安装 桌面环境
  15. 深入理解 Java 虚拟机之学习笔记(1)
  16. C++基础知识:操作符重载
  17. 20155302 Exp2 后门原理与实践
  18. centos7: vsftpd安装及启动
  19. Spring,Hibernate 集成解决多hbm.xml文件繁多的方案
  20. openvpn-在Linux中安装和配置OpenVPN Server的最简便方法!(转)

热门文章

  1. com.opensymphony.xwork2.util.logging.jdk.JdkLogger info 错误
  2. 《温故而知新》JAVA基础四
  3. 如何插入谷歌地图并获取javascript api 秘钥--Google Maps API error: MissingKeyMapError
  4. wrk 压测中请求无法响应问题解决过程
  5. idea新建一个spring项目,图解
  6. js的缓存
  7. 3D打印GCODE文件学习(二)
  8. CSS 选择器 选择 拥有多个类名 的元素
  9. 同时使用n和nvm踩到的坑
  10. [Leetcode 90]求含有重复数的子集 Subset II