• 一个简易的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);
                }
            }

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

     

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






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

  • 相关阅读:
    QT 主窗口和子窗口相互切换示例
    《漫画线性代数》读书笔记 通读小结
    “网购懊悔权”为何与“机动车撞人负全责”一样扯淡?
    第十六周oj刷题——Problem J: 填空题:静态成员---计算学生个数
    HDU 1269 迷宫城堡(强连通)
    HashSet的排序
    android:改动PagerTabStrip中的背景颜色,标题字体的样式、颜色和图标以及指示条的颜色
    Spring中的FactoryBean
    免费APP在线測试工具以及其用法
    freemarker的TemplateExceptionHandler使用
  • 原文地址:https://www.cnblogs.com/twodog/p/12137725.html
Copyright © 2020-2023  润新知