• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C#教程 > c#实现多线程局域网聊天系统

c#实现多线程局域网聊天系统

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了c#多线程,c#多线程编程实例,c#多线程编程,c#多线程同步,c#多线程实例等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

觉得好有点帮助就顶一下啦。

socke编程,支持多客户端,多线程操作避免界面卡死。

开启socket

private void button1_Click(object sender, EventArgs e)
   {
     try
     {
       int port = int.Parse(txt_port.Text);
       string host = txt_ip.Text;
       //创建终结点
       IPAddress ip = IPAddress.Parse(host);
       IPEndPoint ipe = new IPEndPoint(ip, port);
       //创建Socket并开始监听
       newsock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //创建一个Socket对象,如果用UDP协议,则要用SocketTyype.Dgram类型的套接字
       newsock.Bind(ipe);  //绑定EndPoint对象
       newsock.Listen(0);  //开始监听
       //为新建立的连接创建新的Socket
       acceptClientThread = new Thread(new ThreadStart(AcceptClient));
       acceptClientThread.Start();
       SetText("开始监听");
     }
     catch (Exception exp)
     {
       CommonFunction.WriteLog(exp, exp.Message);
     }
   }

</div>

监控端口,接收客户端

/// <summary>
    /// 接受客户端,可接受多个客户端同时连入,并对连入的客户端注册到客户端列表
    /// </summary>
    public void AcceptClient()
    {
      try
      {
        while (true)
        {
          Socket client = newsock.Accept();
          ip = client.Handle;
          RegeistUser(client.Handle, client);
          Thread clientThread = new Thread(new ParameterizedThreadStart(ReceiveData));
          object o = client;
          clientThread.Start(o);
        }
      }
      catch (Exception exp)
      {
        CommonFunction.WriteLog(exp, exp.Message);
      }
    }

</div>

接收客户端数据并广播数据

/// <summary>
    /// 接收客户端数据并,转发到目标客户端。
    /// </summary>
    public void ReceiveData(object o)
    {
      try
      {
        while (true)
        {
          Socket client = (Socket)o;
          string recvStr = "";
          byte[] recvBytes = new byte[1024];
          int bytes;
          bytes = client.Receive(recvBytes, recvBytes.Length, 0); //从客户端接受消息
          recvStr = Encoding.UTF8.GetString(recvBytes, 0, bytes);
          SendMessage(client, recvStr);
          SetText(recvStr);
          CommonFunction.WriteErrorLog(recvStr);
        }
      }
      catch (Exception exp)
      {
        CommonFunction.WriteLog(exp, exp.Message);
      }
    }

</div>

判断是用户注册还是发送消息

/// <summary>
   /// 判断是用户注册还是发送消息
   /// </summary>
   /// <param name="p_strMessage"></param>
   public void SendMessage(Socket client,string p_strMessage)
   {
     if (p_strMessage.StartsWith("@"))
     {
       RegeistUser(p_strMessage, client);
     }
     else if (p_strMessage.StartsWith(">"))
     {
       
       DeleteClident(p_strMessage);
     }
     else
     {
       //SendMessageToTarget(p_strMessage);
       SendAllMessage(p_strMessage);
     }
   }

</div>

将socket注册为指定用户名

/// <summary>
    /// 将socket注册为指定用户名
    /// </summary>
    /// <param name="user"></param>
    /// <param name="ss"></param>
    public void RegeistUser(string user, Socket ss)
    {
      user = user.Remove(0, 1);
      userSocketDict.Add(user, ss);
      SendOneMessage(ss, "欢迎" + user + "连入!");
      RefreshClient();
    }

</div>

从客户端字典中移除客户端

/// <summary>
    /// 从客户端字典中移除客户端
    /// </summary>
    /// <param name="p_strMessage"></param>
    public void DeleteClident(string p_strMessage)
    {
      p_strMessage = p_strMessage.Remove(0, 1);
      userSocketDict.Remove(p_strMessage);
      RefreshClient();
    }

</div>

群发消息

/// <summary>
    /// 群发消息
    /// </summary>
    /// <param name="p_strsend"></param>
    public void SendAllMessage(string p_strsend)
    {
      //MessageBox.Show(p_strsend);
      foreach (string item in userSocketDict.Keys)
      {
        byte[] bs = Encoding.UTF8.GetBytes(p_strsend);
        userSocketDict[item].Send(bs, bs.Length, 0); 
      }
    }

