为了准备毕业设计,学习了服务器与客户端之间传输的一些简单的知识,并跟着网络上的教程制作了一个简易的Unity聊天室

服务器:用C# .Net Framework写的

结构分为:main(主函数)、Server类(用于服务器的开启和接收客户端连接)、Client类(接收消息和发送消息)、Message类(用于消息的解析和包装)

main:

    class Program
{ static void Main(string[] args)
{
string ip = "127.0.0.1";//这个ip地址表示本机
int port = 6688; //测试用的端口号,应该可以自己随便写吧
Server server = new Server(ip, port);
server.Start(); Console.ReadKey();
} }

Server:

    public class Server
{
private Socket serverSocket = null;
private List<Client> clientList = new List<Client>();
private Socket clientSocket = null; public Server() { } public Server(string ip,int port)
{
//创建socket,然后绑定ip地址和端口号
//传输类型是流,使用的协议是Tcp
serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
EndPoint point = new IPEndPoint(IPAddress.Parse(ip), port);
serverSocket.Bind(point);
} public void Start()
{
serverSocket.Listen(0); //开始监听 0表示等待连接队列的最大数
Console.WriteLine("开始监听");
Console.WriteLine("等待客户端连接");
serverSocket.BeginAccept(AcceptCallBack, null); //等待客户端连接,AcceptCallBack是回调,第三个参数目前还没用过,没去了解作用 TODO
} private void AcceptCallBack(IAsyncResult ar)
{
clientSocket = serverSocket.EndAccept(ar);
Console.WriteLine("一个客户端连接");
Client client = new Client(clientSocket,this); //当客户端连接上后,用Client类处理消息的接收与发送
clientList.Add(client);
client.Start(); serverSocket.BeginAccept(AcceptCallBack, null); //服务器继续等待其他客户端连接
} public void Broadcast(string message) //广播消息
{
foreach(Client client in clientList)
{
client.SendMessage(message);
}
}
}

Client:

public class Client
{
private Socket clientSocket;
private Server server;
private Message msg = new Message(); public Client() { } public Client(Socket clientSocket,Server server)
{
this.clientSocket = clientSocket;
this.server = server;
} public void Start()
{
//判断客户端是否被关闭
if (clientSocket.Connected == false || clientSocket.Poll(10, SelectMode.SelectRead))
{
clientSocket.Close();
return;
}
//等待从客户端的消息的接收
clientSocket.BeginReceive(msg.data, 0, msg.data.Length, SocketFlags.None, ReceiveCallBack, null);
} private void ReceiveCallBack(IAsyncResult ar)
{
try
{
//需要用try catch 捕捉异常,不然出现异常服务器会终止
//判断客户端是否被关闭
if (clientSocket.Connected==false || clientSocket.Poll(10,SelectMode.SelectRead))
{
clientSocket.Close();
return;
} int len = clientSocket.EndReceive(ar);//返回的len表示接收的数据长度
if (len == 0)//客户端被关闭了 服务端会接收到0字节的消息
{
clientSocket.Close();
return;
} msg.Read(len, OnProessMassage);//Message类解析消息
//Console.WriteLine("receive:" + message); clientSocket.BeginReceive(msg.data, 0, msg.data.Length, SocketFlags.None, ReceiveCallBack, null);
}
catch (Exception e)
{
Console.WriteLine("ReceiveCallBack:" + e);
} } private void OnProessMassage(string msg)
{
server.Broadcast(msg);//通过服务器广播消息
} public void SendMessage(string message)
{
 //判断客户端是否被关闭 发送的时候客户端也可能被关闭
if (clientSocket.Connected == false || clientSocket.Poll(10, SelectMode.SelectRead))
{
clientSocket.Close();
return;
} //MethodInfo mi = msg.GetType().GetMethod("Pack"); clientSocket.Send(msg.Pack(message));//发送消息给客户端
//Console.WriteLine("send:"+message);
} }

Message:

 //这里只是简单的处理消息;解析:从byte[] ->string;发送:string->byte[]

    class Message
{ public byte[] data = new byte[1024]; public void Read(int len,Action<string>OnProessMessage)
{
string message = Encoding.UTF8.GetString(data, 0, len);
OnProessMessage(message);
Array.Clear(data, 0, len);
} public byte[] Pack(string msg)
{
byte[] dataBytes = Encoding.UTF8.GetBytes(msg);
return dataBytes;
} }

