IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> 【Unity】Socket网络通信(TCP) - 最基础的C#服务端通信流程 -> 正文阅读

[游戏开发]【Unity】Socket网络通信(TCP) - 最基础的C#服务端通信流程

我这里新建了一个C#控制台项目来写服务端代码。
下面是基于C# Socket的最基础服务端通信流程:

  1. 创建服务端Socket对象
  2. 绑定IP地址和端口
  3. 设置最大监听客户端数量
  4. 等待客户端连接
  5. 收发消息
  6. 释放连接

基于上面流程就能实现一个最简单并且能和客户端通信的服务器程序,每个步骤Socket都提供了相对应的方法,使用Socket提供的方法就行。

创建服务端Socket对象

使用socket需要引用命名空间 using System.Net.Sockets;

//创建服务端socket
Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

直接new一个Socket就可以,参数分别是:
1.IP地址类型。AddressFamily.InterNetwork是IPv4类地址,AddressFamily.InterNetworkV6是IPv6类地址,这里用的是IPv4地址。
2.socket类型。TCP协议对应的Socket类型是流类型,所以这个参数用的是SocketType.Stream。
3.协议类型。选择TCP协议。

绑定IP地址和端口

使用socket提供的Bind方法绑定IP地址和端口
在这里插入图片描述
这里需要传入一个EndPoint类型的参数,我们先定义一个IPEndPoint对象(IPEndPoint是继承了EndPoint对象的,可以作为Bind方法的参数),需要引用命名空间using System.Net;
直接new一个IPEndPoint对象,传入IP地址和端口号,IPAddress.Parse(“127.0.0.1”)可以将IP地址字符串转化成IPAddress,使用起来比较方便,端口号自定义需大于1024且没被使用过的端口号。
将iPEndPoint传入Bind方法中即可绑定IP地址和端口号。
127.0.0.1 (保留地址,用于测试)这个IP地址是代表本机的IP地址,由于便于测试,服务端和客户端的程序都在同一台计算机上,所以可以用这个地址。也可以填入你计算机的IP地址,具体本机IP地址怎么查询可以百度一下。

//绑定IP地址和端口
IPEndPoint iPEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8080);
serverSocket.Bind(iPEndPoint);

设置最大监听客户端数量

使用socket提供的Listen方法,设置最大监听客户端数量,参数传入一个Int值。
这里我设置了最多监听1024个客户端。

//设置最大监听客户端数量
serverSocket.Listen(1024);

等待客户端连接

使用socket提供的Accept方法,等待客户端连入,这个方法是一个阻塞方法,会阻塞线程,当有客户端连入后才会继续执行该方法下面的逻辑,客户端连入成功后,返回一个与客户端通信的socket,返回的socket后面用于与客户端相互通信。

//等待客户端链接
Socket clientSocket = serverSocket.Accept();

收发消息

使用Send方法发送消息,Receive方法接收消息。
发送消息:
Send需要传入字节数组,这里我们给客户端发送一条string类型的消息,用Encoding.UTF8.GetBytes(需要引用命名空间using System.Text;)将字符串转化成字节数组并传入Send方法中,即可发送消息。
接收消息:
需要定义一个字节数组来存放收到的消息,容量可以定义得稍微大一些。将字节数组传入Receive方法中,当收到消息后,客户端发来的消息会存入这个字节数组,并返回消息的长度,所以Receive会返回一个int值,该值就是消息长度,用于解析消息。
解析消息:
使用Encoding.UTF8.GetString(msgBytes, 0, msgLength)解析字符串消息。这里第一个参数是传入收到消息的字节数组,第二个参数是解析的起始位置,第三个参数是解析消息的长度。

 //给客户端发送消息
clientSocket.Send(Encoding.UTF8.GetBytes("欢迎连入服务端..."));
//接受客户端发来的消息
byte[] msgBytes = new byte[1024];
int msgLength = clientSocket.Receive(msgBytes);
//解析客户端发来的消息
Console.WriteLine("客户端{0}:{1}", clientSocket.RemoteEndPoint.ToString(), Encoding.UTF8.GetString(msgBytes, 0, msgLength));

释放连接

使用socket提供的Shutdown函数关闭发送/接收,然后Close关闭就可以释放连接了。
Shutdown传入的参数可以是以下3种,Both是接收/发送都关闭,Receive是关闭接收,Send是关闭发送。
在这里插入图片描述

//通信完成释放连接
clientSocket.Shutdown(SocketShutdown.Both);
clientSocket.Close();

以上最简单的服务端代码就完成了,完整代码如下:

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

namespace TCPServer
{
    class Program
    {
        static void Main(string[] args)
        {
            //创建服务端socket
            Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            //绑定IP地址和端口
            IPEndPoint iPEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8080);
            serverSocket.Bind(iPEndPoint);
            Console.WriteLine("IP地址和端口号绑定成功...");
            //设置监听客户端数量
            serverSocket.Listen(1024);
            //等待客户端链接
            Console.WriteLine("等待客户端连接...");
            //阻塞主线程,有客户端连入才会往下执行,否则一直在等待
            Socket clientSocket = serverSocket.Accept();
            //给客户端发送消息
            clientSocket.Send(Encoding.UTF8.GetBytes("欢迎连入服务端..."));
            //接受客户端发来的消息
            byte[] msgBytes = new byte[1024];
            int msgLength = clientSocket.Receive(msgBytes);
            //解析客户端发来的消息
            Console.WriteLine("客户端{0}:{1}", clientSocket.RemoteEndPoint.ToString(), Encoding.UTF8.GetString(msgBytes, 0, msgLength));
            //通信完成释放连接
            clientSocket.Shutdown(SocketShutdown.Both);
            clientSocket.Close();

            Console.WriteLine("按任意键退出...");
            Console.ReadKey();
        }
    }
}

收发消息效果需要配合客户端代码才能看出,稍后会整理一篇最基础的能和服务器通信的Unity客户端代码。
以上就是这篇文章的所有内容了,此为个人学习记录,如有哪个地方写的有误,劳烦大佬指出,感谢,希望对各位看官有所帮助!

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2022-09-30 01:19:47  更:2022-09-30 01:21:05 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 -2025/1/17 4:03:58-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码