效果展示

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#完成)的更多相关文章

  1. UDP实现一个简易的聊天室 (Unity&&C#完成)

    效果展示(尚未完善) UDP User Data Protocol 用户数据报协议 概述 UDP是不连接的数据报模式.即传输数据之前源端和终端不建立连接.使用尽最大努力交付原则,即不保证可靠交付. 数 ...

  2. 与众不同 windows phone (30) - Communication(通信)之基于 Socket TCP 开发一个多人聊天室

    原文:与众不同 windows phone (30) - Communication(通信)之基于 Socket TCP 开发一个多人聊天室 [索引页][源码下载] 与众不同 windows phon ...

  3. C 基于UDP实现一个简易的聊天室

    引言 本文是围绕Linux udp api 构建一个简易的多人聊天室.重点看思路,帮助我们加深 对udp开发中一些api了解.相对而言udp socket开发相比tcp socket开发注意的细节要少 ...

  4. 与众不同 windows phone (31) - Communication(通信)之基于 Socket UDP 开发一个多人聊天室

    原文:与众不同 windows phone (31) - Communication(通信)之基于 Socket UDP 开发一个多人聊天室 [索引页][源码下载] 与众不同 windows phon ...

  5. Java进阶:基于TCP通信的网络实时聊天室

    目录 开门见山 一.数据结构Map 二.保证线程安全 三.群聊核心方法 四.聊天室具体设计 0.用户登录服务器 1.查看当前上线用户 2.群聊 3.私信 4.退出当前聊天状态 5.离线 6.查看帮助 ...

  6. [SignalR]一个简单的聊天室

    原文:[SignalR]一个简单的聊天室 1.说明 开发环境:Microsoft Visual Studio 2010 以及需要安装NuGet. 2.添加SignalR所需要的类库以及脚本文件: 3. ...

  7. 用ServletContext做一个简单的聊天室

    这里主要是ServletContext的一个特性:ServletContext是一个公共的空间,可以被所有的客户访问.由此可见ServletContext比cookie和session的作用范围要大[ ...

  8. 基于websocket实现的一个简单的聊天室

    本文是基于websocket写的一个简单的聊天室的例子,可以实现简单的群聊和私聊.是基于websocket的注解方式编写的.(有一个小的缺陷,如果用户名是中文,会乱码,不知如何处理,如有人知道,请告知 ...

  9. WebSocket介绍和一个简单的聊天室

    WebSocket是什么呢? WebSocket一种在单个 TCP 连接上进行全双工通讯的协议.WebSocket通信协议于2011年被IETF定为标准RFC 6455,并被RFC7936所补充规范, ...

随机推荐

  1. 2-string相关函数

    string真的很好用,希望通过逐步的学习逐渐掌握的string的用法: 1. append() -- 在字符串的末尾添加字符 2. find() -- 在字符串中查找字符串 4. insert() ...

  2. 如何进入/home/user/.wine

    命令行输入 :cd /home/user/.wine/drive_c/windows/fonts /home是linux的用户目录,/user是用户名/.wine是隐藏目录,凡是以.开头的都是隐藏目录 ...

  3. SSH三大框架需要的jar包

    1. Struts2框架 * struts-2.3.24\apps\struts2-blank\WEB-INF\lib\*.jar -- Struts2需要的所有jar包 * struts2-spri ...

  4. winform弹出文件和目录选择框

    目录选择: FolderBrowserDialog dialog = new FolderBrowserDialog(); dialog.Description = "请选择文件路径&quo ...

  5. restful发布服务

    概述 REST 从资源的角度来观察整个网络,分布在各处的资源由URI确定,而客户端的应用通过URI来获取资源的表示方式.获得这些表徵致使这些应用程序转变了其状态.随着不断获取资源的表示方式,客户端应用 ...

  6. Codeforces 600A. Extract Numbers 模拟

    A. Extract Numbers time limit per test: 2 seconds memory limit per test: 256 megabytes input: standa ...

  7. 8个设计师必看的免费UI图标设计资源站

    图标是我们日常APP及网页设计过程中必不可少的元素之一,通过小小的图标,可以快速方便的实现视觉引导和功能划分.在创作时,我们需要寻找各种各样的图标来满足自己的设计需求,非常浪费时间和精力.今天,小编给 ...

  8. 2.自己搭建的一个简易的ioc容器

    1.persondao类namespace MyselfIoC{    public class PersonDao    {        public override string ToStri ...

  9. eclipse 配置动态web项目在servers中运行

    第一步: window->preferences:Server->Runtime Environments窗口,add. 第二步: window->preferences:Proje ...

  10. 局部方法$("html").load()和全局方法$.get()、$.post()

    一..load() .load()方法可以参数三个参数:url(必须,请求 html 文件的 url 地址,参数类型为 String).data(可选,发送的 key/value 数据,参数类型为 O ...