zoukankan      html  css  js  c++  java
  • Sock基础


    z
    1 客户端
    //客户端 通信套接字
    //1.创建监听套接字 使用 ip4协议,流式传输,TCP连接
    Socket sokMsg = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    //2.获取要连接的服务端 节点
    //2.1获取网络节点对象
    IPAddress address = IPAddress.Parse(txtIP.Text);//127.0.0.1
    IPEndPoint endPoint = new IPEndPoint(address, int.Parse(txtPort.Text));//10001
    //3.向服务端 发送链接请求
    sokMsg.Connect(endPoint);
    //4.开启通信线程
    //客户端 通信线程
    Thread thrMsg = new Thread(RecevieMsg);
    thrMsg.IsBackground = true;
    thrMsg.SetApartmentState(ApartmentState.STA);//在winform7 要用到
    thrMsg.Start();
    ------------------------------
    void RecevieMsg()
    {
    //3.1创建 消息缓存区
    byte[] arrMsg = new byte[1024 * 1024 * 1];
    try
    {
    while (isRec)
    {
    //此处 接收 服务器发来的数据中,因为包含了一个 标识符,所以内容的真实长度,应该 - 1
    int realLength = sokMsg.Receive(arrMsg) - 1;// Receive 会阻断线程

    switch (arrMsg[0])
    {
    case 0://接收到文本消息
    GetMsg(arrMsg, realLength);
    break;
    case 1://
    GeFile(arrMsg, realLength);
    break;
    default:
    break;
    }
    }
    }
    catch (Exception ex)
    {
    sokMsg.Close();
    sokMsg = null;
    ShowMsg("服务端断开连接!");
    }
    }


    2 在服务端
    private void btnStartListen_Click(object sender, EventArgs e)
    {
    try
    {
    //1.创建【监听套接字】 使用 ip4协议,流式传输,TCP连接
    sokWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    //2.绑定端口
    //2.1获取网络节点对象
    IPAddress address = IPAddress.Parse(txtIP.Text);//127.0.0.1
    IPEndPoint endPoint = new IPEndPoint(address, int.Parse(txtPort.Text));//10001
    //2.2绑定端口(其实内部 就向系统的 端口表中 注册 了一个端口,并指定了当前程序句柄)
    sokWatch.Bind(endPoint);
    //2.3设置监听队列(指,限制 同时 处理的 连接请求数--即同时处理的客户端连接请求)
    sokWatch.Listen(10);
    //2.4开始监听,调用监听线程 执行 监听套接字的 监听方法
    thrWatch = new Thread(WatchConnecting);
    thrWatch.IsBackground = true;
    thrWatch.Start();
    ShowMsg("服务器启动啦~~!");
    }
    catch (SocketException sex)
    {
    MessageBox.Show("异常:" + sex);
    }
    catch (Exception ex)
    {
    MessageBox.Show("异常:" + ex);
    }
    }

    /// <summary>
    /// 服务端监听方法
    /// </summary>
    void WatchConnecting()
    {
    try
    {
    //循环监听 客户端的 连接请求
    while (isWatch)
    {
    //2.4开始监听:此方法会阻断当前线程,直到有 其它程序 连接过来,才执行完毕
    Socket sokMsg = sokWatch.Accept();
    //2.5创建通信管理类
    MsgConnection conn = new MsgConnection(sokMsg, ShowMsg, RemoveClient);

    //将当前连接成功的 【与客户端通信的套接字】 的 标识 保存起来,并显示到 列表中
    //将 远程客户端的 ip和端口 字符串 存入 列表
    lbOnline.Items.Add(sokMsg.RemoteEndPoint.ToString());
    //将 服务端的通信套接字 存入 字典集合
    dictCon.Add(sokMsg.RemoteEndPoint.ToString(), conn);

    ShowMsg("有客户端连接了~~!");
    }
    }
    catch (Exception ex)
    {
    ShowMsg("异常:" + ex);
    }
    }

    // 发送消息
    sokMsg.Send();


    /// <summary>
    /// 断开socket连接
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void btdisConnect_Click(object sender, EventArgs e)
    {
    //如果当前客户端的链接socket不为空并且处于和服务器的链接状态时,断开当前链接
    if (cSocket != null && cSocket.Connected)
    {
    cSocket.Disconnect(false);
    }
    }


    ----------------------------可以将一个实体序列化成数组
    /// <summary>
    /// 将对象序列化成byte[]数组的帮助类,提供序列化和反序列功能
    /// </summary>
    public class SerDesrHelper
    {
    /// <summary>
    /// 将对象序列化成byte数组
    /// </summary>
    /// <param name="obj"></param>
    /// <returns></returns>
    public static byte[] Serialization(object obj)
    {
    byte[] buffer;
    //1 初始化一个二进制流的序列化器
    BinaryFormatter ser = new BinaryFormatter();
    // 2 定义一个内存流,用来接收二进制流的序列化器将对象obj序列化以后的byte[]数组
    using (MemoryStream ms = new MemoryStream())
    {
    // 3 调用二进制流的序列化器Serialize()方法将obj序列化成二进制流保存到ms中
    ser.Serialize(ms, obj);

    //4 要将ms的当前流指针定位到0的位置
    ms.Position = 0;
    // 5 定义一个ms长度的接收byte[]数组
    buffer = new byte[ms.Length];

    // 6 将ms中的内容读到byte[]数组buffer中
    ms.Read(buffer, 0, buffer.Length);
    }

    // 7 返回有内容的buffer
    return buffer;
    }

    /// <summary>
    /// 将byte数组字节码反序列化成相应的对象
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="objbty"></param>
    /// <returns></returns>
    public static T Deserialize<T>(byte[] objbty)
    {
    if (objbty.Length == 0) return default(T);

    //1 初始化一个二进制流的序列化器
    BinaryFormatter ser = new BinaryFormatter();
    using (MemoryStream ms = new MemoryStream(objbty))
    {
    return (T)ser.Deserialize(ms);
    }
    }
    }

  • 相关阅读:
    多线程编程核心技术(五)死锁
    SELinux详细配置
    Linux实现RAID
    iSCSi的基本配置
    文本超出省略号之前后省略号实现
    对象冻结
    条件判断的优美写法
    使用VConsole
    重绘和重排(回流)
    移动端rem布局
  • 原文地址:https://www.cnblogs.com/cdaq/p/4645579.html
Copyright © 2011-2022 走看看