C#聊天室①

聊天室服务器:

创建项目

桌面不需要使用控件

Program.cs

internal class Program
{
    static TcpListener server;
    [STAThread]
    static void Main()
    {
        Program p = new Program();        
        p.start();
    }
    void start()
    {
        server = new TcpListener(IPAddress.Parse(GetIP()), 3333);
        server.Start(100);
        // 等待客户进行连入
        Thread th = new Thread(WaitClinetInto);
        th.Start();
    }
    List<MyClient> List = new List<MyClient>();
    void WaitClinetInto()
    {
        // 等待多个客户端进行连入
        while (true)
        {
            // 如果现在有客户端要连入了
            if (server.Pending())
            {
                TcpClient client = server.AcceptTcpClient();// 接受客户端连接
                Console.WriteLine("有客户端连入:"+client.Client.RemoteEndPoint.ToString());
                // 自定义客户端 把接受消息和发消息等功能进行封装
                MyClient MC = new MyClient(client,this); // this 就是Program对象
                List.Add(MC);
                Thread.Sleep(100);
            }
        }
    }
    // 群发消息
    public void ChatGroup(string msg, MyClient my)
    {
        foreach (MyClient item in List)
        {
            if (my != item)
            {
                item.sendMessage(msg);
            }
        }
    }
    // 选择IP
     string GetIP()
    {
        Console.WriteLine("1.我的线上IP:192.168.107.72");
        Console.WriteLine("2.测试我的服务器:127.0.0.1");
        Console.WriteLine("3.其他IP地址");
        string num = Console.ReadLine();
        string ip = "";
        if (num == "1")
        {
            ip = "192.168.107.72";
        }
        else if (num =="2")
        {
            ip = "127.0.0.1";
        }
        else
        {
            Console.WriteLine("请输入你想连的服务器ip");
            ip = Console.ReadLine();
        }
        Console.WriteLine("我选择的IP是:"+ip);
        return ip;
    }

}

选着ip形式三个CW输入1,2,3选择

MyClient.cs

internal class MyClient
{
    public TcpClient Client; // Program文件获取客户端对象
    public Program Program; // program对象
    public NetworkStream Stream; // 接受或者发送消息
    public MyClient(TcpClient t1,Program p)
    {
        this.Client = t1;
        this.Program = p;
        this.Stream = t1.GetStream();

        // 开始接受数据 在异步接受数据
        // 开启分线程
        Thread th = new Thread(MytheadHandle);
        th.Start();
    }
    // 处理收发消息的
    public void MytheadHandle()
    {
        while (true)
        {
            try
            {
                byte[] bs = new byte[1024];
                // 接受数据
                int length = this.Stream.Read(bs, 0, bs.Length);
                string msg = Encoding.UTF8.GetString(bs, 0, length);
                Console.WriteLine(msg);
                if (!String.IsNullOrEmpty(msg))
                {
                    // 调用群聊的方法
                    this.Program.ChatGroup(msg,this);
                }
            }
            catch(Exception ex)
            {
                Console.WriteLine("111"+ex.Message);
                break;
            }
        }
    }
    // 封装一个发送消息的方法
    public void sendMessage(string msg)
    {
        try
        {
            byte[] bs = Encoding.UTF8.GetBytes(msg);
            this.Stream.Write(bs, 0, bs.Length);
        }
        catch (Exception e)
        {
            this.Client.Close();
            Console.WriteLine("222" + e.Message);
            
        }
    }
}

右键项目属性选择输出类型“控制台应用程序”

运行效果服务器启动成功

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/706045.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

WINUI——CommunityToolkit.Mvvm Messenger接收消息时报错:Cannot access a disposed object.

背景 WINUI开发时使用CommunityToolkit.Mvvm的Messemger让UI展示一些信息时出现错误&#xff1a; System.ObjectDisposedException:“Cannot access a disposed object. ObjectDisposed_ObjectName_Name” 详细见下述截图&#xff1a; 开发环境 WIN11 WINUI&#xff13; …

【源码】html+JS实现:24小时折线进度图

<!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0"> <title>24小时折线进度图</title> <st…

代码生成-CodeGeeX2本地部署体验

一 CodeGeeX2介绍&#xff1a; CodeGeeX2 是多语言代码生成模型 CodeGeeX (KDD’23) 的第二代模型。不同于一代 CodeGeeX&#xff08;完全在国产华为昇腾芯片平台训练&#xff09; &#xff0c;CodeGeeX2 是基于 ChatGLM2 架构加入代码预训练实现&#xff0c;得益于 ChatGLM2 的…

是否可以购买外链?

答案是可以&#xff0c;但要看你买什么外链&#xff0c;有价值的自然外链价格肯定也高&#xff0c;随便到某些平台发的外链&#xff0c;哪怕是相关的高权重平台&#xff0c;作用也有限&#xff0c;当然&#xff0c;你要大批量购买&#xff0c;说不定也能出一点效果&#xff0c;…

天诚公租房、人才公寓NB-IOT人脸物联网智能门锁解决方案

近期&#xff0c;全国已有超70城推出商品房“以旧换新”。各地商品房“以旧换新”主要采取国企收购、市场联动、税费补贴三种模式&#xff0c;二手房和新房市场交易活跃度均有提升。 一、人才公寓掀起建设浪潮 事实上&#xff0c;旧房被收购后将被纳入保障性租赁住房&#xf…

opencv 通过滑动条调整阈值处理、边缘检测、轮廓检测、模糊、色调调整和对比度增强参数 并实时预览效果

