【Unity3D自学记录】Unity3D网络之Socket聊天室初探
首先创建一个服务端程序,这个程序就用VS的控制台程序做即可了。
代码例如以下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Sockets;namespace SocketServer
{class Program{const int Port = 20000; //设置连接portstatic void Main(string[] args){// 初始化serverIPSystem.Net.IPAddress SocketIP = System.Net.IPAddress.Parse("127.0.0.1");// 创建TCP侦听器TcpListener listener = new TcpListener(SocketIP, Port);listener.Start();// 显示server启动信息Console.WriteLine("服务开启中...\n");// 循环接受客户端的连接请求while (true){ChatClient client = new ChatClient(listener.AcceptTcpClient());// 显示连接客户端的IP与portConsole.WriteLine(client._clientIP + " 添�...\n");}}}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
using System.Net.Sockets;namespace SocketServer
{class ChatClient{public static Hashtable ALLClients = new Hashtable(); // 客户列表private TcpClient _client; // 客户端实体public string _clientIP; // 客户端IPprivate string _clientNick; // 客户端昵称private byte[] data; // 消息数据private bool ReceiveNick = true;public ChatClient(TcpClient client){this._client = client;this._clientIP = client.Client.RemoteEndPoint.ToString();// 把当前客户端实例加入�到客户列表其中ALLClients.Add(this._clientIP, this);data = new byte[this._client.ReceiveBufferSize];// 从服务端获取消息client.GetStream().BeginRead(data, 0, System.Convert.ToInt32(this._client.ReceiveBufferSize), ReceiveMessage, null);}// 从客戶端获取消息public void ReceiveMessage(IAsyncResult ar){int bytesRead;try{lock (this._client.GetStream()){bytesRead = this._client.GetStream().EndRead(ar);}if (bytesRead < 1){ALLClients.Remove(this._clientIP);Broadcast(this._clientNick + "离开聊天室");return;}else{string messageReceived = System.Text.Encoding.ASCII.GetString(data, 0, bytesRead);if (ReceiveNick){this._clientNick = messageReceived;Broadcast(this._clientNick + "加入聊天室");ReceiveNick = false;}else{Broadcast(this._clientNick + ":" + messageReceived);}}lock (this._client.GetStream()){this._client.GetStream().BeginRead(data, 0, System.Convert.ToInt32(this._client.ReceiveBufferSize), ReceiveMessage, null);}}catch (Exception ex){ALLClients.Remove(this._clientIP);Broadcast(this._clientNick + "离开聊天室");}}// 向客戶端发送消息public void sendMessage(string message){try{System.Net.Sockets.NetworkStream ns;lock (this._client.GetStream()){ns = this._client.GetStream();}// 对信息进行编码byte[] bytesToSend = System.Text.Encoding.ASCII.GetBytes(message);ns.Write(bytesToSend, 0, bytesToSend.Length);ns.Flush();}catch (Exception ex){}}// 向客户端广播消息public void Broadcast(string message){Console.WriteLine(message);foreach (DictionaryEntry c in ALLClients){((ChatClient)(c.Value)).sendMessage(message + Environment.NewLine);}}}
}
这个比較简单啊,我就直接拷贝了别人的代码,比較好理解,适合新手~~~(如有侵犯版权,请私信联系我)
接下来就是Unity这边的代码了~
代码例如以下:
using UnityEngine;
using System.Collections;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Text;
using System.Net.Sockets;public class ScoketClient : MonoBehaviour
{const int Port = 20000;//port号与服务端port相应private TcpClient client;byte[] data;public string UserName = "";//usernamepublic string message = "";//聊天内容public string sendMsg = "";//输入框void OnGUI(){UserName = GUI.TextField(new Rect(10, 10, 100, 20), UserName);message = GUI.TextArea(new Rect(10, 40, 300, 200), message);sendMsg = GUI.TextField(new Rect(10, 250, 210, 20), sendMsg);if (GUI.Button(new Rect(120, 10, 80, 20), "连接server")){this.client = new TcpClient();this.client.Connect("127.0.0.1", Port);data = new byte[this.client.ReceiveBufferSize];SendSocket(UserName);this.client.GetStream().BeginRead(data, 0, System.Convert.ToInt32(this.client.ReceiveBufferSize), ReceiveMessage, null);};if (GUI.Button(new Rect(230, 250, 80, 20), "发送")){SendSocket(sendMsg);sendMsg = "";};}public void SendSocket(string message){try{NetworkStream ns = this.client.GetStream();byte[] data = System.Text.Encoding.ASCII.GetBytes(message);ns.Write(data, 0, data.Length);ns.Flush();}catch (Exception ex){}}public void ReceiveMessage(IAsyncResult ar){try{int bytesRead;bytesRead = this.client.GetStream().EndRead(ar);if (bytesRead < 1){return;}else{message += System.Text.Encoding.ASCII.GetString(data, 0, bytesRead);}this.client.GetStream().BeginRead(data, 0, System.Convert.ToInt32(this.client.ReceiveBufferSize), ReceiveMessage, null);}catch (Exception ex){}}
}
这样就能够了~先开启服务端,然后在用client连接。
这里用的编码是ASCII。假设想用中文的话改成UTF-8,或者GB2312。
转载于:https://www.cnblogs.com/hrhguanli/p/3946884.html
【Unity3D自学记录】Unity3D网络之Socket聊天室初探相关推荐
- Linux socket聊天室
目录 一.运行效果 1.分别编译客户端和服务端代码 2.运行 3.使用效果 二.代码 chat.h 服务端代码 客户端代码 一.运行效果 1.分别编译客户端和服务端代码 gcc client.c -o ...
- java仿聊天室项目总结_Java团队课程设计-socket聊天室(个人总结)
Java团队课程设计-socket聊天室(个人总结) 一.团队课程设计博客链接 二.本人负责模块或任务说明 任务1 服务端对socket线程的接受以及对客户端的数据转发操作 任务2 数据库的查找,添加 ...
- java仿聊天室项目总结_Java团队课程设计-socket聊天室(Day4总结篇)
Java团队课程设计-socket聊天室(Day4总结篇) 团队名称: ChatRoom 项目git地址: git提交记录(仅截取部分): 面向对象设计包图.类图 包图 UML类图 总结: 首先总结一 ...
- 【计算机网络】Socket聊天室程序
计算机网络第一次实验报告 实验名称:Socket聊天室程序 实验内容 使用流式Socket设计聊天协议,聊天信息带有时间标签和类型标签,本报告中将说明交互消息的类型.语法.语义.时序等具体的消息处理方 ...
- 从0实现基于Linux socket聊天室-实现聊天室的公聊、私聊功能-4
前面文章链接如下: <从0实现基于Linux socket聊天室-多线程服务器模型-1> <从0实现基于Linux socket聊天室-多线程服务器一个很隐晦的错误-2> &l ...
- 基于C#的socket聊天室(附源码)
基于C#-socket聊天室 前言 源代码:https://gitee.com/TL0902/term/blob/master/C%23%E8%81%8A%E5%A4%A9%E5%AE%A4/Tcha ...
- Python实现网络多人聊天室
网络多人聊天室 相关连接:Python实现网络图形化界面多人聊天室 文件结构: chatroom ├── client.py # 客户端代码 ├── language.py # 语言文件 ├── ...
- C#+Socket 聊天室(实现公网通信 客户端-服务器端-客户端)
文章目录 简述 功能演示视频(b站) 准备工作 服务器端 服务器端界面 服务器端代码 客户端 客户端界面 客户端代码 总结 简述 关于Socket的原理我就不在这里赘述了,有大佬已经作详细的说明了: ...
- 网络编程项目(聊天室项目)
一.实现目标 一个在Linux下可以使用的聊天软件,要求至少实现如下功能: 1. 采用Client/Server架构 2. Client A 登陆聊天服务器前,需要注册自己的ID和密码 3. 注册成功 ...
最新文章
- Java多线程(九)—— interrupt()和线程终止方式
- PST文件的读取(待整理)
- 计算机态,(计算机)有限态自动机,FSM(finite state machine),音标,读音,翻译,英文例句,英语词典...
- alientek 3.5寸tftlcd模块资料_电冰箱触摸屏提高设备档次,深圳3.5寸人机界面厂家...
- Transformer提效之路干货笔记——一文梳理各种魔改版本Transformer
- 拓端tecdat|Matlab用BUGS马尔可夫区制转换Markov switching随机波动率SV模型、序列蒙特卡罗SMC、Metropolis Hastings采样分析时间序列数据
- [C/C++] C++笔试常见问题
- RemObjects Remoting SDK-SEO狼术
- 网络工程师常见面试题,1分钟就能看完
- 百度坐标拾取html,百度地图API获取地址拾取坐标代码
- scrum master_你能使我成为一个scrum master吗
- 小彩蛋:springboot banner 在线生成
- PowerBI-时间智能函数-PARALLELPERIOD
- 使用Onekey Ghost安装器一键还原系统的方法
- 全微分 与 方向导数
- bump map(凹凸贴图)的一个简单生成方法
- oracle入门学习
- 使用PowerApps制作请假系统(一)--创建SharePoint列表以及PowerApps主题部分
- ifix自定义声音报警(自动执行脚本)
- tcpdump抓包工具离线安装和使用
热门文章
- ctc网络结构中接口服务器信号交换的方式有哪些,通信工程复习资料
- 显示所有大写字母python_python 输出所有大小写字母的方法
- h5下划线怎么设置_【Word技巧】毕业论文封面那条永远对不齐的下划线?
- python 字符串的(乘法和in)(一分钟读懂)
- python 缺省参数_week04_python函数缺省值
- python属于哪类型的编程语言_Python是什么类型的编程语言,有什么特性
- 计算机算法设计与分析 最长递增子序列
- 数组模拟乘法(大数乘法)
- AcWing 1054. 股票买卖
- ~~一般哈希(数据结构)(附模板题AcWing 840 模拟散列表)