C#简单聊天室雏形
作者:52unity 发布时间:2023-02-27 16:14:13
标签:C#,聊天室
本文实例为大家分享了C#简单聊天室雏形的具体代码,供大家参考,具体内容如下
程序使用的控制台的黑窗口模拟程序,第一次涉及网络编程,写出来方便以后查阅,代码很简单
首先是服务器端的代码:
public class ServerControl
{
private Socket serverSocket;
public ServerControl()
{
serverSocket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
}
public void Start()
{
serverSocket.Bind(new IPEndPoint(IPAddress.Any, 12312)); //设置接收任何ip
serverSocket.Listen(10); //最大挂起数
Console.WriteLine("服务器启动成功");
}
}
主程序:
static void Main(string[] args)
{
ServerControl server = new ServerControl();
server.Start();
Console.ReadKey();
}
下面是客户端代码:
public class ClientControl
{
Socket clientSocket;
public ClientControl()
{
clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
}
public void Connect(string ip, int port)
{
clientSocket.Connect(ip, port);
Console.WriteLine("连接服务器成功");
}
}
客户端的调用代码:
static void Main(string[] args)
{
ClientControl client = new ClientControl();
client.Connect("127.0.0.1",12312);
Console.ReadKey();
}
此时客户端就可以顺利连接到服务器,下一步是在服务器上显示是谁连接到服务器了很简单只需要在服务器端加一个方法来检测:
private void Accept()
{
//接收客户端方法,会挂起当前线程
Socket client = serverSocket.Accept();
IPEndPoint point = client.RemoteEndPoint as IPEndPoint;
Console.WriteLine(point.Address + "[" + point.Port + "]连接成功");
Accept(); //尾递归
}
因为要在服务器启动就要去检测有没有连接到服务器的ip,所以需要在start方法中开辟一个新的线程来调用Accept方法
Thread threadAccept = new Thread(Accept); //接收一个委托方法
threadAccept.IsBackground = true; //设置为后台线程
threadAccept.Start();
下一步就是客户端要往服务器发送消息
客户端的ClientControl类代码:
public void Send(string msg)
{
clientSocket.Send(Encoding.UTF8.GetBytes(msg));
}
客户端主程序调用代码:
Console.WriteLine("请输入要发送的内容, 输入exit退出:");
string msg = Console.ReadLine();
while (msg != "exit")
{
client.Send(msg);
msg = Console.ReadLine();
}
下一步就是要在服务器接收客户端的输入内容
private void Receive(object obj)
{
Socket client = obj as Socket;
IPEndPoint point = client.RemoteEndPoint as IPEndPoint;
try //防止客户端异常断开抛异常
{
byte[] msg = new byte[1024];
int msglen = client.Receive(msg);
Console.WriteLine(point.Address + "[" + point.Port + "]:" + Encoding.UTF8.GetString(msg, 0, msglen)); client.Send(Encoding.UTF8.GetBytes(Encoding.UTF8.GetString(msg, 0, msglen))); //这个地方加了个小功能,就是客户端来一个消息 服务器给他发回去同样的,可以去掉
Receive(client); //尾递归
}
catch
{
Console.WriteLine(point.Address + "[" + point.Port + "]:" + "已经断开");
}
这个方法执行同样会挂起线程,所以要开辟一个新的线程,因为这是接收客户端的消息,所以这个新线程要写在刚才写的Accept方法里面
Thread threadReceive = new Thread(Receive);
threadReceive.IsBackground = true;
threadReceive.Start(client);
附加:
刚才不是写了一个服务器接收到消息,会给客户端返回一个相同的消息,所以还要在客户端接收服务器的消息,方法和在服务器端接收大同小异
private void Receive()
{
try
{
byte[] msg = new byte[1024];
int msglen = clientSocket.Receive(msg);
Console.WriteLine("服务器说:" + Encoding.UTF8.GetString(msg));
Receive();
}
catch
{
Console.WriteLine("服务器已经断开");
}
}
以为一连上就要去检测服务器有没有消息,所以开辟一个线程 写在客户端的 connect方法中
Thread threadReceive = new Thread(Receive);
threadReceive.IsBackground = true;
threadReceive.Start();
好了 ,一个最简单的聊天室就算写完了
想多人登陆 就在vs中找到客户端的debug文件夹 找到exe文件运行
来源:https://blog.csdn.net/qq_24664201/article/details/52061933


猜你喜欢
- 1. 什么是RESTREST全称是Representational State Transfer,中文意思是表述(编者注:通常译为表征)性状
- public static string Escape(string s) &nb
- Android5.0之后提供了JobService和JobScheduler,用于在稍后的某个时间点或者当满足某个特定的条件时执行一个任务
- 之前我们在使用vue进行 h5 表单录入的过程中,遇到了Android软键盘弹出,覆盖 h5页面 输入框 问题,在此进行回顾并分享给大家:系
- 前言 最近利用空闲时间学习了自定义View的一些知识,为了巩固,写了一个小东西,顺便分享出来,下面话不多说了,来一起看看详细的介绍吧。简介
- 自用项目中统一Eclipse格式化Java、JavaScript、JSP、HTML代码设置1.Window->Preferences
- AudioSource 组件参考属性属性说明Clip音频资源Volume音量大小Mute是否静音Loop是否循环Play on load加载
- 前言有时候我们想克隆一个List去做别的事,而不影响原来的List,我们直接在list后面加上小点点,发现并没有Clone这样的扩展函数。这
- RecyclerView显示Item布局不一致在自定义RecyclerAdapter的时候,在重写onCreateViewHolder方法是
- 一 前言此篇文章的内容也是学习不久,终于到周末有时间码一篇文章分享知识追寻者的粉丝们,学完本篇文章,读者将对token类的登陆认证流程有个全
- 本文实例为大家分享了java数据库唯一id生成工具类的具体代码,供大家参考,具体内容如下import java.io.File;import
- 前言在 C# 编程中,管道式编程(Pipeline Style programming)其实存在已久,最明显的就是我们经常使用的 LINQ。
- 做Android开发的童靴们肯定对系统自带的控件使用的都非常熟悉,比如Button、TextView、ImageView等。如果你问我具体使
- 一、前言Android 实现卫星式菜单也叫弧形菜单,主要要做的工作如下:1.动画的处理2.自定义ViewGroup来实现卫星式菜单View(
- 1,什么是字符编码? 字符(Character)是文字与符号的总称,包括文字、图形符号、数学符号等。一组
- 修改加密和验证方法/** * 生成BCryptPasswordEncoder密码 *
- 目录1、概念相关1.1、概念1.2、解决了什么:1.3、场景:2、简单实现2.1 代码3. netty中的责任链模式4、思考本文先介绍了责任
- Kotlin 封装万能SharedPreferences存取任何类型详解/** * author: smart * time: 2016/1
- 题目描述已知鸡的数量为n只,兔的数量为m只,鸡兔的总头数为H个鸡兔的总脚数为Y只for循环语法for(表达式1;表达式2;表达式3 ){&n
- 一、什么是建造者模式建造者模式也称生成器模式 定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示(依赖倒转)产品