Unity 简易聊天室(基于TCP)(1)
为了准备毕业设计,学习了服务器与客户端之间传输的一些简单的知识,并跟着网络上的教程制作了一个简易的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)的更多相关文章
- 学习JavaSE TCP/IP协议与搭建简易聊天室
一.TCP/IP协议 1.TCP/IP协议包括TCP.IP和UDP等 2.域名通过dns服务器转换为IP地址 3.局域网可以通过IP或者主机地址寻找到相应的主机 4.TCP是可靠的连接,效率低,且连接 ...
- 基于Node.js + WebSocket 的简易聊天室
代码地址如下:http://www.demodashi.com/demo/13282.html Node.js聊天室运行说明 Node.js的本质就是运行在服务端的JavaScript.Node.js ...
- Java实现简易聊天室
Java实现简易聊天室 在学习<Java从入门到精通>这本书,网络通信,基于TCP实现的简易聊天室,我这里对书中的代码略做了修改,做个记录. 这里先放一下运行效果图,代码放在最后. 运行效 ...
- Socket实现简易聊天室,Client,Server
package seday08; import java.io.BufferedWriter;import java.io.OutputStream;import java.io.OutputStre ...
- Django中使用websocket并实现简易聊天室
django使用websocket并实现简易聊天室 django默认只支持http协议 如果你想让django即支持http协议又支持websocket协议,则需要做以下配置 前期配置 前提需要安装c ...
- php+websocket搭建简易聊天室实践
1.前言 公司游戏里面有个简单的聊天室,了解了之后才知道是node+websocket做的,想想php也来做个简单的聊天室.于是搜集各种资料看文档.找实例自己也写了个简单的聊天室. http连接分为短 ...
- node.js+websocket实现简易聊天室
(文章是从我的个人主页上粘贴过来的,大家也可以访问我的主页 www.iwangzheng.com) websocket提供了一种全双工客户端服务器的异步通信方法,这种通信方法使用ws或者wss协议,可 ...
- php_D3_“简易聊天室 ”实现的关键技术 详解
PHP+MySQL实现Internet上一个简易聊天室的关键技术 系统目标: 聊天室使用数据库汇集每个人的发言,并可将数据库内的发言信息显示在页面,让每个用户都可 ...
- Python开发【笔记】:aiohttp搭建简易聊天室
简易聊天室: 1.入口main.py import logging import jinja2 import aiohttp_jinja2 from aiohttp import web from a ...
- 示例:Socket应用之简易聊天室
在实际应用中,Server总是在指定的端口上监听是否有Client请求,一旦监听到Client请求,Server就会启动一个线程来响应该请求,而Server本身在启动完线程之后马上又进入监听状态. 示 ...
随机推荐
- Qt实现抽奖程序
一.简介 该程序命名为Lucky,实现的功能如下: 1. 加载抽奖人员名单,并保存加载路径: 2. 单击左键或者点击ctrl+s开始抽奖,并滚动显示人员名单,显示的人员名单格式为 部门-姓名. 3. ...
- didi-笔试
import java.util.*; /** * 正整数,没有前导0 * 相邻的数字不能相同 * 可以被3整除 * 输入:?12?0?9?? * 输出:212101902 */ public cla ...
- 7、Taylor公式(泰勒公式)通俗+本质详解
参考:https://zhuanlan.zhihu.com/p/392808684 1.比较通俗地讲解一下泰勒公式是什么. 泰勒公式,也称泰勒展开式.是用一个函数在某点的信息,描述其附近取值的公式.如 ...
- automagic webUI 自动化
https://www.cnblogs.com/tsbc/p/6244268.html
- VMware导入ovf报错
如下图所示报错 在网上查找了一些解决方案,大都说是ovftool版本兼容问题,但是我这里好像并不行,最后的解决的办法是对导入的位置默认不做改动. 报错原因:改变了默认路径.
- Linux命令-df
场景: df -h查看磁盘信息 /dev/mapper/rl-root 96% du -h --max-depth=1 命令代表寻找当前目录,哪个文件夹占用空间最大,进入根目录: [root@loca ...
- Linux shell 获取路径、文件名、文件后缀
以 make 文件为例: file=/usr/bin/make [root@CentOs7]# echo ${file%*/} /usr/bin/make [root@CentOs7]# echo $ ...
- gRPC 入门(一)
前言 在学习 gRPC 之前,先学习 protobufu 协议,简单的来理解,我们可以使用他来定义 消息 和 服务.然后你只需要实现服务即可,剩下的东西,gRPC 会帮你自动完成. protobufu ...
- eval()
s='12*2'd=eval(s)#字符串运算函数print(d) 结果: 24
- Mybatis二级缓存(1)