Socket之简单的Unity3D聊天室__TCP协议
服务器端程序
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
namespace 聊天室_服务器端_TCP
{
class Program
{
//存放客户端
static List<Client> clientList = new List<Client>(); //广播消息
public static void BroadCastMessage(string message)
{
//创建未连接的list
var notConnectedList = new List<Client>();
foreach(Client client in clientList)
{
if (client.Connected) //给所有连接的客户端发送消息;
client.SendMessage(message);
else //把未连接的客户端加入list
{
notConnectedList.Add(client);
}
}
//移除未连接的客户端
foreach(var temp in notConnectedList)
{
clientList.Remove(temp);
}
} static void Main(string[] args)
{
//实例化服务器端Socket并指定IP地址类型(IPV4),套接字类型(流类型),通信协议(TCP)
Socket tcpServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //绑定终端(设置IP地址,端口号(范围为0-65535之间随意取,为避免端口号已被其他软件占用,可以取大点))
tcpServer.Bind(new IPEndPoint(IPAddress.Parse("192.168.0.107"), )); //开始监听,等待客户端接入,接入后执行后续操作
tcpServer.Listen();
Console.WriteLine("开始监听"); //循环等待客户端接入
while (true)
{ Socket ClientSocket = tcpServer.Accept();
Console.WriteLine("一个客户端连接进来了");
Client client = new Client(ClientSocket);
clientList.Add(client);
} }
}
}
Main
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks; namespace 聊天室_服务器端_TCP
{
public class Client
{
private Socket clientsocket;
private Thread t; //线程
private byte[] data = new byte[];
public Client(Socket s)
{
this.clientsocket = s; //启动一个线程,处理客户端数据接收
t = new Thread(ReceiveMessage);
t.Start();
} private void ReceiveMessage()
{
//一直接收客户端数据
while(true)
{
if(clientsocket.Poll(,SelectMode.SelectRead))
{
clientsocket.Close();
break;
}
int length= clientsocket.Receive(data);
string message = Encoding.UTF8.GetString(data, , length);
//接收到数据时,要把这个数据分发到客户端
//广播消息
Program.BroadCastMessage(message);
Console.WriteLine("收到消息:" + message);
}
} //发送消息给客户端
public void SendMessage(string message)
{
byte[] data = Encoding.UTF8.GetBytes(message);
clientsocket.Send(data);
} //判断是否连接
public bool Connected
{
get { return clientsocket.Connected; }
}
}
}
Client类
客户端
using System.Collections;
using System.Collections.Generic;
using System.Net.Sockets;
using UnityEngine;
using System.Net;
using System.Text;
using UnityEngine.UI;
using System.Threading; public class ChatManger : MonoBehaviour { public string ipaddress = "192.168.0.107";
public int port = ;
public Text Input; //InputField中显示输入的text
public Text Label; //聊天室显示的text private Socket client_socket;
private Thread t;
private byte[] data = new byte[]; //数据容器
private string message = ""; //消息容器
// Use this for initialization
void Start () {
OnConnectedToServer();
} // Update is called once per frame
void Update () {
if(message!=""&&message!=null)
{
Label.text += "\n" + message;
message = "";
}
} //连接至服务器,并创建一个新线程用于接受消息
public void OnConnectedToServer()
{
client_socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
client_socket.Connect(new IPEndPoint(IPAddress.Parse(ipaddress),port)); t = new Thread(ReceiveMessage);
t.Start();
} //接收消息
public void ReceiveMessage()
{
while(true)
{
if (client_socket.Poll(, SelectMode.SelectRead))
{
client_socket.Close();
break;
}
int length = client_socket.Receive(data);
message = Encoding.UTF8.GetString(data, , length);
//Label.text += "\n" + message; unity不允许在单独的线程里去操控其组件
}
}
//发送消息
public new void SendMessage(string message)
{
byte[] data = Encoding.UTF8.GetBytes(message);
client_socket.Send(data);
}
//点击发送按钮
public void OnSendButtonClick()
{ SendMessage(Input.text);
Input.GetComponentInParent<InputField>().text = "";
} //当Mono被销毁时调用此方法
private void OnDestroy()
{
client_socket.Shutdown(SocketShutdown.Both);
client_socket.Close();
}
}
客户端代码

