一个简易的SocketIM

简介:

今天做了一个简易的socketIM的小示例。基本思想是开启两个winform,每个winform既充当服务器也充当客户端。一个监听8000端口,另外一个监听8001端口,两个winform接收到信息之后将信息显示在form的控件上。

 

这篇记录一下码code中学到的一些东西。

clip_image001

1 System.Net.Sockets的使用

.net的socket库已经将C中对socket的所有使用封装起来了。庆幸的是基本的函数和流程还是一样的。

 

想要创建socket server,步骤如下:

 

实例化一个socket

Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

绑定端口

socket.Bind(endpoint);

监听端口

socket.Listen(5);

Accept请求

Socket clientSocket = socket.Accept();

接收请求内容

clientSocket.Receive(byteMessage);

关闭socket

socket.Close();

 

创建client端,步骤如下:

实例化一个socket:

Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

连接到接收端

socket.Connect(endpoint);

发送请求

socket.Send(byteMessage);

关闭socket

socket.Close();

 

2 多线程操作

C#中的多线程操作函数是封装在System.Threading中。我这里是使用最简单的多线程处理函数:

 

建立一个线程处理函数,这个函数是回调用的

private void BeginListen()

实例化一个Thread,并注册回调函数

Thread thread = new Thread(new ThreadStart(BeginListen));

将线程设置为后台运行

thread.IsBackground = true;

启动线程

thread.Start();

 

3 子线程处理父线程创建的winform控件

.net中winform控件只能由创建控件的线程来操作,子线程如果要操作就需要通过代理的方式来迂回。

msdn中http://msdn.microsoft.com/zh-cn/library/system.windows.forms.control.invokerequired%28v=VS.80%29.aspx是这样描述的

clip_image002

 

首先是Control.InvokeRequired 属性

如果当前线程对该控件没有控制权限,则这个线程调用控件的InvokeRequired返回true,说明这个线程只有调用Invoke方法才能修改控件的属性

如果当前线程对该控件有控制权限,则这个属性返回false

 

其次是Control.Invoke方法

这个方法有两个参数,第一个是方法,第二个参数是方法的参数

 

这个msdn上有个非常详细的使用例子:

http://msdn.microsoft.com/zh-cn/library/a1hetckb%28v=vs.80%29.aspx

使用这两个就可以使用这么个方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
delegate  void  SetListBox( string  strValue);                    //定义委托
        private  void  SetListBoxValue( string  value)
         {
             if  ( this .listBox1.InvokeRequired)
             {
                 SetListBox sbox =  new  SetListBox(SetListBoxValue);
                 listBox1.Invoke(sbox, value);
             }
             else
             {
                 listBox1.Items.Add(value);
             }
         }

处理完这三个知识点,基本就完成了。

目录
相关文章
|
7月前
|
安全 API 数据安全/隐私保护
邮箱SMTP怎么设置?设置aoksend步骤以及嵌入式代码
邮箱SMTP怎么设置?设置aoksend步骤以及嵌入式代码
|
7月前
|
小程序 JavaScript 前端开发
微信小程序控制元素显示隐藏
微信小程序控制元素显示隐藏
103 0
|
编译器 C语言
C语言:函数(2)
C语言:函数(2)
|
JavaScript 前端开发
基于 webpack 项目接入 vite 你可能需要注意的点
基于 webpack 项目接入 vite 你可能需要注意的点
506 0
|
jenkins Shell 持续交付
jenkins流水线+SonarQube集成检查代码
jenkins流水线+SonarQube集成检查代码
jenkins流水线+SonarQube集成检查代码
|
安全 算法 开发工具
iOS逆向-day11:代码混淆
iOS逆向-day11:代码混淆
842 0
iOS逆向-day11:代码混淆
L1-069 胎压监测 (15 分)
L1-069 胎压监测 (15 分)
177 0
L1-069 胎压监测 (15 分)
|
数据可视化
Graphviz之DT:手把手教你使用可视化工具Graphviz将dot文件转为结构图的png文件
Graphviz之DT:手把手教你使用可视化工具Graphviz将dot文件转为结构图的png文件
Graphviz之DT:手把手教你使用可视化工具Graphviz将dot文件转为结构图的png文件
|
自然语言处理 算法 JavaScript
natural 用 node.js 进行自然语言处理
我们曾经介绍过用Python的TextBlob模块对文本进行情感分析,node.js同样可以进行自然预言处理。natural模块已经支持词法分析、词干分析、分类、语音、反比文档频数权重评价、WordNet、字符串相似度等处理。
1178 0
natural 用 node.js 进行自然语言处理
|
存储 监控 负载均衡
面向应用的反范式化建模|学习笔记
快速学习面向应用的反范式化建模
面向应用的反范式化建模|学习笔记