效果展示

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. ccf认证模拟题之三---最大的矩形

    问题描述 在横轴上放了n个相邻的矩形,每个矩形的宽度是1,而第i(1 ≤ i ≤ n)个矩形的高度是hi.这n个矩形构成了一个直方图.例如,下图中六个矩形的高度就分别是3, 1, 6, 5, 2, 3 ...

  2. [leetcode]295. Find Median from Data Stream数据流的中位数

    Median is the middle value in an ordered integer list. If the size of the list is even, there is no ...

  3. CentOS 7安装Samba 4.6 版本步骤及错误解决方法

    首先通过这次教训,让我养成一个好习惯:备份  备份  备份      不管做什么配置或者更改什么东西之前先做好备份! 还有我本身的一个坏毛病:眼高手低! 工厂有一台服务器,由以前的运维装的Samba ...

  4. UI设计初学者如何避免走弯路?

    对于初学UI设计的人而言,可能对UI具体是做什么,或者自己是否能顺利转行胜任这样的岗位存在一定的顾虑,今天我们就来重点说说UI是做什么的,以及想学UI到底要如何避免走弯路,快速的学成. 问题一:UI设 ...

  5. Web开发者工具下载

    登录微信公众号:https://mp.weixin.qq.com

  6. Microsoft DirectX SDK 2010 版本下载

    Microsoft DirectX SDK 2010 版本下载 Version:Date Published:9.29.19626/7/2010File name:File size:DXSDK_Ju ...

  7. 构造函数constructor 与析构函数destructor(五)

    我们知道当调用默认拷贝构造函数时,一个对象对另一个对象初始化时,这时的赋值时逐成员赋值.这就是浅拷贝,当成员变量有指针时,浅拷贝就会在析构函数那里出现问题.例如下面的例子: //test.h #ifn ...

  8. hdu-1069(dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1069 题意:一群猴子,给出n块砖的长x宽y高z,用这些砖拼起的高度最高是多少, 要求底下的砖的长宽都要 ...

  9. opp小节

    本章总结 练习题 面向对象三大特性,各有什么用处,说说你的理解. 类的属性和对象的属性有什么区别? 面向过程编程与面向对象编程的区别与应用场景? 类和对象在内存中是如何保存的. 什么是绑定到对象的方法 ...

  10. js 获取时间不能大于当前系统时间

    var dataDate=$.trim($("#dataDate").val()); if(dataDate.length==0){ $("#dataDateTip&qu ...