Unity C# Scoket Thread
关于 Scoket和Thread 也没什么要说的,网上有很多资料。但是需要注意的是 Scoket和Thread 都需要创建和杀死。不然一定会造成程序假死。好了上代码
服务器:
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using UnityEngine; public class TCPTestServer : MonoBehaviour
{
#region private members
/// <summary>
/// 服务器监听连接
/// </summary>
private TcpListener tcpListener;
/// <summary>
/// 服务器监听线程
/// </summary>
private Thread tcpListenerThread;
/// <summary>
/// 创建连接上的客户端
/// </summary>
private TcpClient connectedTcpClient;
#endregion // Use this for initialization
void Start()
{
// 启动服务器监听线程
tcpListenerThread = new Thread(new ThreadStart(ListenForIncommingRequests));
tcpListenerThread.IsBackground = true;
tcpListenerThread.Start();
} // Update is called once per frame
void Update()
{
// 服务器发送测试数据
if (Input.GetKeyDown(KeyCode.R))
{
Debug.Log("R");
SendMessage();
} if (Input.GetKeyDown(KeyCode.Escape))
{
Debug.Log("Escape Server");
Close();
Application.Quit();
}
} /// <summary>
/// 服务器监听
/// </summary>
private void ListenForIncommingRequests()
{
try
{
// 创建监听端口
tcpListener = new TcpListener(IPAddress.Parse("127.0.0.1"), );
tcpListener.Start();
Debug.Log("Server is listening");
Byte[] bytes = new Byte[];
while (true)
{
using (connectedTcpClient = tcpListener.AcceptTcpClient())
{
using (NetworkStream stream = connectedTcpClient.GetStream())
{
int length;
while ((length = stream.Read(bytes, , bytes.Length)) != )
{
var incommingData = new byte[length];
Array.Copy(bytes, , incommingData, , length);
string clientMessage = Encoding.Unicode.GetString(incommingData);
Debug.Log("客户端: " + clientMessage);
}
}
}
}
}
catch (SocketException socketException)
{
Debug.Log("SocketException " + socketException.ToString());
}
}
/// <summary>
/// Send message to client using socket connection.
/// </summary>
private void SendMessage()
{
if (connectedTcpClient == null)
{
return;
} try
{
// Get a stream object for writing.
NetworkStream stream = connectedTcpClient.GetStream();
if (stream.CanWrite)
{
string serverMessage = "小畜生";
byte[] serverMessageAsByteArray = Encoding.Unicode.GetBytes(serverMessage);
stream.Write(serverMessageAsByteArray, , serverMessageAsByteArray.Length);
}
}
catch (SocketException socketException)
{
Debug.Log("Socket exception: " + socketException);
}
} private void OnApplicationQuit()
{
Close();
} private void OnDestroy()
{
Close();
} // 关闭TCP连接和线程,防止程序假死
void Close()
{
if (tcpListenerThread != null)
{
tcpListenerThread.Interrupt();
tcpListenerThread.Abort();
} if(null != tcpListener)
{
tcpListener.Stop();
} if(null != connectedTcpClient)
{
connectedTcpClient.Close();
}
}
}
Server
客户端:
using System;
using System.Collections;
using System.Collections.Generic;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using UnityEngine;
using UnityEngine.UI;
using Newtonsoft.Json;
using System.IO; public class TCPTestClient : MonoBehaviour
{
#region private members
private TcpClient socketConnection;
private Thread clientReceiveThread;
#endregion
// Use this for initialization
void Start()
{ }
// Update is called once per frame
void Update()
{
// 连接服务器
if (Input.GetKeyDown(KeyCode.Q))
{
Debug.Log("Q");
ConnectToTcpServer();
} // 发送消息到服务器
if (Input.GetKeyDown(KeyCode.Space))
{
Debug.Log("Space");
SendMessage();
} if (Input.GetKeyDown(KeyCode.Escape))
{
Debug.Log("Escape Client");
Close();
Application.Quit();
} }
/// <summary>
/// 连接服务器
/// </summary>
private void ConnectToTcpServer()
{
try
{
clientReceiveThread = new Thread(new ThreadStart(ListenForData));
clientReceiveThread.IsBackground = true;
clientReceiveThread.Start();
}
catch (Exception e)
{
Debug.Log("On client connect exception " + e);
}
}
/// <summary>
/// 接受服务器消息
/// </summary>
private void ListenForData()
{
try
{
socketConnection = new TcpClient("localhost", );
Byte[] bytes = new Byte[];
while (true)
{
// Using 用完就会销毁
using (NetworkStream stream = socketConnection.GetStream())
{
int length;
while ((length = stream.Read(bytes, , bytes.Length)) != )
{
var incommingData = new byte[length];
Array.Copy(bytes, , incommingData, , length);
string serverMessage = Encoding.Unicode.GetString(incommingData);
Debug.Log("服务器: " + serverMessage);
}
}
}
}
catch (SocketException socketException)
{
Debug.Log("Socket exception: " + socketException);
}
}
/// <summary>
/// 发送数据
/// </summary>
private void SendMessage()
{
if (socketConnection == null)
{
return;
}
try
{
NetworkStream stream = socketConnection.GetStream();
if (stream.CanWrite)
{
string clientMessage = "小妖精";
byte[] clientMessageAsByteArray = Encoding.Unicode.GetBytes(clientMessage);
stream.Write(clientMessageAsByteArray, , clientMessageAsByteArray.Length);
}
}
catch (SocketException socketException)
{
Debug.Log("Socket exception: " + socketException);
}
} public void CreatePagoda(string str)
{
ModelCreate.modelDelegate(str);
} private void OnApplicationQuit()
{
Close();
} private void OnDestroy()
{
Close();
} // 关闭TCP连接和线程,防止程序假死
void Close()
{
if (null != clientReceiveThread)
{
clientReceiveThread.Interrupt();
clientReceiveThread.Abort();
}
if (null != socketConnection)
{
socketConnection.Close();
}
}
}
Client
Unity C# Scoket Thread的更多相关文章
- Unity多线程(Thread)和主线程(MainThread)交互使用类——Loom工具分享
Unity多线程(Thread)和主线程(MainThread)交互使用类——Loom工具分享 By D.S.Qiu 尊重他人的劳动,支持原创,转载请注明出处:http.dsqiu.iteye.com ...
- 结合Thread Ninja明确与处理异步协程中的异常
Thread Ninja说明: Thread Ninja - Multithread Coroutine Requires Unity 3.4.0 or higher. A simple script ...
- Loom工具使用分享
Unity多线程(Thread)和主线程(MainThread)交互使用类——Loom工具分享 时间 2014-03-09 11:04:04 ITeye-博客 原文 http://dsqiu.it ...
- Unity Get Thread Content Failed
最近在使用Unity做项目时,发现总是莫名的出现“Get Thread Content Failed”的消息弹出,然后Unity就卡死了,这样反反复复,后来查到是因为一些杀毒软件在阻止Unity,尝试 ...
- Unity使用C#实现简单Scoket连接及服务端与客户端通讯
简介: 网络编程是个很有意思的事情,偶然翻出来很久之前刚开始看Socket的时候写的一个实例,贴出来吧 Unity中实现简单的Socket连接,c#中提供了丰富的API,直接上代码. 服务端代码: [ ...
- C#之实现Scoket心跳机制
C#之实现Scoket心跳机制 标签: UnityC#TCPSocket心跳 2017-05-17 09:58 1716人阅读 评论(0) 收藏 举报 分类: Unity(134) C#(6) ...
- 《Unity 3D游戏客户端基础框架》多线程异步 Socket 框架构建
引言: 之前写过一个 demo 案例大致讲解了 Socket 通信的过程,并和自建的服务器完成连接和简单的数据通信,详细的内容可以查看 Unity3D -- Socket通信(C#).但是在实际项目应 ...
- Unity性能优化(4)-官方教程Optimizing graphics rendering in Unity games翻译
本文是Unity官方教程,性能优化系列的第四篇<Optimizing graphics rendering in Unity games>的翻译. 相关文章: Unity性能优化(1)-官 ...
- Unity游戏开发中的内存管理_资料
内存是手游的硬伤——Unity游戏Mono内存管理及泄漏http://wetest.qq.com/lab/view/135.html 深入浅出再谈Unity内存泄漏http://wetest.qq.c ...
随机推荐
- Python练习五-函数
1.简述普通参数.指定参数.默认参数.动态参数的区别1)普通参数中,有形参和实参,其中形参是定义函数时写的参数,实参是调用函数时传给函数的参数:2)默认参数是在定义函数时,参数设定一个默认值:3)指定 ...
- F5 BIG-IP LTM负载均衡策略
standard 模式 可以很好的 防止 DDOS攻击 轮询设置是在POOL 中设置 按比率设置是在Node节点中设置
- 100)PHP,文件上传总代码整理
首先是我的目录关系: 然后我的html表单代码: <html> <head> <title>Form</title> <meta http-equ ...
- Integrated writing|Independent writing
Integrated writing R-L-W时间20min,字数150-225个词,写多不扣分. Objective要求客观. Academic topics主题是生物环境地理历史 Indepen ...
- VM Storage Policies深度解析
- java内部类基础知识
一.java内部类具体分四大类 1.成员内部类 2.静态内部类 3.局部内部类 4.匿名内部类 1.成员内部类 :作为类的成员,存在于类中 //成员内部类可以调用外部类的所有 ...
- 详解js面向对象编程
转自:http://segmentfault.com/a/1190000000713346 基本概念 ECMA关于对象的定义是:”无序属性的集合,其属性可以包含基本值.对象或者函数.“对象的每个属性或 ...
- Docker的部署安装(CentOS)-by paymob
环境准备 通过命令查看系统版本和内核版本等信息 [gmuser@--- ~]$ cat /etc/redhat-release CentOS Linux release (Core) [gmuser@ ...
- basecalling|vector mark|Assembly的难题|
生物信息学 染色体可以据染色图谱判断染色体号码,1-22号染色体依次变短,它们影响机体发育,23号染色体决定性别.肿瘤是由于遗传密码变异造成的.因此,遗传密码的解读非常重要,但是因为遗传密码长度非常长 ...
- 对Design model的理解与Java design model的归纳
设计模式的起源是面向对象程序设计思想,是面向对象设计的精髓--抽象.面向对象通过类和对象来实现抽象,实现时产生了面向对象的三个重要机制:封装.继承.多态.正是这三个机制衍生出了各种各样的设计模式.在面 ...