C# Socket基础(一)之启动异步服务监听
本文主要是以代码为主。.NET技术交流群 199281001 .欢迎加入。
//通知一个或多个正在等待的线程已发生事件。
ManualResetEvent manager = new ManualResetEvent(false);
1 //负责监听的套接字
private Socket socketServer;
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 //设置监听队列的长度,同时100个队列
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;
//开始接受消息.......
7 //该函数未写完,第二篇补全
8 }
1 void ShowMsg(string message)
2 {
3 //显示消息
4 txtConneMsg.AppendText("\r\n" + DateTime.Now + "\r\n\r\n" + message + "\r\n");
5 }
ok 服务监听就启动成功了,正等待客户端连接。
ManualResetEvent reviceManager = new ManualResetEvent(false);
1 public void args_Completed(object sender, SocketAsyncEventArgs e)
2 {
3 //监听完成客户端的请求,一但监听到返回新的套接字
4 var clientSocket = e.AcceptSocket;
5
6 if (clientSocket == null) return;
7 //启动线程获取客户端发来的消息
8 //这部分为接收消息
9 var t = new Thread(GetClientMsg);
10 //设置线程为后台线程
11 t.IsBackground = true;
12 //启动线程
13 t.Start(clientSocket);
14 //显示信息
15 ShowMsg(clientSocket.RemoteEndPoint + "上线了");
16 //将事件状态设置为终止状态,允许一个或多个等待线程继续
17 manager.Set();
18 }
建议对照 C# Socket基础(一)之启动异步服务侦听 来看。
1 private void GetClientMsg(object socket)
2 {
3 var socketClient = socket as Socket;
4 if (socketClient == null) return;
5 while (true)
6 {
7 try
8 {
9 reviceManager.Reset();
10 var bytes = new byte[1024 * 1024 * 4];
11 var receiveArgs = new SocketAsyncEventArgs();
//设置缓冲区
12 receiveArgs.SetBuffer(bytes, 0, bytes.Length);
13 receiveArgs.Completed += receiveArgs_Completed;
//开始异步接收
14 socketClient.ReceiveAsync(receiveArgs);
15 reviceManager.WaitOne();
16 }
17 catch (Exception ex)
18 {
19
20 //显示异常消息
21 ShowMsg(ex.Message);
22 }
} }
接收消息完成回调事件
1 void receiveArgs_Completed(object sender, SocketAsyncEventArgs e)
2 {
3 var socketClient = sender as Socket;
4 var bytes = e.Buffer;
5 ShowMsg(socketClient.RemoteEndPoint + "说:" + System.Text.Encoding.UTF8.GetString(bytes));
6 reviceManager.Set();
7 }
又与大家见面,看不懂的随时问。
1 private Thread threadClient;//客户端线程
2 private Socket socketClient;//客户端套接字
3 /// <summary>
4 /// 创建套接字连接到服务端
5 /// </summary>
6 private void CreateSocketConnection()
7 {
8 try
9 {
10 //创建一个客户端的套接字 参数(IP4寻址协议,流连接方式,TCP数据传输协议)
11 socketClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
12 //获取IP
13 IPAddress address = IPAddress.Parse(txtIP.Text.Trim());
14 //创建一个包含IP和端口号的网络节点对象
15 IPEndPoint ipPoint = new IPEndPoint(address, Convert.ToInt32(txtPort.Text.Trim()));
16 // 连接服务端
17 socketClient.Connect(ipPoint);
18 //创建一个线程,接受服务端发来的数据
19 threadClient = new Thread(ReceiveService);
20 //设置线程为后台线程
21 threadClient.IsBackground = true;
22 //启动线程连接服务端
23 threadClient.Start();
24 //显示消息
25 ShowMsg("与服务器" + txtIP.Text.Trim() + ":" + txtPort.Text + "成功建立连接!");
26
27 }
28 catch (Exception)
29 {
30
31 ShowMsg(txtIP.Text.Trim() + ":" + txtPort.Text + "服务器未启动!");
32
33 }
34
35 }
客户端接收消息
private void ReceiveService()
{
while (true)
{
try
{
int num = -1;
var b = new byte[1024 * 1024 * 4];
int length = socketClient.Receive(b);
var msg = System.Text.Encoding.UTF8.GetString(b,0,length);
ShowMsg(socketClient.RemoteEndPoint.ToString() + "对您: " + msg); }
catch (Exception ex)
{
ShowMsg(ex.Message);
break; }
}
}
1 private void ShowMsg(string msg)
2 {
3 txtConneMsg.AppendText("\r\n" + DateTime.Now + "\r\n\r\n" + msg + "\r\n");
4 }
客户端:
服务器:
客户端接收到消息:
private Socket socketClient;//客户端套接字,关于实例化请参考C# Socket基础(三)之客户端连接服务器和接收消息
客户端发送消息
1 /// <summary>
2 /// 发送数据到服务端
3 /// </summary>
4 private void Send()
5 {
6 if (socketClient == null)
7 {
8
9 ShowMsg("服务器未启动!");
10 return;
11 }
12 byte[] b = System.Text.Encoding.UTF8.GetBytes(txtSend.Text.Trim());
13 //客户端向服务器发送消息
14 socketClient.Send(b);
15 //清空文本
16
17 ShowMsg("您对" + socketClient.RemoteEndPoint.ToString() + "说:" + txtSend.Text.Trim());
18 txtSend.Text = "";
19 }
关于 ShowMsg(string message);是自定义的函数,在C# Socket基础(一)之启动异步服务侦听
好了,到这里就要告一段落了,实现了基本的客户端和服务器采用TCP协议通信。
看看效果吧:
客户端:
服务器:
C# Socket基础(一)之启动异步服务监听的更多相关文章
- Socket基础之-启动异步服务侦听
Socket网络编程第一篇: 本文主要是以代码为主. .NET技术交流群 199281001 .欢迎加入 1 //负责监听的套接字 private Socket socketServer; //通知一 ...
- 用nodejs搭建一个简单的服务监听程序
作为一个从业三年左右的,并且从事过半年左右PHP开发工作的前端,对于后台,尤其是对以js语言进行开发的nodejs,那是比较有兴趣的,虽然本身并没有接触过相关的工作,只是自己私下做的一下小实验,但是还 ...
- 重启eclips后启动项目出现监听文件找不到
重启eclips后启动项目出现监听文件找不到 问题: 重启eclips后启动项目出现Error configuring application listener of class com.thinkg ...
- Linux对外提供服务 网络操作 端口操作 1.开启服务监听端口 2.设置防火墙,放行访问端口的包 iptables&netfilter 四表五链和通堵策略
主题: Linux服务器上软件提供服务 1.网络操作 2.端口操作 1.网络操作 本机必须能够ping通目标主机(本地虚拟机或者远程主机) 2.端口操作 1.开启服务监听端口 2.设置防火墙,放行访问 ...
- Oracle启动两个监听
接上篇:Oracle服务器修改IP后 Oracle服务器更换IP后,办公网络里面可以正常访问了,外地的同事,连了vpn 也可以访问,以为可以收工回家,突然又有同事过来说,机房的服务器ping不通新的i ...
- mysql部署后无法远程连接的原因(错误代码10061),服务监听127.0.0.1和0.0.0.0的区别
在Ubuntu上部署mysql服务并添加了一个非root用户后,发现无法远程连接, Navicat连接mysql出现2003——can't connect to mysql server on loc ...
- windows 启动关闭Oracle监听和服务
经常要用数据库,让他自己启动的话,开机太慢,所以用命令启动方便点. 1.开启: 在运行中输入cmd,进入控制台,lsnrctl start回车,提示启动监听成功后 net start O ...
- Nginx服务监听端口修改启动bug
监听的端口从80 修改到其他端口出现启动不起来问题. 解决方案如下: yum install policycoreutils-python sudo cat /var/log/audit/audit. ...
- Yii2.0 安装yii2-queue并在Linux启动守护进程监听消息
一.什么是yii2-queue? Yii2-queue是Yii2.0 PHP框架下一个消息队列拓展插件,支持基于DB, Redis, RabbitMQ, AMQP, Beanstalk 和 Gearm ...
随机推荐
- carthage 简单使用步骤
brew install carthage切至项目目录:cd xxx创建Cartfile文件vi Cartfile填写依赖git "https://xxxxx" "mas ...
- [POJ] #1004# Financial Management : 浮点数运算
一. 题目 Financial Management Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 173910 Acc ...
- dom 冒泡事件
<!doctype html> <html> <head> <meta charset="utf-8"> <style> ...
- java 的开源wiki维基系统
几乎所有 维基 系统的对比网址: http://www.wikimatrix.org/ XWiki, 第二代wiki. 它里面使用的 velocity 模板语言对j2ee开发相当有参考价值, ...
- 第三百三十四天 how can I 坚持
I give up my dream that day,else,I coming on,the day my heart is die…… 那天,梦已碎,那天,心已死. 晚上看了个电影<奔爱& ...
- 【MySQL】查看MySQL配置文件路径及相关配置
(1)关于配置文件路径 有时候,我发现虽然尝试修改了配置文件的一些变量,但是并没有生效.后来才发现原来是因为修改的文件并非MySQL服务器读取的配置文件. 如果不清楚MySQL当前使用的配置文件路径, ...
- ASP.NET自定义控件入门Demo
最近看了MSDN关于自定义控件的介绍,根据官方的文档,自己学着做了一个简单的Demo给需要的朋友参考. ASP.NET 源生的TextBox是不带Label标签的,这里我要实现的是创建一个带Label ...
- Wisdombud.CommonTool及其应用
@(编程) 1. 用法 student类 using System.ComponentModel; namespace WindowsFormsApplication1 { public class ...
- java反射工具类
package com.yingchao.kgou.core; import java.lang.reflect.Field; import java.lang.reflect.InvocationT ...
- 关于刘冬大侠Spring.NET系列学习笔记3的一点勘正
诚如他第22楼“只因渴求等待”提出的疑问一样,他的下面那一段代码是存在一点点问题的, XElement root = XElement.Load(fileName); var objects = fr ...