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这些具有双向通信的协议或 ...
随机推荐
- php操作redis的两个个小脚本
redis这东西,查询起来没有mysql那么方便,只能自己写脚本了.下面是工作中写的两个小脚本 第一个脚本,查找有lottery|的键,将他们全部删除|打印出来 <?php $redis = n ...
- SQL Server 中的排名函数与使用场景
1.RowNumber() Over (oder by.....) 在需要对某个不连续ID的表进行排序时使用 2.ROW_NUMBER() over(PARTITION by ...... ord ...
- Ceph块存储介绍
1. 块存储是什么 块存储简称RBD(RADOS Block Device),是一种有序的字节序块,也是在Ceph三大存储类型中最为常用的存储方式 ,Ceph的块存储是基于RADOS的,因此它也借助R ...
- 2018 ACM-ICPC 中国大学生程序设计竞赛线上赛 F题 Clever King(最小割)
2018 ACM-ICPC 中国大学生程序设计竞赛线上赛:https://www.jisuanke.com/contest/1227 题目链接:https://nanti.jisuanke.com/t ...
- BZOJ3530:[SDOI2014]数数(AC自动机,数位DP)
Description 我们称一个正整数N是幸运数,当且仅当它的十进制表示中不包含数字串集合S中任意一个元素作为其子串.例如当S=(22,333,0233)时,233是幸运数,2333.20233.3 ...
- macbook下 go 语言的 helloworld
go语言开发的目录 一般go语言$GOPATH 目录约定有三个子目录: src 存放源代码(比如:.go .c .h .s等) pkg 编译后生成的文件(比如:.a) bin 编译后生成的可执行文件( ...
- Day15 集合(二)
Set简介 定义 public interface Set<E> extends Collection<E> {} Set是一个继承于Collection的接口,即Set也是集 ...
- iPhone 电脑备份路径
C:\Users\iChen\AppData\Roaming\Apple Computer\MobileSync\Backup
- 从ByteBuffer中解析整数
前言 在解析Redis返回的消息中,有类似 $5\r\nredis\r\n的数据返回,当我们解析这种数据的时候,先解析出5这个数字,然后在取后续的5长度的字符串.当时在解析数字这块卡住了,于是看了 ...
- two sum[easy]
Given an array of integers, return indices of the two numbers such that they add up to a specific ta ...