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这些具有双向通信的协议或 ...
随机推荐
- 事后诸葛亮之Alpha十天冲刺之失败总结
参考自构建之法p341页的模板 首先自己预计了一下,项目gg的可能有百分之50这里面有百分之80是我的责任.冲刺失败我承担主要责任. 1.设想和目标: 1.计划实现类似华为云的小功能之团队合作开发功能 ...
- log4jnet不记录日志的问题解决
背景:dll文件从别人项目里复制过来的,配置文件是从别的项目里配置过来的.然后就是不写日志. 最后经过搜索原项目,发现需要在AssemblyInfo.cs文件里加一段话, [assembly: log ...
- Android 高级UI设计笔记23:Android 夜间模式之 两种常用方法(降低屏幕亮度+替换theme)
1. 夜间模式 所谓的夜间模式,就是能够根据不同的设定,呈现不同风格的界面给用户,而且晚上看着不伤眼睛.特别是一些新闻类App实现夜间模式是非常人性化的,增强用户体验. 2. 我根据网上的资料 以及自 ...
- 理解JVM——类加载机制
我们在编写Java程序之后,会通过编译器得到一个class文件,这个class文件是如何与JVM进行配合的呢?类中的信息是如何变成JVM可以使用的Java类型呢?这些都是类加载机制做到的. 虚拟机把描 ...
- [HNOI2003]操作系统
嘟嘟嘟 这道题就是一个模拟. 首先我们建一个优先队列,存所有等待的进程,当然第一关键字是优先级从大到小,第二关键字是到达时间从小到大.然后再建一个指针Tim,代表cpu运行的绝对时间. 然后分一下几种 ...
- Day1 Spring初识(一)
在网上看到一篇文章,感觉写得挺不错的,转载一下,本文转载自:http://www.cnblogs.com/xdp-gacl/p/3707631.html和http://www.cnblogs.com/ ...
- 正则表达式详解<一>
正则表达式是一种处理字符串的微型语言:有以下的基本术语: l 模式(pattern):正则表达式实际上是通过字符串表达的一个模式 l 匹配(match): 判断正则表达式和给出的序列[first ...
- HashMap实现原理及源码分析之JDK7
攻克集合第一关!! 转载 http://www.cnblogs.com/chengxiao/ 哈希表(hash table)也叫散列表,是一种非常重要的数据结构,应用场景及其丰富,许多缓存技术(比如m ...
- Spring AOP源码分析(一)使用示例
摘要: 本文结合<Spring源码深度解析>来分析Spring 5.0.6版本的源代码.若有描述错误之处,欢迎指正. 我们知道,使用面向对象编程(OOP)有一些弊端,当需要为多个不具有继承 ...
- 移动端适配之sprite雪碧图背景定位
移动端适配一般我会使用rem进行适配,大致操作就是按照一定尺寸设计稿进行制作,最后将所有px值转换为rem,但是一些手机背景精灵图(cssSprite)就会出现一些误差(1px左右),如果公司要求不高 ...