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

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

    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

    实时了解作者更多技术文章,技术心得,请关注微信公众号“轩脉刃的刀光剑影”

    本文基于署名-非商业性使用 3.0许可协议发布,欢迎转载,演绎,但是必须保留本文的署名叶剑峰(包含链接http://www.cnblogs.com/yjf512/),且不得用于商业目的。如您有任何疑问或者授权方面的协商,请与我联系

  • 相关阅读:
    ubuntu c++ 关机 重启 挂起 API
    Java 并发 —— Java 标准库对并发的支持及 java.util.concurrent 包
    机器学习: Logistic Regression--python
    机器学习:朴素贝叶斯--python
    理解YOLOv2训练过程中输出参数含义
    darknet YOLO 编译使用GPU
    机器学习:决策树--python
    Xmodem通信协议实例
    MQTT协议笔记之连接和心跳
    Android实现推送方式解决方案
  • 原文地址:https://www.cnblogs.com/yjf512/p/2552816.html
Copyright © 2011-2022 走看看