服务端
案例通过Socket网络套接字实现Tcp网络通讯
打开VS,新建一个项目
C#服务端整体流程依旧遵从socket开发的基本步骤,和其它语言下的socket开发一样,例如c++
- 新建socket对象
- 向socket对象绑定协议簇、传输格式、协议类型
- 新建一个能存储ip地址以及端口号的对象
- socket对象绑定ip地址以及端口号
- socket对象开启监听
- socket对象持续进行监听连接请求,如有新连接,返回客户端与服务端之间通信的socket对象(此过程阻塞,直到有新连接)
- 建立连接,此时可以进行信息的收发
- 切断通讯关闭socket
补充一下前置知识,在Tcp传输下,会经历三报文握手建立连接,四报文挥手释放连接。三报文握手防止以失效的连接请求重新传到服务端,四报文挥手之后要等待2MSL,确保此过程中的报文全部失效,并防止释放请求确认报文丢失,及时重传。Tcp传输具有无差错,不丢失,不重复,不乱序的特点,适合长连接的游戏
传输信息使用UTF-8编码
服务端代码:
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
namespace C_NetWorke
{
internal class Program
{
static void Main(string[] args)
{
Socket tcpSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
try
{
IPEndPoint ip = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8080);
tcpSocket.Bind(ip);
}
catch (Exception)
{
return;
}
tcpSocket.Listen(1024);
Socket clientSocket = tcpSocket.Accept();
clientSocket.Send(Encoding.UTF8.GetBytes("你好,我是服务端"));
byte[] buffer = new byte[1024];
int num = clientSocket.Receive(buffer);
if (clientSocket.RemoteEndPoint != null)
{
Console.WriteLine($"收到来次{clientSocket.RemoteEndPoint.ToString()},发来的消息:{Encoding.UTF8.GetString(buffer, 0, num)}");
}
clientSocket.Shutdown(SocketShutdown.Both);
clientSocket.Close();
Console.ReadLine();
}
}
}
客户端
- 新建socket对象
- 向socket对象绑定,和服务端一样
- 启动连接,申请向服务器建立连接
- 连接成功,可以收发数据
- 切断通讯,关闭socket
在unity中新建一个脚本
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
public class Class5 : MonoBehaviour
{
private void Start()
{
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint ipPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8080);
try
{
socket.Connect(ipPoint);
}
catch (SocketException e)
{
if (e.ErrorCode == 10061)
print("服务器拒绝链接");
else
print("链接出错" + e.ErrorCode);
return;
}
socket.Send(Encoding.UTF8.GetBytes("你好,我是客户端"));
byte[] buffer = new byte[1024];
int num = socket.Receive(buffer);
if (socket.RemoteEndPoint != null)
{
print($"收到来次{socket.RemoteEndPoint.ToString()},发来的消息:{Encoding.UTF8.GetString(buffer, 0, num)}");
}
socket.Shutdown(SocketShutdown.Both);
socket.Close();
}
}
启动服务器后,再运行unity,发现连接成功,此时完成了网络通讯的初步搭建