Unity 简易聊天室(基于TCP)(1)的更多相关文章

  1. 学习JavaSE TCP/IP协议与搭建简易聊天室

    一.TCP/IP协议 1.TCP/IP协议包括TCP.IP和UDP等 2.域名通过dns服务器转换为IP地址 3.局域网可以通过IP或者主机地址寻找到相应的主机 4.TCP是可靠的连接,效率低,且连接 ...

  2. 基于Node.js + WebSocket 的简易聊天室

    代码地址如下:http://www.demodashi.com/demo/13282.html Node.js聊天室运行说明 Node.js的本质就是运行在服务端的JavaScript.Node.js ...

  3. Java实现简易聊天室

    Java实现简易聊天室 在学习<Java从入门到精通>这本书,网络通信,基于TCP实现的简易聊天室,我这里对书中的代码略做了修改,做个记录. 这里先放一下运行效果图,代码放在最后. 运行效 ...

  4. Socket实现简易聊天室,Client,Server

    package seday08; import java.io.BufferedWriter;import java.io.OutputStream;import java.io.OutputStre ...

  5. Django中使用websocket并实现简易聊天室

    django使用websocket并实现简易聊天室 django默认只支持http协议 如果你想让django即支持http协议又支持websocket协议,则需要做以下配置 前期配置 前提需要安装c ...

  6. php+websocket搭建简易聊天室实践

    1.前言 公司游戏里面有个简单的聊天室,了解了之后才知道是node+websocket做的,想想php也来做个简单的聊天室.于是搜集各种资料看文档.找实例自己也写了个简单的聊天室. http连接分为短 ...

  7. node.js+websocket实现简易聊天室

    (文章是从我的个人主页上粘贴过来的,大家也可以访问我的主页 www.iwangzheng.com) websocket提供了一种全双工客户端服务器的异步通信方法,这种通信方法使用ws或者wss协议,可 ...

  8. php_D3_“简易聊天室 ”实现的关键技术 详解

                      PHP+MySQL实现Internet上一个简易聊天室的关键技术  系统目标: 聊天室使用数据库汇集每个人的发言,并可将数据库内的发言信息显示在页面,让每个用户都可 ...

  9. Python开发【笔记】:aiohttp搭建简易聊天室

    简易聊天室: 1.入口main.py import logging import jinja2 import aiohttp_jinja2 from aiohttp import web from a ...

  10. 示例:Socket应用之简易聊天室

    在实际应用中,Server总是在指定的端口上监听是否有Client请求,一旦监听到Client请求,Server就会启动一个线程来响应该请求,而Server本身在启动完线程之后马上又进入监听状态. 示 ...

随机推荐

  1. UPPER VSCODE

  2. C#实现不用随机函数(Random)的洗牌算法

    代码不多,先看效果: 类代码: 1 static class ShuffleCards 2 { 3 private static int lastHash = 0; 4 public static v ...

  3. uni-app学习笔记之----getCurrentPages()的使用

    1.判断是否是首页 如果得到数组元素只有一个,说明是首页 2.得到页面中的信息 得到数组中的第一个元素代表首页,最后一个元素代表当前页

  4. 性能测试-性能分析思路以及CPU

    1.性能分析思路 性能测试分析的思路:先分析硬件 .网络. 系统配置.应用程序 硬件: cpu.内存.磁盘.网络.io 4.常见问题处理4.1 常见问题及解决方法如果r经常大于4,且id经常少于40, ...

  5. nginx status code 状态码

    目录 1XX 临时响应并需要请求者继续执行操作的状态代码 2XX 成功功处理了请求的状态代码 3XX 重定向 要完成请求,需要进一步操作 通常用来重定向 4XX 表示请求可能出错,妨碍了服务器的处理 ...

  6. uniapp打包h5

    1. 找到项目中 manifest.json --- H5 配置---运行时的基础路径, 将路径修改为 相对路径(./ ) 注意: 1.运行的基础路径系统默认打包路径为绝对路径,如不改,打包时找不到对 ...

  7. 掌控安全学院SQL注入靶场-布尔盲注(二)

    首页打开如下 判断注入 闭合报错 先判断数据库的长度....

  8. C++11 变长参数模板 & 如何展开变长参数

    https://blog.csdn.net/CodeBowl/article/details/119902935 通过typename ... Args指定变长参数. 通常通过递归展开各个参数, 使用 ...

  9. 《Rust权威指南》学习笔记——4. 认识所有权

    Rust权威指南学习笔记--认识所有权 什么是所有权 1. 所有权规则 Rust中的每一个值都有一个对应的变量作为它的所有者. 在同一时间内,值有且仅有一个所有者. 当所有者离开自己的作用域时,它持有 ...

  10. ERA5气压层数据驱动WRF的一些问题

    感谢Dawn的建议,兰溪之水的WRF教程 参考了一些经验,并结合实际后,成功用ERA5驱动WRF.实际上,用ERA5数据驱动WRF的方法和用ERA-Interim 数据驱动WRF极其类似. 总结几点是 ...