C#聊天室①

news2025/1/13 13:24:38

聊天室服务器:

创建项目

桌面不需要使用控件

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);
            
        }
    }
}

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

运行效果服务器启动成功

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

58.WEB渗透测试-信息收集- 端口、目录扫描、源码泄露(6)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;57.WEB渗透测试-信息收集- 端口、目录扫描、源码泄露&#xff08;5&#xff09;-CSDN博客…

模拟笔试 - 卡码网周赛第二十一期(23年美团笔试真题)

第一题&#xff1a;小美的排列询问 解题思路: 简单题&#xff0c;一次遍历数组&#xff0c;判断 是否有和x、y相等并且相连 即可。 可优化逻辑&#xff1a;因为x和y是后输入的&#xff0c;必须存储整个数组&#xff0c;但是上面说了 **排列是指一个长度为n的数组&#xff0…

学习笔记——网络管理与运维——概述(网络管理)

二、概述 1、什么是网络管理&#xff1f; 网络管理是通过对网络中设备的管理&#xff0c;保证设备工作正常&#xff0c;使通信网络正常地运行&#xff0c;以提供高效、可靠和安全的通信服务&#xff0c;是通信网络生命周期中的重要一环。 2、网络管理分类 网络管理(Network …

C++ 24 之 拷贝构造函数

c24拷贝构造函数.cpp #define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std;class Person3 { private:int p_age; public:// 构造函数分类&#xff1a;// 按参数分类&#xff1a;1、有参 2、无参// 按类型分类:普通、拷贝&#xff08;复制&…

Charles代理https接口到本地

一、操作手册 1、安装工具 1.1、安装代理软件Charles 软件下载地址&#xff1a;Download a Free Trial of Charles • Charles Web Debugging Proxy 1.2、安装https代理插件&#xff1a;&#xff08;有问题自行百度解决&#xff09; 2、配置策略 以下以https接口为例&…

型号设计师和指挥调度体系: 中国航天系统工程的组织方式

在中国航天&#xff0c;系统工程的组织管理体系是设计师系统和指挥调度系统。 型号设计师系统是型号的技术体系&#xff0c;总设计师是研制任务的技术总负责人&#xff0c;是设计技术方面的组织者、指挥者&#xff0c;重大技术问题的决策者。 指挥调度系统是型号行政管理系统…

C++switch陈述

C 使用关键字 switch、case、default对一个常数执行不同的分流&#xff0c;这构成多重选择的结构&#xff0c;形式如下 简单来说&#xff0c;switch后头接一小括弧&#xff0c;小括弧内为一常数运算式&#xff0c;计算出常数值若与其后case的位标(label) 相符&#xff0c;就会执…

文件没有权限问题:cannot create /opt/apollo/neo/data/log/monitor.log: Permission denied

问题描述 执行 aem bootstrap start --plus 命令启动 Dreamview 提示错误&#xff1a; /bin/sh: 1: cannot create /opt/apollo/neo/data/log/monitor.log: Permission denied [ERROR] Failed to start Dreamview. Please check /opt/apollo/neo/data/log/dreamview.log or /op…

Windows环境RocketMQ启动broker时启动失败

在输入”start mqbroker.cmd -n 127.0.0.1:9876 autoCreateTopicEnabletrue“命令启动失败后&#xff0c;会出现如下图所示的样子。 但我们重新启动电脑、重新启动RocketMQ或者杀死进程等方法都对此无效&#xff0c;还是没有启动成功。 启动失败的原因&#xff1a; 中途断网或…

Kaggle -- Multi-Class Prediction of Obesity Risk

使用简单的决策树进行分类&#xff0c;代码如下&#xff1a; import pandas as pd import numpy as np from sklearn.preprocessing import OneHotEncoder from sklearn.model_selection import train_test_splitdf pd.read_csv("train.csv")df[Gender] df[Gender…

React 中的 Lanes

React 中有一个 Lane 的概念&#xff0c;Lane 就像高速路上的不同车道&#xff0c;具有不同优先级&#xff0c;在 React Lane 通过一个 32 位的二进制数来表示。越小优先级别越高&#xff0c;SyncLane 级别最高。用二进制存储的方式&#xff0c;可以通过逻辑操作快速判断 Lane …

vite.config.js如何使用env的环境变量

了解下环境变量在vite中 官方文档走起 https://cn.vitejs.dev/guide/env-and-mode.html#env-variables-and-modes 你见到的.env,.env.production等就是放置环境变量的 官方文档说到.env.[mode] # 只在指定模式下加载,比如.env.development只在开发环境加载 至于为什么是deve…

算法课程笔记——线段树维护矩阵

算法课程笔记——线段树维护矩阵 2

【每日一练 】day2

✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天开心哦&#xff01;✨✨ &#x1f388;&#x1f388;作者主页&#xff1a; &#x1f388;丠丠64-CSDN博客&#x1f388; ✨✨ 帅哥美女们&#xff0c;我们共同加油&#xff01;一起…

代理IP常见问题解答,新手必看手册

代理IP在互联网数据收集和业务开展中发挥着重要作用&#xff0c;它充当用户客户端和网站服务器之间的“屏障”&#xff0c;可以保护用户的真实IP地址&#xff0c;并允许用户通过不同的IP地址进行操作。然而&#xff0c;在使用代理IP的过程中&#xff0c;用户经常会遇到一些问题…

2.spring cloud gateway 源码编译

spring cloud gateway编译 1.编译 命令 mvn clean compile -U2.报错 报错信息 核心信息 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-checkstyle-plugin:3.1.2:check (checkstyle-validation) on project spring-cloud-gateway-mvc: Failed during …

javaWeb项目-ssm+vue中国风音乐推介网站功能介绍

本项目源码&#xff1a;java-ssmvue中国风音乐推介网站源码说明文档资料资源-CSDN文库 项目关键技术 开发工具&#xff1a;IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7 框架&#xff1a;ssm、Springboot 前端&#xff1a;Vue、ElementUI 关键技术&#xff1a;springboot、…

setOptMode -holdTargetSlack与-holdSlackFixingThreshod

我正在「拾陆楼」和朋友们讨论有趣的话题&#xff0c;你⼀起来吧&#xff1f; 拾陆楼知识星球入口 -holdTargetSlack与-holdSlackFixingThreshod这两个option都是针对hold slack的&#xff0c;前者限制slack的目标&#xff0c;默认是0&#xff0c;也就是说工具尽可能会收敛时序…

vivado HW_SYSMON

描述 系统监视器HW_SYSMON是Xilinx上的一个模数转换器&#xff08;ADC&#xff09;电路 用于测量诸如温度和电压之类的操作条件的设备。这个 HW_SYSMON通过片上温度和电源监控物理环境 传感器。ADC为一系列应用提供了高精度模拟接口。这个 ADC最多可访问17个外部模拟输入通道。…

分类模型:MATLAB判别分析

1. 判别分析简介 判别分析&#xff08;Discriminant Analysis&#xff09; 是一种统计方法&#xff0c;用于在已知分类的样本中构建分类器&#xff0c;并根据特征变量对未知类别的样本进行分类。常见的判别分析方法包括线性判别分析&#xff08;Linear Discriminant Analysis, …