使用PySimpleGUI库创建了一个图形用户界面(GUI),用于实时处理来自OpenCV摄像头的图像。它允许用户应用不同的图像处理效果,如阈值处理、边缘检测、轮廓检测、模糊、色调调整和对比度增强。用户可以通过滑动条调整相关参数。 完整代码在文章最后,可以运行已经测试; 代码的…

代码随想录Day58

392.判断子序列 题目&#xff1a;392. 判断子序列 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a;定义重合数记录s与t的比对情况&#xff0c;挨个取出t的字符&#xff0c;与s的字符进行比较&#xff0c;如果相同&#xff0c;重合数就加1&#xff0c;跳到s的下一个字…

QStyledItemDelegate的使用方法

QStyledItemDelegate 是 Qt 框架中用于为模型/视图框架提供数据项显示和编辑的一个类。 1. 创建 QStyledItemDelegate 实例 通常&#xff0c;你不需要直接实例化 QStyledItemDelegate&#xff0c;因为它是默认的委托。但如果你需要自定义显示和编辑行为&#xff0c;你可以继承…

韩顺平0基础学java——第22天

p441-459 异常exception 选中代码块&#xff0c;快捷键ctraltt6&#xff0c;即trt-catch 如果进行了异常处理&#xff0c;那么即使出现了异常&#xff0c;但是会继续执行 程序过程中发生的异常事件分为两大类&#xff1a; 异常体系图※ 常见的运行异常&#xff1a;类型转换…

继承深度剖析

前言 从继承开始就开始C进阶了&#xff0c; 这一块需要好好学习&#xff0c;这块知识很重要&#xff0c; 坑有点多&#xff0c;所以是面试笔试的常客。 基本概念 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段&#xff0c; 它允许程序员在保持原有…

使用MNIST数据集训练手写数字识别模型

一、MNIST数据集介绍 MNIST 数据集&#xff08;手写数字数据集&#xff09;是一个公开的公共数据集&#xff0c;任何人都可以免费获取它。目前&#xff0c;它已经是一个作为机器学习入门的通用性特别强的数据集之一&#xff0c;所以对于想要学习机器学习分类的、深度神经网络分…

抓包工具 Wireshark 的下载、安装、使用、快捷键

目录 一、什么是Wireshark&#xff1f;二、Wireshark下载三、Wireshark安装四、Wireshark使用4.1 基本使用4.2 过滤设置1&#xff09;捕获过滤器2&#xff09;显示过滤器 4.3 过滤规则1&#xff09;捕获过滤器-规则语法2&#xff09;显示过滤器-规则语法 4.4 常用的显示过滤器规…

js实现一个数据结构——栈

栈的概念就不再赘述&#xff0c;无可厚非的先进后出&#xff0c;而JS又是高级语言&#xff0c;数组中的方法十分丰富&#xff0c;已经自带了push pop方法进行入栈出栈的操作。 1.基本实现 class Stack {constructor() {this.items [];}// 入栈push(item) {this.items.push(i…

【C++入门(1)】命名空间

一、C出世 我们先简单认识下C的来历&#xff0c;C是在C语言的基础上发展来的。 当年C的设计者Bjarne Stroustrup&#xff0c;本贾尼斯特劳斯特卢普先生设计C语言之初&#xff0c;是为了对C语言做出一些更改&#xff0c;弥补C语言在一些方面的不足&#xff0c;或者做出其他的设…

二阶段提交(2pc)协议

二阶段提交&#xff08;2pc&#xff09;协议 1、 简介 二阶段提交算法是一个分布式一致性算法&#xff0c;强一致、中心化的原子提交协议&#xff0c;主要用来解决分布式事务问题。在单体spring应用中我们往往通过一个Transactional注解就可以保证方法的事务性&#xff0c;但…

破解发展难题 台山这家合作社以农业社会化服务助推乡村振兴

风吹稻田千层浪&#xff0c;眼下&#xff0c;台山四九镇的早稻长势喜人&#xff0c;沉甸甸的稻穗迎风而动&#xff0c;已进入破口抽穗的关键期&#xff0c;即将在6月底陆续迎来丰收。在台山市明华汇种养专业合作社管理的稻田里&#xff0c;合作社负责人梁明喜正仔细观察着稻苗的…

算法第六天:力扣第977题有序数组的平方

一、977.有序数组的平方的链接与题目描述 977. 有序数组的平方的链接如下所示&#xff1a;https://leetcode.cn/problems/squares-of-a-sorted-array/description/https://leetcode.cn/problems/squares-of-a-sorted-array/description/ 给你一个按 非递减顺序 排序的整数数组…

#慧眼识模每日PK[话题]##用五种语言说爸爸我爱你[话题]#

#慧眼识模每日PK #用五种语言说爸爸我爱你 你觉得哪个模型回答得更好&#xff1f;欢迎留言 A.蓝 B.紫 更多问题&#xff0c;扫码体验吧&#xff5e; by 国家&#xff08;杭州&#xff09;新型交换中心

Whisper语音识别 -- 自回归解码分析

前言 Whisper 是由 OpenAI 开发的一种先进语音识别系统。它采用深度学习技术&#xff0c;能够高效、准确地将语音转换为文本。Whisper 支持多种语言和口音&#xff0c;并且在处理背景噪音和语音变异方面表现出色。其广泛应用于语音助手、翻译服务、字幕生成等领域&#xff0c;为…

鸿蒙轻内核A核源码分析系列七 进程管理 (3)

本文记录下进程相关的初始化函数&#xff0c;如OsSystemProcessCreate、OsProcessInit、OsProcessCreateInit、OsUserInitProcess、OsDeInitPCB、OsUserInitProcessStart等。 1、LiteOS-A内核进程创建初始化通用函数 先看看一些内部函数&#xff0c;不管是初始化用户态进程还…