zoukankan      html  css  js  c++  java
  • 一个简易的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,如需转载请自行联系原作者

  • 相关阅读:
    网页加速的14条优化法则 网站开发与优化
    .NET在后置代码中输入JS提示语句(背景不会变白)
    C语言变量声明内存分配
    SQL Server Hosting Toolkit
    An established connection was aborted by the software in your host machine
    C语言程序设计 2009春季考试时间和地点
    C语言程序设计 函数递归调用示例
    让.Net 程序脱离.net framework框架运行
    C语言程序设计 答疑安排(2009春季 110周) 有变动
    软件测试技术,软件项目管理 实验时间安排 2009春季
  • 原文地址:https://www.cnblogs.com/twodog/p/12137725.html
Copyright © 2011-2022 走看看