20.网络通信-套接字Socket-TCP通信-同步-客户端
20.1 知识点
回顾客户端需要做的事情
- 创建套接字Socket
- 用Connect方法与服务端相连
- 用Send和Receive相关方法收发数据
- 用Shutdown方法释放连接
- 关闭套接字
实现客户端基本逻辑
创建套接字Socket对象(TCP)
//1.创建套接字Socket Tcp
Socket socketTcp = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
用Connect方法与服务端相连
//2.用Connect方法与服务端相连
//确定服务端的IP和端口 正常来说填的应该是远端服务器的ip地址以及端口号
//由于只有一台电脑用于测试 本机也当做服务器 所以传入当前电脑的ip地址
IPEndPoint iPEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8080);
try
{
//连接
socketTcp.Connect(iPEndPoint);
}
catch (SocketException e)
{
//如果连接没有开启或者服务器异常 会报错 不同的返回码代表不同报错
if (e.ErrorCode == 10061)
print("服务器拒绝连接");
else
print("连接服务器失败" + e.ErrorCode);
return;
}
用Send和Receive相关方法收发数据
//3.用Send和Receive相关方法收发数据
//接收数据
//声明接收数据字节数组
byte[] receiveBytes = new byte[1024];
//Receive方法接受数据 返回接收多少字节
int receiveNum = socketTcp.Receive(receiveBytes);
print("收到服务端发来的消息:" + Encoding.UTF8.GetString(receiveBytes, 0, receiveNum));
//发送数据
socketTcp.Send(Encoding.UTF8.GetBytes("你好,我是韬老狮的客户端"));
用Shutdown方法释放连接
//4.用Shutdown方法释放连接
socketTcp.Shutdown(SocketShutdown.Both);
关闭套接字
//5.关闭套接字
socketTcp.Close();
实现客户端和服务端的通信
- 开启上节课的服务端控制台,将当前脚本挂载到场景中对象上运行,进行客户端和服务端的通信。
总结
- 客户端连接的流程每次都是相同的。
- 客户端的 Connect、Send、Receive 是会阻塞主线程的,要等到执行完毕才会继续执行后面的内容。
抛出问题:
- 如何让客户端的 Socket 不影响主线程,并且可以随时收发消息?
- 我们会在之后的综合练习题讲解。
20.2 知识点代码
using System;
using System.Collections;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using System.Text;
using UnityEngine;
public class Lesson20_网络通信_套接字Socket_TCP通信_同步_客户端 : MonoBehaviour
{
void Start()
{
#region 知识点一 回顾客户端需要做的事情
//1.创建套接字Socket
//2.用Connect方法与服务端相连
//3.用Send和Receive相关方法收发数据
//4.用Shutdown方法释放连接
//5.关闭套接字
#endregion
#region 知识点二 实现客户端基本逻辑
//1.创建套接字Socket Tcp
Socket socketTcp = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//2.用Connect方法与服务端相连
//确定服务端的IP和端口 正常来说填的应该是远端服务器的ip地址以及端口号
//由于只有一台电脑用于测试 本机也当做服务器 所以传入当前电脑的ip地址
IPEndPoint iPEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8080);
try
{
//连接
socketTcp.Connect(iPEndPoint);
}
catch (SocketException e)
{
//如果连接没有开启或者服务器异常 会报错 不同的返回码代表不同报错
if (e.ErrorCode == 10061)
print("服务器拒绝连接");
else
print("连接服务器失败" + e.ErrorCode);
return;
}
//3.用Send和Receive相关方法收发数据
//接收数据
//声明接收数据字节数组
byte[] receiveBytes = new byte[1024];
//Receive方法接受数据 返回接收多少字节
int receiveNum = socketTcp.Receive(receiveBytes);
print("收到服务端发来的消息:" + Encoding.UTF8.GetString(receiveBytes, 0, receiveNum));
//发送数据
socketTcp.Send(Encoding.UTF8.GetBytes("你好,我是韬老狮的客户端"));
//4.用Shutdown方法释放连接
socketTcp.Shutdown(SocketShutdown.Both);
//5.关闭套接字
socketTcp.Close();
#endregion
#region 知识点三 实现客户端和服务端的通信
//开启上节课的服务端控制台 把当前脚本挂载到场景中对象上运行 进行客户单和服务端的通信
#endregion
#region 总结
//1.客户端连接的流程每次都是相同的
//2.客户端的 Connect、Send、Receive是会阻塞主线程的,要等到执行完毕才会继续执行后面的内容
//抛出问题:
//如何让客户端的Socket不影响主线程,并且可以随时收发消息?
//我们会在之后的综合练习题讲解
#endregion
}
}
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com