效果展示

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. 清明梦超能力者黄YY(idx数组)

    清明梦超能力者黄YY https://www.nowcoder.com/acm/contest/206/I 题目描述 黄YY是一个清明梦超能力者,同时也是一个记忆大师.他能够轻松控制自己在梦中的一切, ...

  2. 支付宝SDK ios快捷支付

    配置PartnerConfig.h的参数 //合作身份者id,以2088开头的16位纯数字 #define PartnerID @"" //收款支付宝账号 #define Sell ...

  3. [leetcode]215. Kth Largest Element in an Array 数组中第k大的元素

    Find the kth largest element in an unsorted array. Note that it is the kth largest element in the so ...

  4. VC2008 类型重定义的问题

    Q: 比如"a.h"里定义了类a,类a所有函数的实现都放在"a.cpp"里.然后"b.h"和"c.h"都需要用到类a,所 ...

  5. Macbook pro睡眠状态恢复后没声音的解决办法

    杀招: sudo killall coreaudiod macos会自动重启进程,恢复声音

  6. Netty 源码(一)服务端启动

    Netty 源码(一)服务端启动 Netty 系列目录(https://www.cnblogs.com/binarylei/p/10117436.html) ServerBootstap 创建时序图如 ...

  7. 原生 JS 实现移动端 Touch 滑动反弹

    什么是 Touch滑动?就是类似于 PC端的滚动事件,但是在移动端是没有滚动事件的,所以就要用到 Touch事件结合 js去实现,效果如下: 1. 准备工作 什么是移动端的 Touch事件?在移动端 ...

  8. 检查Makefile中的tab

    转:http://stackoverflow.com/questions/16931770/makefile4-missing-separator-stop makefile has a very s ...

  9. 负值之美:负margin在页面布局中的应用

    本文转载自:http://www.topcss.org/?p=94,有修改. 负数给人总是一种消极.否定.拒绝之感,不过有时利用负margin可以达到奇妙的效果,今天就表一表负值在页面布局中的应用.这 ...

  10. java--多线程编程简介

    1.什么时候使用多线程编程 一个任务在正常情况下是按顺序执行的,但是如果当前任务里有多个相似进程块(例如for,while语句),我们就可以考虑把这些代码块抽出来并行运行,无需阻塞 2.实现多线程的几 ...