为了准备毕业设计,学习了服务器与客户端之间传输的一些简单的知识,并跟着网络上的教程制作了一个简易的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. 【面试】TCP-IP经典

    整理之前的笔记,发现网络通信通俗易懂的解释. 搞清这15个问题,那你就精通了TCP! 网络协议那么多, 为什么面试喜欢问TCP? 原因无外乎两个: TCP协议直接与进程打交道,写网络程序要用: TCP ...

  2. Stream流常用API

    文档 https://www.runoob.com/java/java8-streams.html JDK8 Stream API: https://docs.oracle.com/javase/8/ ...

  3. 【傻瓜式教学】apache2 管理员用户运行(php无权限问题

    apache2 管理员用户运行(php无权限问题 代码亲身试过,绝无问题 apache版本: Server version: Apache/2.4.38 (Debian) Server built: ...

  4. [Docker-1自顶向下学习Docker

    本文目录: 什么是DOCKER? 什么是容器? 什么是DOCKER镜像? DOCKER有什么使用场景和优势? 流程图一:从中央仓库拉取镜像并部署 流程图二:上传镜像到中央私库 结语   什么是DOCK ...

  5. Linux 第四节(shell脚本,IF,do,for)

    Shell脚本 1.批处理式: 2.交互式: 脚本声明   #!/bin/bash 脚本注释   #fakba;kb 脚本命令   ls pwd bash test.sh   //执行test.sh脚 ...

  6. DC约束笔记

    关于get_pins get_cells get_ports等的定义 关于建立保持与max/min的关系 2.setup time和hold time 建立时间(setup time)是指在触发器的时 ...

  7. [转载] MATLAB | RGB image representation

    转载自https://www.geeksforgeeks.org/matlab-rgb-image-representation/ MATLAB | RGB image representation ...

  8. wpf dataGrid 获取单元格,并对单元格中的对象操作

    先上图: 要求:对第一行的"选项内容举例..."的控件进行隐藏,如下: 前端代码: <Window x:Class="DataGridPractice.MainWi ...

  9. BIP拓展js的使用

    __app.define("common_VM_Extend.js", function () {   var selectData = null;   var common_VM ...

  10. Zookeeper ZAB协议

    这篇博客是从源码的角度了解Zookeeper 从接收客户端请求开始,到返回数据为止,有很多涉及到的对象创建因为在前几篇文章已经说明过了,这里就不再重复的说明了,如果不是很明白的的,可以先看前几篇博文了 ...