本文主要是以代码为主。.NET技术交流群 199281001 .欢迎加入。

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

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

  1. ManualResetEvent reviceManager = new ManualResetEvent(false);
  1. 1 public void args_Completed(object sender, SocketAsyncEventArgs e)
  2. 2 {
  3. 3 //监听完成客户端的请求,一但监听到返回新的套接字
  4. 4 var clientSocket = e.AcceptSocket;
  5. 5
  6. 6 if (clientSocket == null) return;
  7. 7 //启动线程获取客户端发来的消息
  8. 8 //这部分为接收消息
  9. 9 var t = new Thread(GetClientMsg);
  10. 10 //设置线程为后台线程
  11. 11 t.IsBackground = true;
  12. 12 //启动线程
  13. 13 t.Start(clientSocket);
  14. 14 //显示信息
  15. 15 ShowMsg(clientSocket.RemoteEndPoint + "上线了");
  16. 16 //将事件状态设置为终止状态,允许一个或多个等待线程继续
  17. 17 manager.Set();
  18. 18 }

建议对照 C# Socket基础(一)之启动异步服务侦听 来看。

  1. 1 private void GetClientMsg(object socket)
  2. 2 {
  3. 3 var socketClient = socket as Socket;
  4. 4 if (socketClient == null) return;
  5. 5 while (true)
  6. 6 {
  7. 7 try
  8. 8 {
  9. 9 reviceManager.Reset();
  10. 10 var bytes = new byte[1024 * 1024 * 4];
  11. 11 var receiveArgs = new SocketAsyncEventArgs();
                //设置缓冲区
  12. 12 receiveArgs.SetBuffer(bytes, 0, bytes.Length);
  13. 13 receiveArgs.Completed += receiveArgs_Completed;
                //开始异步接收
  14. 14 socketClient.ReceiveAsync(receiveArgs);
  15. 15 reviceManager.WaitOne();
  16. 16 }
  17. 17 catch (Exception ex)
  18. 18 {
  19. 19
  20. 20 //显示异常消息
  21. 21 ShowMsg(ex.Message);
  22. 22 }
         }
  23.  
  24. }

接收消息完成回调事件

  1. 1 void receiveArgs_Completed(object sender, SocketAsyncEventArgs e)
  2. 2 {
  3. 3 var socketClient = sender as Socket;
  4. 4 var bytes = e.Buffer;
  5. 5 ShowMsg(socketClient.RemoteEndPoint + "说:" + System.Text.Encoding.UTF8.GetString(bytes));
  6. 6 reviceManager.Set();
  7. 7 }
 
 

又与大家见面,看不懂的随时问。

  1. 1 private Thread threadClient;//客户端线程
  2. 2 private Socket socketClient;//客户端套接字
  3. 3 /// <summary>
  4. 4 /// 创建套接字连接到服务端
  5. 5 /// </summary>
  6. 6 private void CreateSocketConnection()
  7. 7 {
  8. 8 try
  9. 9 {
  10. 10 //创建一个客户端的套接字 参数(IP4寻址协议,流连接方式,TCP数据传输协议)
  11. 11 socketClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  12. 12 //获取IP
  13. 13 IPAddress address = IPAddress.Parse(txtIP.Text.Trim());
  14. 14 //创建一个包含IP和端口号的网络节点对象
  15. 15 IPEndPoint ipPoint = new IPEndPoint(address, Convert.ToInt32(txtPort.Text.Trim()));
  16. 16 // 连接服务端
  17. 17 socketClient.Connect(ipPoint);
  18. 18 //创建一个线程,接受服务端发来的数据
  19. 19 threadClient = new Thread(ReceiveService);
  20. 20 //设置线程为后台线程
  21. 21 threadClient.IsBackground = true;
  22. 22 //启动线程连接服务端
  23. 23 threadClient.Start();
  24. 24   //显示消息
  25. 25 ShowMsg("与服务器" + txtIP.Text.Trim() + ":" + txtPort.Text + "成功建立连接!");
  26. 26
  27. 27 }
  28. 28 catch (Exception)
  29. 29 {
  30. 30
  31. 31 ShowMsg(txtIP.Text.Trim() + ":" + txtPort.Text + "服务器未启动!");
  32. 32
  33. 33 }
  34. 34
  35. 35 }

客户端接收消息

  1. private void ReceiveService()
  2. {
  3. while (true)
  4. {
  5. try
  6. {
  7. int num = -1;
  8. var b = new byte[1024 * 1024 * 4];
  9. int length = socketClient.Receive(b);
  10. var msg = System.Text.Encoding.UTF8.GetString(b,0,length);
  11. ShowMsg(socketClient.RemoteEndPoint.ToString() + "对您: " + msg);
  12.  
  13. }
  14. catch (Exception ex)
  15. {
  16. ShowMsg(ex.Message);
  17. break;
  18.  
  19. }
  20. }
  21. }
  1. 1 private void ShowMsg(string msg)
  2. 2 {
  3. 3 txtConneMsg.AppendText("\r\n" + DateTime.Now + "\r\n\r\n" + msg + "\r\n");
  4. 4 }

客户端:

服务器:

客户端接收到消息:

private Socket socketClient;//客户端套接字,关于实例化请参考C# Socket基础(三)之客户端连接服务器和接收消息

