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所补充规范, ...
随机推荐
- 清明梦超能力者黄YY(idx数组)
清明梦超能力者黄YY https://www.nowcoder.com/acm/contest/206/I 题目描述 黄YY是一个清明梦超能力者,同时也是一个记忆大师.他能够轻松控制自己在梦中的一切, ...
- 支付宝SDK ios快捷支付
配置PartnerConfig.h的参数 //合作身份者id,以2088开头的16位纯数字 #define PartnerID @"" //收款支付宝账号 #define Sell ...
- [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 ...
- VC2008 类型重定义的问题
Q: 比如"a.h"里定义了类a,类a所有函数的实现都放在"a.cpp"里.然后"b.h"和"c.h"都需要用到类a,所 ...
- Macbook pro睡眠状态恢复后没声音的解决办法
杀招: sudo killall coreaudiod macos会自动重启进程,恢复声音
- Netty 源码(一)服务端启动
Netty 源码(一)服务端启动 Netty 系列目录(https://www.cnblogs.com/binarylei/p/10117436.html) ServerBootstap 创建时序图如 ...
- 原生 JS 实现移动端 Touch 滑动反弹
什么是 Touch滑动?就是类似于 PC端的滚动事件,但是在移动端是没有滚动事件的,所以就要用到 Touch事件结合 js去实现,效果如下: 1. 准备工作 什么是移动端的 Touch事件?在移动端 ...
- 检查Makefile中的tab
转:http://stackoverflow.com/questions/16931770/makefile4-missing-separator-stop makefile has a very s ...
- 负值之美:负margin在页面布局中的应用
本文转载自:http://www.topcss.org/?p=94,有修改. 负数给人总是一种消极.否定.拒绝之感,不过有时利用负margin可以达到奇妙的效果,今天就表一表负值在页面布局中的应用.这 ...
- java--多线程编程简介
1.什么时候使用多线程编程 一个任务在正常情况下是按顺序执行的,但是如果当前任务里有多个相似进程块(例如for,while语句),我们就可以考虑把这些代码块抽出来并行运行,无需阻塞 2.实现多线程的几 ...