TCP实现一个简易的聊天室 (Unity&&C#完成)
效果展示

TCP
Transmission Control Protocol 传输控制协议
TCP是面向连接的流模式(俗称:网络流)。即传输数据之前源端和终端建立可靠的连接,保证数据传输的正确性。
流模式:由于建立连接,收到的数据都是同一主机发送的,所有可以发送端Write一次,接收端Read多次;也可以发送端Write多次,接收端Read多次。但每次传输数据最大为1460字节。
实现步骤
服务端 客户端
获取本机终结点 获取服务器终结点
创建TcpListener对象,开启侦听器 创建TcpClient对象
等待客户端连接 连接服务器
获取针对客户端连接的网络流客户端通信 通过网络流与服务器通信
…… ……
关闭连接 关闭连接
using System.Collections;
using System.Collections.Generic;
using System.Net.Sockets;
using UnityEngine;
using Common;
using UnityEngine.UI;
using System.Net;
using System;
using System.Text; /// <summary>
/// TCP 客户端 发送消息
/// </summary>
public class ChatTCPClientTest : MonoBehaviour
{
private InputField messageInput;
private TcpClient tcpClient;
private void Start()
{ var server = FindObjectOfType<ChatTCPServerTest>();
IPEndPoint ep = new IPEndPoint(IPAddress.Parse(server.serverIP), server.serverPort);
//创建终结点
tcpClient = new TcpClient();
//1. 创建Socket
tcpClient.Connect(ep); ////三次握手(连接请求)
//使用指定的远程网络终结点将客户端连接到TCP主机
messageInput = transform.FindChildByName("MessageInput").GetComponent<InputField>();
transform.FindChildByName("Send").GetComponent<Button>().onClick.AddListener(OnSendButtonClient);
} private void OnSendButtonClient()
{
SendChatMessage(messageInput.text);
}
private void SendChatMessage(string msg)
{
//获取网络流
NetworkStream stream = tcpClient.GetStream();
//用于发送消息和接收消息 byte[] dgramContent = Encoding.UTF8.GetBytes(msg);
//传入内容
stream.Write(dgramContent, , dgramContent.Length);
//写入网络流 内容 从那开始发 发的长度
}
/// <summary>
/// 3.关闭连接/释放资源
/// </summary>
private void OnApplicationQuit()
{
tcpClient.Close();
}
}
ChatTCPClientTest
using System.Collections;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using UIWidgetsSamples;
using UnityEngine;
using Common;
using System; /// <summary>
/// 服务端 TCP 接收消息
/// </summary>
public class ChatTCPServerTest : MonoBehaviour
{
public string serverIP;
//IP
public int serverPort;
//端口
//1.创建Socket对象
private ChatView chatView;
private void Start()
{
chatView = transform.FindChildByName("ChatView").GetComponent<ChatView>();
IPEndPoint ep = new IPEndPoint(IPAddress.Parse(serverIP), serverPort);
//1). 创建对象并开启监听
serverlisten = new TcpListener(ep);//需要一个终结点
serverlisten.Start(); //2.线程
thread = new Thread(ReceiveClient);
thread.Start();
}
private TcpListener serverlisten;
private Thread thread;
//2.开启监听
//3.接收数据 显示
private void ReceiveClient()
{
TcpClient client = serverlisten.AcceptTcpClient();
//接收消息 //AcceptTcpClient() 接受挂起连接请求
NetworkStream stream = client.GetStream();
//读取网络流到容器
byte[] date = new byte[];
//返回读了多少字节
//Read读取消息 如果没有读取到 线程阻塞
//如果有多个客户端 要循环接收 将读到的信息放到线程中
int count;
while((count=stream.Read(date,,date.Length))>) //count为0 表示客户端下线
{
//解析
string msg = Encoding.UTF8.GetString(date);
ThreadCrossHelper.Instance.ExecuteOnMainThread(() => { ShowMessage(msg); });
}
client.Close();//关闭Socket对象 自动释放流 } private void ShowMessage(string msg)
{
chatView.DataSource.Add(new ChatLine()
{
UserName = "AnnS",
Message = msg,
Time = DateTime.Now,
Type = ChatLineType.User,
});
}
//4.关闭
public void OnApplicationQuit()
{
thread.Abort();
serverlisten.Stop();
}
}
ChatTCPServerTest
中间发生连接请求过程(三次握手) , 断开连接(四次挥手)
三次握手
所谓三次握手就是建立TCP连接的过程,需要客户端和服务端总共发送3个包确认连接成功。在socket编程中,这一过程由客户端执行connect来触发。
简而言之:
第一次,客户端向服务端发出连接请求数据包。 “我想跟你聊会,可以吗?”
第二次,服务端向客户端发送同意连接和要求同步的数据包。“可以,什么时候啊?”
第三次,客户端再发出一个数据包确认服务器的同步要求。“就现在。”
四次挥手
所谓四次挥手就是终止TCP连接的过程,需要客户端和服务端总共发送4个包以确认连接断开。在socket编程中,这一过程由客户端或服务端任一方执行close来触发
简而言之:
第一次,客户端向服务端发送断开请求数据包。 “我都说完了,今天就到这吧”
第二次,服务端向客户端发送同意断开数据包。“恩,好的。”
第三次,服务端再向客户端发送断开请求数据报。“那我挂了啊?”
第四次,客户端再向服务端发送确认断开数据报。“拜拜”
此时服务端断开连接,客户端过会发现服务端没有回复,也断开连接。
TCP实现一个简易的聊天室 (Unity&&C#完成)的更多相关文章
- UDP实现一个简易的聊天室 (Unity&&C#完成)
效果展示(尚未完善) UDP User Data Protocol 用户数据报协议 概述 UDP是不连接的数据报模式.即传输数据之前源端和终端不建立连接.使用尽最大努力交付原则,即不保证可靠交付. 数 ...
- 与众不同 windows phone (30) - Communication(通信)之基于 Socket TCP 开发一个多人聊天室
原文:与众不同 windows phone (30) - Communication(通信)之基于 Socket TCP 开发一个多人聊天室 [索引页][源码下载] 与众不同 windows phon ...
- C 基于UDP实现一个简易的聊天室
引言 本文是围绕Linux udp api 构建一个简易的多人聊天室.重点看思路,帮助我们加深 对udp开发中一些api了解.相对而言udp socket开发相比tcp socket开发注意的细节要少 ...
- 与众不同 windows phone (31) - Communication(通信)之基于 Socket UDP 开发一个多人聊天室
原文:与众不同 windows phone (31) - Communication(通信)之基于 Socket UDP 开发一个多人聊天室 [索引页][源码下载] 与众不同 windows phon ...
- Java进阶:基于TCP通信的网络实时聊天室
目录 开门见山 一.数据结构Map 二.保证线程安全 三.群聊核心方法 四.聊天室具体设计 0.用户登录服务器 1.查看当前上线用户 2.群聊 3.私信 4.退出当前聊天状态 5.离线 6.查看帮助 ...
- [SignalR]一个简单的聊天室
原文:[SignalR]一个简单的聊天室 1.说明 开发环境:Microsoft Visual Studio 2010 以及需要安装NuGet. 2.添加SignalR所需要的类库以及脚本文件: 3. ...
- 用ServletContext做一个简单的聊天室
这里主要是ServletContext的一个特性:ServletContext是一个公共的空间,可以被所有的客户访问.由此可见ServletContext比cookie和session的作用范围要大[ ...
- 基于websocket实现的一个简单的聊天室
本文是基于websocket写的一个简单的聊天室的例子,可以实现简单的群聊和私聊.是基于websocket的注解方式编写的.(有一个小的缺陷,如果用户名是中文,会乱码,不知如何处理,如有人知道,请告知 ...
- WebSocket介绍和一个简单的聊天室
WebSocket是什么呢? WebSocket一种在单个 TCP 连接上进行全双工通讯的协议.WebSocket通信协议于2011年被IETF定为标准RFC 6455,并被RFC7936所补充规范, ...
随机推荐
- np.array()
将列表list或元组tuple转换为 ndarray 数组. numpy.array(object, dtype=None, copy=True, order=None, subok=False, n ...
- LibreOJ 6277 数列分块入门 1(分块)
题解:感谢hzwer学长和loj让本蒟蒻能够找到如此合适的入门题做. 这是一道非常标准的分块模板题,本来用打标记的线段树不知道要写多少行,但是分块只有这么几行,极其高妙. 代码如下: #include ...
- 浅谈QT打印功能实现
QT作为一款轻量级的集成开发环境,其设计的目标是使开发人员利用QT这个应用程序框架更加快速及轻易的开发应用程序.要达到此目的,要求QT必须能够跨平台,QT能够在32位及64位的Linux,MAC OS ...
- Excel单元格内容拆分、合并
例:如何将EXCEL单元格A1中的“1-2-1”,在B1.C1.D1单元格中分别显示”1“.”2“.”1“.方法一: 在B1中输入“=mid(A1,1,1)”在C1中输入“=mid(AI,3,1)”在 ...
- js variable 变量
局部作用域 由于JavaScript的变量作用域实际上是函数内部,我们在for循环等语句块中是无法定义具有局部作用域的变量的: 'use strict'; function foo() { for ( ...
- linux下给php安装memcached及memcache扩展(转)
http://kimi.it/257.html (另外的方法)linux安装memcached及memcache扩展一.安装libevent函数库下载地址:http://libevent.org默认被 ...
- jquery获取radio单选框的值
1.获取原有单选框的值 var value=$("input[name='is_setting']:checked").val(); 2.获取重选后的单选框的值 <tr> ...
- datagrid分页 从后端获取数据也很简单
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Datagrid.aspx. ...
- css心得体会
非块级元素 要使得其有长宽的效果 可以设置 margin 和 padding 块级元素 可以直接设置 width 和 height div标签 要使得你内部元素居中 可 ...
- 【Maven】Nexus(Maven仓库私服)下载与安装
Nexus介绍 Nexus 是Maven仓库管理器,如果你使用Maven,你可以从Maven中央仓库 下载所需要的构件(artifact),但这通常不是一个好的做法,你应该在本地架设一个Maven仓库 ...