客户端发送消息

  1. 1 /// <summary>
  2. 2 /// 发送数据到服务端
  3. 3 /// </summary>
  4. 4 private void Send()
  5. 5 {
  6. 6 if (socketClient == null)
  7. 7 {
  8. 8
  9. 9 ShowMsg("服务器未启动!");
  10. 10 return;
  11. 11 }
  12. 12 byte[] b = System.Text.Encoding.UTF8.GetBytes(txtSend.Text.Trim());
  13. 13 //客户端向服务器发送消息
  14. 14 socketClient.Send(b);
  15. 15 //清空文本
  16. 16
  17. 17 ShowMsg("您对" + socketClient.RemoteEndPoint.ToString() + "说:" + txtSend.Text.Trim());
  18. 18 txtSend.Text = "";
  19. 19 }

关于  ShowMsg(string message);是自定义的函数,在C# Socket基础(一)之启动异步服务侦听

好了,到这里就要告一段落了,实现了基本的客户端和服务器采用TCP协议通信。

看看效果吧:

客户端:

服务器:

C# Socket基础(一)之启动异步服务监听的更多相关文章

  1. Socket基础之-启动异步服务侦听

    Socket网络编程第一篇: 本文主要是以代码为主. .NET技术交流群 199281001 .欢迎加入 1 //负责监听的套接字 private Socket socketServer; //通知一 ...

  2. 用nodejs搭建一个简单的服务监听程序

    作为一个从业三年左右的,并且从事过半年左右PHP开发工作的前端,对于后台,尤其是对以js语言进行开发的nodejs,那是比较有兴趣的,虽然本身并没有接触过相关的工作,只是自己私下做的一下小实验,但是还 ...

  3. 重启eclips后启动项目出现监听文件找不到

    重启eclips后启动项目出现监听文件找不到 问题: 重启eclips后启动项目出现Error configuring application listener of class com.thinkg ...

  4. Linux对外提供服务 网络操作 端口操作 1.开启服务监听端口 2.设置防火墙,放行访问端口的包 iptables&netfilter 四表五链和通堵策略

    主题: Linux服务器上软件提供服务 1.网络操作 2.端口操作 1.网络操作 本机必须能够ping通目标主机(本地虚拟机或者远程主机) 2.端口操作 1.开启服务监听端口 2.设置防火墙,放行访问 ...

  5. Oracle启动两个监听

    接上篇:Oracle服务器修改IP后 Oracle服务器更换IP后,办公网络里面可以正常访问了,外地的同事,连了vpn 也可以访问,以为可以收工回家,突然又有同事过来说,机房的服务器ping不通新的i ...

  6. mysql部署后无法远程连接的原因(错误代码10061),服务监听127.0.0.1和0.0.0.0的区别

    在Ubuntu上部署mysql服务并添加了一个非root用户后,发现无法远程连接, Navicat连接mysql出现2003——can't connect to mysql server on loc ...

  7. windows 启动关闭Oracle监听和服务

    经常要用数据库,让他自己启动的话,开机太慢,所以用命令启动方便点.    1.开启:     在运行中输入cmd,进入控制台,lsnrctl start回车,提示启动监听成功后 net start O ...

  8. Nginx服务监听端口修改启动bug

    监听的端口从80 修改到其他端口出现启动不起来问题. 解决方案如下: yum install policycoreutils-python sudo cat /var/log/audit/audit. ...

  9. Yii2.0 安装yii2-queue并在Linux启动守护进程监听消息

    一.什么是yii2-queue? Yii2-queue是Yii2.0 PHP框架下一个消息队列拓展插件,支持基于DB, Redis, RabbitMQ, AMQP, Beanstalk 和 Gearm ...

随机推荐

  1. tcpdump dns包(linux高性能编程读书笔记2)

      tcpdump -i eth0 -nt -s 500 port domain host -t A www.baidu.com www.baidu.com is an alias for www.a ...

  2. Python 学习笔记(五)杂项

    1. Assert assert len(unique_characters) <= 10, 'Too many letters' #…等价于: if len(unique_characters ...

  3. jq 弹出窗口

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  4. ssh-keygen -t rsa -f cloud.key ssh -i cloud.key <username>@<instance_ip>

  5. django1.77+mod_wsgi+python2.79+apache2.24 在阿里云centos部署攻略

    心平气和的记录一下今天 踩的坑以防万一 以后还踩 首先我今天的平台是在 阿里云上的一台纯净版的 centos6.5 64位主机上进行的 首先装python2.7 去官网下载python2.7安装包 然 ...

  6. c++面试题总结(2)

    1. C中static有什么作用 (1)隐藏. 当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性,故使用static在不同的文件中定义同名函数和同名变量,而不必担心命 ...

  7. iPhone 6/6 Plus 出现后,如何改进工作流以实现一份设计稿支持多个尺寸?

    iPhone 6/6 Plus 出现后,如何改进工作流以实现一份设计稿支持多个尺寸? 2014-12-05 09:33 编辑: suiling 分类:iOS开发 来源:知乎(pigtwo)  2 22 ...

  8. 【JSON】JSON字符串的操作(不断积累中)

    一.JS遍历JSON串 示例01 目标:返回的JSON串中,一个Key对应的Value是一个数组(若在Java程序中,是一个List). 现在要求获取每个数组中的第一个对象元素中的name属性的值. ...

  9. Jtemplates 基本语法

    jTemplates是一个基于JQuery的模板引擎插件,功能强大,有了他你就再不用为使用JS绑定数据集时发愁了. 首先送上jTtemplates的官网地址:http://jtemplates.tpy ...

  10. Android_UI_点击按钮切换背景效果实现

    实现按钮按下和释放,按钮背景图片相应切换效果的方法这里介绍两种,一种是在代码里实现,另一种是在xml文件里实现 一.在xml文件里 首先现在layout的一个xml文件下定义Button如下所示: [ ...