unity网络----简单基础
网络
TCP:与打电话类似,通知服务到位
UDP:与发短信类似,消息发出即可
IP和端口号是网络两大重要成员
端口号(Port)分为知名端口号[0-1024,不开放)和动态端口号[1024,10000多,开放可用)
三次握手,四次挥手:
unity网端简单案例:
分为:综合管理部分、客户端和服务器
需要Socket作为媒介来进行交互
见代码:
一、综合管理部分:
1 using System.Collections;
2 using System.Collections.Generic;
3 using UnityEngine;
4 using System.Net;
5 using System.Net.Sockets;
6 using System.Threading;
7 using System;
8
9 //综合管理部分
10 // 可以供客户端和服务器一块使用
11 public class TcpSocket
12 {
13 private Socket socket;//当前实例化的套接字
14 private byte[] data;//socket上的数据
15 private bool isServer; //用来区分服务器 还是客户端
16
17 //构造TcpSocket
18 public TcpSocket(Socket socket,int dataLength, bool isServer)
19 {
20 this.socket = socket;
21 data = new byte[dataLength];
22 this.isServer = isServer;
23 }
24 // 接受----->客户端
25 public void ClientReceive()
26 {
27 //data:数据缓存 0:接受位的偏移量 length
28 socket.BeginReceive(data,0,data.Length,SocketFlags.None,new AsyncCallback(ClientEndReceive),null);
29 }
30 public void ClientEndReceive(IAsyncResult ar)
31 {
32 int receiveLength = socket.EndReceive(ar); //数据的处理
33 string dataStr = System.Text.Encoding.UTF8.GetString(data,0, receiveLength); //把接受完毕的字节数组转化为 string类型
34 if (isServer)
35 { Debug.Log("服务器接受到了:" + dataStr);
36 for (int i = 0; i < Server.Instance.clients.Count; i++) //服务器要回什么
37 {
38 if (Server.Instance.clients[i].ClientConnect())
39 {
40 Server.Instance.clients[i].ClientSeed(System.Text.Encoding.UTF8.GetBytes("服务器回复:"+ dataStr));
41 }
42 }
43 }else {
44 DataManager.Instance.Msg = dataStr;
45 Debug.Log("客户端接受到了:" + dataStr);
46 }
47 }
48
49
50 // 发送---->客户端发送给服务器
51 public void ClientSeed(byte[] data)
52 {
53 socket.BeginSend(data,0, data.Length, SocketFlags.None,new AsyncCallback(ClientSeedEnd),null );
54 }
55
56 private void ClientSeedEnd(IAsyncResult ar)
57 {
58 socket.EndSend(ar);
59 }
60
61
62 //连接----客户端与服务器连接
63 public void ClientConnect(string ip,int port)
64 {
65 socket.BeginConnect(new IPEndPoint(IPAddress.Parse(ip), port),new AsyncCallback(ClientEndConnect),null);
66 }
67 public void ClientEndConnect(IAsyncResult ar)
68 {
69 if (ar.IsCompleted) {
70 Debug.Log("连接成功");
71 }
72 socket.EndConnect(ar);
73 }
74
75 // 客户端与服务器是否连接
76
77 public bool IsClientConnect()
78 {
79 return socket.Connected;
80 }
81 //断开连接
82 public void ClientClose()
83 {
84 if (socket!=null&& ISClientConnect())
85 {
86 socket.Close();
87 }
88 }
89
90 }
二、服务器部分:
注意:回调函数AcceptClient只有当服务器接受连接(连接成功了)才会被调用.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System; // 服务器 public class Server : MonoBehaviour { //单例服务器,继承Mono的
private static Server instance;
public static Server Instance
{
get { return instance; }
}
private void Awake()
{
instance = this;
}
//------------------------------------------------------------------------
private Socket server;//定义一个服务器
public List<TcpSocket> clients;//所有连接的客户端
private bool isLoopAccept = true;//是否循环接受客户端的请求 void Start ()
{
//初始化服务器socket 协议族
server = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
server.Bind(new IPEndPoint(IPAddress.Any,));//绑定端口号
server.Listen(); //可以监听的客户端数目
//------------------------------------------------------------------------
//开辟一个线程 处理客户端连接请求 线程要暂停需用listenThread.Abort();
Thread listenThread = new Thread(ReceiveClient);
listenThread.Start(); //开启线程
listenThread.IsBackground = true; //后台运行
//------------------------------------------------------------------------
//初始化连接的客户端
clients = new List<TcpSocket>(); } // 持续处理 接受客户端连接的请求
private void ReceiveClient()
{
while (isLoopAccept)
{
server.BeginAccept(AcceptClient,null); //开始接受客户端连接请求
Debug.Log("检测客户端连接中.....");
Thread.Sleep();//每隔1s检测 有没有连接我
}
}
// 客户端连接成功之后回调
private void AcceptClient(IAsyncResult ar)
{
//连接成功后处理该客户
Socket client = server.EndAccept(ar);
TcpSocket clientSocket = new TcpSocket(client,,true);
clients.Add(clientSocket);
Debug.Log("连接成功");
}
//关闭项目终止线程,停止服务器.
private void OnApplicationQuit()
{
listenThread.Abort();
listenThread.IsBackground = true;//关闭线程
}
}
三、客户端部分:
using System.Collections;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System;
using UnityEngine;
using UnityEngine.UI; //客户端
public class Client : MonoBehaviour {
public InputField input;
public Text receiveText; TcpSocket tcpClient;
Socket client; void Start () {
//注册监听事件
receiveText = GameObject.Find("ReceiveText").GetComponent<Text>(); tcpClient = new TcpSocket(client,,false);//初始化综合处理器
client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//初始化客户端
}
void Update () {
if (tcpClient != null && tcpClient.IsClientConnect())//如果客户端不为空且客户端已连接
{
tcpClient.ClientReceive();//执行综合管理器中的ClientReceive()
}
receiveText.text = DataManager.Instance.Msg;
}
public void OnClickConnectBtn()//客户端向服务器开始连接输入(IP和端口号)按钮事件
{
if (!tcpClient.IsClientConnect())
{
tcpClient.ClientConnect("10.50.6.129",);
}
}
public void OnClickToSendServer()//客户端向服务器发送文本消息按钮事件
{
if (tcpClient != null && tcpClient.IsClientConnect() && !String.IsNullOrEmpty(input.text))
{
tcpClient.ClientSeed(System.Text.Encoding.UTF8.GetBytes(input.text));
input.text = "";
}
}
private void OnApplicationQuit()//关闭项目,退出服务器连接
{
if (tcpClient != null && tcpClient.ClientConnect())
{
tcpClient.ClientClose();
}
} }
unity网络----简单基础的更多相关文章
- Android 网络编程基础之简单聊天程序
前一篇讲了Android的网络编程基础,今天写了一个简单的聊天程序分享一下 首先是服务端代码: package com.jiao.socketdemo; import java.io.Buffered ...
- C#网络编程基础知识
C#网络编程基础知识一 1.IPAddress类 用于表示一个IP地址.IPAddress默认构造函数 public IPAddress(long address);一般不用 其中Parse()方法最 ...
- iOS开发网络篇—网络编程基础
iOS开发网络篇—网络编程基础 一.为什么要学习网络编程 1.简单说明 在移动互联网时代,移动应用的特征有: (1)几乎所有应用都需要用到网络,比如QQ.微博.网易新闻.优酷.百度地图 (2)只有通过 ...
- 用Netty开发中间件:网络编程基础
用Netty开发中间件:网络编程基础 <Netty权威指南>在网上的评价不是很高,尤其是第一版,第二版能稍好些?入手后快速翻看了大半本,不免还是想对<Netty权威指南(第二版)&g ...
- 【RL-TCPnet网络教程】第2章 嵌入式网络协议栈基础知识
第2章 嵌入式网络协议栈基础知识 本章教程为大家介绍嵌入式网络协议栈基础知识,本章先让大家有一个全面的认识,后面章节中会为大家逐一讲解用到的协议. 基础知识整理自百度百科,wiki百科等 ...
- 【网络编程1】网络编程基础-TCP、UDP编程
网络基础知识 网络模型知识 OSI七层模型:(Open Systems Interconnection Reference Model)开放式通信系统互联参考模型,是国际标准化组织(ISO)提出的一个 ...
- Java网络编程和NIO详解开篇:Java网络编程基础
Java网络编程和NIO详解开篇:Java网络编程基础 计算机网络编程基础 转自:https://mp.weixin.qq.com/s/XXMz5uAFSsPdg38bth2jAA 我们是幸运的,因为 ...
- python全栈开发从入门到放弃之socket网络编程基础
网络编程基础 一 客户端/服务器架构 1.硬件C/S架构(打印机) 2.软件C/S架构 互联网中处处是C/S架构 如黄色网站是服务端,你的浏览器是客户端(B/S架构也是C/S架构的一种) 腾讯作为服务 ...
- TCP/IP网络协议基础
实验楼学习网络协议传送门 一.TCP/IP简介 TCP/IP(Transmission Control Protocol/Internet Protocol)是传输控制协议和网络协议的简称,它定义了电 ...
随机推荐
- nginx配置文件,做多个项目代理
web01: server { listen 9988; server_name www.oldboy.com; access_log logs/www.oldboy.com_access.log m ...
- swoole异步群发模板消息
1.用的是TP5.1的框架,swoole分成一个客户端发送接收消息,一个服务器负责处理信息 服务端代码,服务器要先安装swoole拓展,用 php server.php 启动进程监听 <?php ...
- CSS --记录
CSS3与文字渐变光影流动动画效果实现 by zhangxinxu from http://www.zhangxinxu.com 本文地址:http://www.zhangxinxu.com/word ...
- md5加密 bas64加密
/** * 获取bas64加密的算法 * @param str * @return */ public static String getBase64(String str) { byte[] b = ...
- topological sort~~~~初学
今天讲了topological sort 问题: 判环:记录入队的点数,若<n则有环,可证: 算法:o(n):queue or stack,而不是o(n^2)枚举 #. 关系运算图(vijos ...
- .net core ef 通过dbfirst方式连接sql server数据库
1. 创建基于.net core 的项目(过程略) 2. 使用nuget添加引用 Microsoft.EntityFrameworkCore Microsoft.EntityFrameworkCore ...
- .Net Core 技巧
避免同步调用 正确的使用异步编程 async/await 使用异步编程尽量避免 Task.Await() 或者 Task.Result(因为会阻塞线程,直到任务完成,有违异步的设计思想) 尽量始终执行 ...
- Java 两次MD5
导入: import org.apache.commons.codec.digest.DigestUtils; 代码: public static String md5(String src) { r ...
- linux基础命令学习笔记(二)
linux基础命令学习笔记(二) 1.kill :终止进程 kill pid (唯一标示一个进程) kill -9 强制终止 kill -15 命令未结束不能终止 # ps aux 查看所有进程 ...
- vue-router 去掉#
vue-router默认的路由模式是hash,我们要去掉url中的#需要将路由模式切换为history const router = new VueRouter({ mode: 'history', ...