今天做了一个简易的socketIM的小示例。基本思想是开启两个winform,每个winform既充当服务器也充当客户端。一个监听8000端口,另外一个监听8001端口,两个winform接收到信息之后将信息显示在form的控件上。
这篇记录一下码code中学到的一些东西。
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控件只能由创建控件的线程来操作,子线程如果要操作就需要通过代理的方式来迂回。
首先是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);
}
}
|
处理完这三个知识点,基本就完成了。