一个简易的SocketIM
阅读原文时间:2023年07月10日阅读:1

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

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

1 System.Net.Sockets的使用

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

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

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

socket.Bind(endpoint);

socket.Listen(5);

Socket clientSocket = socket.Accept();

clientSocket.Receive(byteMessage);

socket.Close();

创建client端,步骤如下:

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

socket.Connect(endpoint);

socket.Send(byteMessage);

socket.Close();

2 多线程操作

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

private void BeginListen()

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是这样描述的

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

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

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

这个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);

}

}

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

源码上传在这里:https://github.com/jianfengye/MyWorks/tree/master/SocketIM

本文转自轩脉刃博客园博客,原文链接:http://www.cnblogs.com/yjf512/archive/2012/06/17/2552816.html,如需转载请自行联系原作者