关于 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的更多相关文章

  1. Unity多线程(Thread)和主线程(MainThread)交互使用类——Loom工具分享

    Unity多线程(Thread)和主线程(MainThread)交互使用类——Loom工具分享 By D.S.Qiu 尊重他人的劳动,支持原创,转载请注明出处:http.dsqiu.iteye.com ...

  2. 结合Thread Ninja明确与处理异步协程中的异常

    Thread Ninja说明: Thread Ninja - Multithread Coroutine Requires Unity 3.4.0 or higher. A simple script ...

  3. Loom工具使用分享

    Unity多线程(Thread)和主线程(MainThread)交互使用类——Loom工具分享 时间 2014-03-09 11:04:04  ITeye-博客 原文  http://dsqiu.it ...

  4. Unity Get Thread Content Failed

    最近在使用Unity做项目时,发现总是莫名的出现“Get Thread Content Failed”的消息弹出,然后Unity就卡死了,这样反反复复,后来查到是因为一些杀毒软件在阻止Unity,尝试 ...

  5. Unity使用C#实现简单Scoket连接及服务端与客户端通讯

    简介: 网络编程是个很有意思的事情,偶然翻出来很久之前刚开始看Socket的时候写的一个实例,贴出来吧 Unity中实现简单的Socket连接,c#中提供了丰富的API,直接上代码. 服务端代码: [ ...

  6. C#之实现Scoket心跳机制

    C#之实现Scoket心跳机制 标签: UnityC#TCPSocket心跳 2017-05-17 09:58 1716人阅读 评论(0) 收藏 举报  分类: Unity(134)  C#(6)  ...

  7. 《Unity 3D游戏客户端基础框架》多线程异步 Socket 框架构建

    引言: 之前写过一个 demo 案例大致讲解了 Socket 通信的过程,并和自建的服务器完成连接和简单的数据通信,详细的内容可以查看 Unity3D -- Socket通信(C#).但是在实际项目应 ...

  8. Unity性能优化(4)-官方教程Optimizing graphics rendering in Unity games翻译

    本文是Unity官方教程,性能优化系列的第四篇<Optimizing graphics rendering in Unity games>的翻译. 相关文章: Unity性能优化(1)-官 ...

  9. Unity游戏开发中的内存管理_资料

    内存是手游的硬伤——Unity游戏Mono内存管理及泄漏http://wetest.qq.com/lab/view/135.html 深入浅出再谈Unity内存泄漏http://wetest.qq.c ...

随机推荐

  1. 关联规则之FpGrowth算法

    Aprori算法利用频繁集的两个特性,过滤了很多无关的集合,效率提高不少,但是我们发现Apriori算法是一个候选消除算法,每一次消除都需要扫描一次所有数据记录,造成整个算法在面临大数据集时显得无能为 ...

  2. highcharts 设置柱子之间的距离 柱子宽度

    plotOption : { column : { // 设置每个柱自身的宽度 pointWidth : // x轴每个点只用一个柱,则这个属性设置的是相邻的两个点的柱之间的间距. // 如果x轴每个 ...

  3. HTML配色表方案

  4. python语法基础-面向对象-进阶-长期维护

    ###############    @property定义属性    ############## # 所以对于定义属性你有好几种方式了和种类了,# 静态属性,动态属性, # property # ...

  5. http请求头缓存实现

    转自CSDN ouyang-web之路 原文链接:https://blog.csdn.net/cangqiong_xiamen/article/details/90405555 一.浏览器的缓存 st ...

  6. django框架中的cookie与session

    cookie因为http是一个无状态协议,无法记录用户上一步的操作,所以需要状态保持.cookie和session的区别:1.cookie是保存在浏览器本地的,所以相对不安全.cookie是4k的大小 ...

  7. Linux安装swoole拓展 (一键安装lnmp后安装可用完美)

    一键安装lnmp后安装可用完美 swoole(一键安装完lnmp重启下,之前出现502一直解决不了,不清楚啥情况) 找到对应php版本,在lnmp文件夹的src 1.安装swoole cd /usr/ ...

  8. mapreduce.shuffle set in yarn.nodemanager.aux-services is invalid

    15/07/01 20:14:41 FATAL containermanager.AuxServices: Failed to initialize mapreduce.shuffle java.la ...

  9. jtemplates使用+同内容列合并

    function ImportStatistics(val, pros) { top.$.jBox.tip("导入已完成,正在统计整理导入的数据...", 'loading'); ...

  10. PyTorch模型加载与保存的最佳实践

    一般来说PyTorch有两种保存和读取模型参数的方法.但这篇文章我记录了一种最佳实践,可以在加载模型时避免掉一些问题. 第一种方案是保存整个模型: 1 torch.save(model_object, ...