</div>

给文本框赋值

public delegate void SetTextHandler(string text);
    /// <summary>
    /// 给文本框赋值
    /// </summary>
    /// <param name="text"></param>
    private void SetText(string text)
    {
      if (rich_back.InvokeRequired == true)
      {
        SetTextHandler set = new SetTextHandler(SetText);//委托的方法参数应和SetText一致 
        rich_back.Invoke(set, new object[] { text }); //此方法第二参数用于传入方法,代替形参text 
      }
      else
      {
        rich_back.Text += "\n" + text;
      }
 
    }

</div>

连入服务器

private void button1_Click(object sender, EventArgs e)
    {
      try
      {
        user = txt_name.Text;
        int port = int.Parse(txt_port.Text);
        string host = txt_ip.Text;
        //创建终结点EndPoint
        IPAddress ip = IPAddress.Parse(host);
        IPEndPoint ipe = new IPEndPoint(ip, port);  //把ip和端口转化为IPEndPoint的实例
        //创建Socket并连接到服务器
        Socket c = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);  // 创建Socket
        cc = c;
        c.Connect(ipe); //连接到服务器
        clientThread = new Thread(new ThreadStart(ReceiveData));
        clientThread.Start();
        //向服务器发送本机用户名,以便服务器注册客户端
        SendMessage("@" + txt_name.Text);
      }
      catch (ArgumentException ex)
      {
        Console.WriteLine("argumentNullException:{0}", ex);
      }
      catch (SocketException exp)
      {
        Console.WriteLine("SocketException:{0}",exp);
      }
    }

</div>

向服务器发送消息

private void button3_Click(object sender, EventArgs e)
    {
      if (""==txt_target.Text)
      {
        MessageBox.Show("未选择对话人物");
        return;
      }
      //向服务器发送信息
      string sendStr = txt_name.Text + "@" + target + ":" + txt_message.Text;
      SendMessage(sendStr);
      rch_back.Text += "\n" + sendStr;
      txt_message.Text = "";
    }

</div>

隐身

private void button2_Click(object sender, EventArgs e)
    {
      try
      {
        SendMessage(">" + txt_name.Text);
        //cc.Disconnect(true);
        //cc.Shutdown(SocketShutdown.Both);
        //cc.Close();
      }
      catch (Exception exp)
      {
        CommonFunction.WriteLog(exp, exp.Message);
      }
    }
</div>

以上所述就是本文的全部内容了,希望大家能够喜欢。

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • C#多线程编程详解
  • C#制作多线程处理强化版网络爬虫
  • C#向线程中传递多个参数的解决方法(两种)
  • C#往线程里传递参数的方法小结
  • C#中实现线程同步lock关键字的用法详解
  • C#下载歌词文件的同步和异步方法
  • C#多线程传递参数及任务用法示例
  • C#模式画刷HatchBrush用法实例
  • C#纹理画刷TextureBrush用法实例
  • c#实现多线程局域网聊天系统

相关文章

  • 2017-05-28c#在excel中添加超链接示例分享
  • 2017-05-28DirectoryInfo引用一个相对目录的实例
  • 2017-05-28C#计算矩阵的逆矩阵方法实例分析
  • 2017-05-28C#中的集合用法分析
  • 2017-05-28C#中this指针的用法示例
  • 2017-05-28C#中常量和只读变量的区别小结
  • 2017-05-28C#线程队列用法实例分析
  • 2017-05-28浅析C#中StringBuilder类的高效及与String的对比
  • 2017-05-28C#设置WinForm中DataGrid列的方法(列宽/列标题等)
  • 2017-05-28C#中lock用法详解

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • C#实现带百分比的进度条功能示例
    • 理解C#中的事件
    • C#基于正则表达式实现获取网页中所有信息的网页抓取类实例
    • C#实现关闭其他程序窗口或进程代码分享
    • C#中FormsAuthentication用法实例
    • c#实现KTV点歌系统
    • C#实现在前端网页弹出警告对话框(alert)的方法
    • c# 泛型类型参数与约束的深入分析
    • C#统计字符串中数字个数的方法
    • C#预处理器指令的用法实例分析

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有