Socket之简单的Unity3D聊天室__TCP协议的更多相关文章
- 使用Servlet和JSP实现一个简单的Web聊天室系统
1 问题描述 利用Java EE相关技术实现一个简单的Web聊天室系统,具体要求如下. (1)编写一个登录 ...
- 基于Server-Sent Event的简单聊天室 Web 2.0时代,即时通信已经成为必不可少的网站功能,那实现Web即时通信的机制有哪些呢?在这门项目课中我们将一一介绍。最后我们将会实现一个基于Server-Sent Event和Flask简单的在线聊天室。
基于Server-Sent Event的简单聊天室 Web 2.0时代,即时通信已经成为必不可少的网站功能,那实现Web即时通信的机制有哪些呢?在这门项目课中我们将一一介绍.最后我们将会实现一个基于S ...
- 网络编程(学习整理)---2--(Udp)实现简单的控制台聊天室
1.UDP协议: 总结一下,今天学习的一点知识点! UDP也是一种通信协议,常被用来与TCP协议作比较!我们知道,在发送数据包的时候使用TCP协议比UDP协议安全,那么到底安全在哪里呢?怎么理解呢! ...
- 网络编程(学习整理)---1--(Tcp)实现简单的控制台聊天室
1.简单的聊天室(控制台): 功能实现: 客户端和服务端的信息交流: 2.牵扯到的知识点: 这个我大概说一下,详细后面见代码! 1) 网络通讯的三要素 1. IP 2. 端口号. 3. 协议 2) ...
- 基于react+react-router+redux+socket.io+koa开发一个聊天室
最近练手开发了一个项目,是一个聊天室应用.项目虽不大,但是使用到了react, react-router, redux, socket.io,后端开发使用了koa,算是一个比较综合性的案例,很多概念和 ...
- 实现一个简单的WebSocket聊天室
WebSocket 简介 WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议. WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主 ...
- 利用socket.io实现多人聊天室(基于Nodejs)
socket.io简单介绍 在Html5中存在着这种一个新特性.引入了websocket,关于websocket的内部实现原理能够看这篇文章.这篇文章讲述了websocket无到有,依据协议,分析数据 ...
- 基于Node.js+socket.IO创建的Web聊天室
这段时间进了一个新的项目组,项目是用Appcan来做一个跨平台的移动运维系统,其中前台和后台之间本来是打算用WebSocket来实现的,但写好了示例后发现android不支持WebSocket,大为受 ...
- 以C#编写的Socket服务器的Android手机聊天室Demo
内容摘要 1.程序架构 2.通信协议 3.服务器源代码 4.客户端源代码 5.运行效果 一.程序架构 在开发一个聊天室程序时,我们可以使用Socket.Remoting.WCF这些具有双向通信的协议或 ...
随机推荐
- nginx反向代理跨域基本配置与常见误区
最近公司前后端分离,前端独立提供页面和静态服务很自然的就想到了用nginx去做静态服务器.同时由于跨域了,就想利用nginx的反向代理去处理一下跨域,但是在解决问题的同时,发现网上有些方案的确是存在一 ...
- cocos2d-x3.0 柱图
画柱图就是多画几个矩形之后放在一起,这个实现了基本功能还不够完好假设要用到项目中须要自己改动. 原文地址:http://blog.csdn.net/qqmcy/article/details/2598 ...
- javascript中对数组对象的深度拷贝
在前端开发的某些逻辑中,经常需要对现有的js对象创建副本,避免污染原始数据的情况. 如果是简单的一维数组对象,可以使用两个原生方法: 1.splice var arr1 = ['a', 'b', 'c ...
- 【洛谷】【线段树+位运算】P2574 XOR的艺术
[题目描述:] AKN觉得第一题太水了,不屑于写第一题,所以他又玩起了新的游戏.在游戏中,他发现,这个游戏的伤害计算有一个规律,规律如下 1. 拥有一个伤害串为长度为n的01串. 2. 给定一个范围[ ...
- PHP microtime() 函数
定义和用法 microtime() 函数返回当前 Unix 时间戳和微秒数. 语法 microtime(get_as_float) 参数 描述 get_as_float 如果给出了 get_as_fl ...
- Zookeeper框架Curator使用
本文参考自https://blog.csdn.net/wo541075754/article/details/69138878?utm_source=gold_browser_extension ht ...
- regex_search
在regex_match()里边只能看到regex和输入的字符串是不是全部匹配上了,匹配上了就返回true,否则false.然而他不能返回匹配到的子字符串:regex_search()和regex_m ...
- 初次接触ARM开发,理清这四个开发思路很重要!
初次接触ARM开发,理清这四个开发思路很重要! 由于涉及编程,学习ARM单片机系统对于从事电子电路的设计者来说是有些困难的,学习知识不难,难的是理清其中的开发思路,找到一个好的起点.本文就将从这一步入 ...
- 50个国内外最棒的C/C++源码站点分享
C/C++是最基本的编程语言.这里列出了50名优秀站点和网页清单,这些站点提供c/c++源码.这份清单提供了源码的链接以及它们的小说明.我已 尽力包含最佳的C/C++源码的站点.这不是一个完整的清单, ...
- SparkSQL执行时参数优化
近期接手了不少大数据表任务调度补数据的工作,补数时发现资源消耗异常的大且运行速度却不怎么给力. 发现根本原因在于sparkSQL配置有诸多问题,解决后总结出来就当抛砖引玉了. 具体现象 内存CPU比例 ...