服务器端程序

 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协议的更多相关文章

  1. 使用Servlet和JSP实现一个简单的Web聊天室系统

    1 问题描述                                                利用Java EE相关技术实现一个简单的Web聊天室系统,具体要求如下. (1)编写一个登录 ...

  2. 基于Server-Sent Event的简单聊天室 Web 2.0时代,即时通信已经成为必不可少的网站功能,那实现Web即时通信的机制有哪些呢?在这门项目课中我们将一一介绍。最后我们将会实现一个基于Server-Sent Event和Flask简单的在线聊天室。

    基于Server-Sent Event的简单聊天室 Web 2.0时代,即时通信已经成为必不可少的网站功能,那实现Web即时通信的机制有哪些呢?在这门项目课中我们将一一介绍.最后我们将会实现一个基于S ...

  3. 网络编程(学习整理)---2--(Udp)实现简单的控制台聊天室

    1.UDP协议: 总结一下,今天学习的一点知识点! UDP也是一种通信协议,常被用来与TCP协议作比较!我们知道,在发送数据包的时候使用TCP协议比UDP协议安全,那么到底安全在哪里呢?怎么理解呢! ...

  4. 网络编程(学习整理)---1--(Tcp)实现简单的控制台聊天室

    1.简单的聊天室(控制台): 功能实现: 客户端和服务端的信息交流: 2.牵扯到的知识点: 这个我大概说一下,详细后面见代码! 1) 网络通讯的三要素 1. IP 2. 端口号. 3. 协议   2) ...

  5. 基于react+react-router+redux+socket.io+koa开发一个聊天室

    最近练手开发了一个项目,是一个聊天室应用.项目虽不大,但是使用到了react, react-router, redux, socket.io,后端开发使用了koa,算是一个比较综合性的案例,很多概念和 ...

  6. 实现一个简单的WebSocket聊天室

    WebSocket 简介 WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议. WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主 ...

  7. 利用socket.io实现多人聊天室(基于Nodejs)

    socket.io简单介绍 在Html5中存在着这种一个新特性.引入了websocket,关于websocket的内部实现原理能够看这篇文章.这篇文章讲述了websocket无到有,依据协议,分析数据 ...

  8. 基于Node.js+socket.IO创建的Web聊天室

    这段时间进了一个新的项目组,项目是用Appcan来做一个跨平台的移动运维系统,其中前台和后台之间本来是打算用WebSocket来实现的,但写好了示例后发现android不支持WebSocket,大为受 ...

  9. 以C#编写的Socket服务器的Android手机聊天室Demo

    内容摘要 1.程序架构 2.通信协议 3.服务器源代码 4.客户端源代码 5.运行效果 一.程序架构 在开发一个聊天室程序时,我们可以使用Socket.Remoting.WCF这些具有双向通信的协议或 ...

随机推荐

  1. RabbitMQ学习以及与Spring的集成(三)

    本文介绍RabbitMQ与Spring的简单集成以及消息的发送和接收. 在RabbitMQ的Spring配置文件中,首先需要增加命名空间. xmlns:rabbit="http://www. ...

  2. Promise & Deferred Objects in JavaScript Pt.2: in Practice

    原文:http://blog.mediumequalsmessage.com/promise-deferred-objects-in-javascript-pt2-practical-use Intr ...

  3. ubuntu 12.04配置mac的Lion主题的风格

    1.下载mac壁纸 http://drive.noobslab.com/data/wallpapers/Mac-os-x-Wallpapers%28NoobsLab.com%29.zip 根据自己喜好 ...

  4. AOP-通知-笔记

    说到AOP肯定会想到切面.通知.切点等等.那什么是通知呢?之前我一直以为我们所说的通知就是我们写在切面中的方法,但是随着AOP认识的加深,现在发现所谓的通知不仅仅是我们写在切面中的方法,通知方法只是通 ...

  5. 私有仓库harbor安装包括https

    1. 下载离线的 harbor gz包 wget https://github.com/vmware/harbor/releases/download/v1.2.0/harbor-offline-in ...

  6. 记一次爬虫经历(友话APP的Web端)

    背景:学校为迎接新生举办了一个活动,在友话APP的校园圈子内发布动态即可参与活动,最终抽取数名同学赠送福利. 分析:动态的数量会随着迎新的开始逐渐增加,人工统计显然不现实,因此可以使用爬虫脚本在友话A ...

  7. Flume性能测试报告(翻译Flume官方wiki报告)

    因使用flume的时候总是会对其性能有所调研,网上找的要么就是自测的这里找到一份官方wiki的测试报告供大家参考 https://cwiki.apache.org/confluence/display ...

  8. select * from * with ur

    DB2中,共有四种隔离级:RS,RR,CS,UR,DB2提供了这4种不同的保护级别来隔离数据.隔离级是影响加锁策略的重要环节,它直接影响加锁的范围及锁的持续时间.两个应用程序即使执行的相同的操作,也可 ...

  9. Linux Shell常用技巧(一)

    一.    特殊文件: /dev/null和/dev/tty Linux系统提供了两个对Shell编程非常有用的特殊文件,/dev/null和/dev/tty.其中/dev/null将会丢掉所有写入它 ...

  10. Spring Cloud和Dubbo整合开发笔记(1)

    一.需求背景: 公司内部老项目微服务技术栈使用Dubbo, 新项目技术栈使用主流的Spring Cloud相关组件开发,新旧项目涉及交互调用,无法直接通信数据传递. 老项目基于Dubbo,重构代码升级 ...