Unity使用C#实现简单Scoket连接及服务端与客户端通讯
简介:
网络编程是个很有意思的事情,偶然翻出来很久之前刚开始看Socket的时候写的一个实例,贴出来吧
Unity中实现简单的Socket连接,c#中提供了丰富的API,直接上代码。
服务端代码:
[csharp] view plain copy
Thread connectThread;//当前服务端监听子线程
public string address;//当前地址
public int port;//当前本地端口
TcpClient romoteClient;//远程客户端
// Use this for initialization
void Start()
{
connectThread = new Thread(InitServerSocket);
connectThread.Start();
}
/// <summary>
/// 实例化服务端Socket
/// </summary>
public void InitServerSocket()
{
int bufferSize = 8192;//缓冲区大小
IPAddress ip = IPAddress.Parse(address);
//新建TCP连接,并开启监听子线程
TcpListener tcpListener = new TcpListener(ip, port);
tcpListener.Start();
Debug.Log("服务端-->客户端完成,开启tcp连接监听");
//如果有远程客户端连接,此时得到其对象用于通讯
romoteClient = tcpListener.AcceptTcpClient();
Debug.Log("客户端连接开始 本地地址端口: " + romoteClient.Client.LocalEndPoint + " 远程客户端地址端口: " + romoteClient.Client.RemoteEndPoint);
NetworkStream stream = romoteClient.GetStream();
do
{
try
{
//获取与客户端连接数据
byte[] buffer = new byte[bufferSize];
int byteRead = stream.Read(buffer, 0, bufferSize);
if (byteRead == 0)
{
Debug.Log("客户端断开");
break;
}
string msg = Encoding.UTF8.GetString(buffer, 0, byteRead);
Debug.Log("接收到客户端的数据: " + msg + " 数据长度: " + byteRead + "字节");
}
catch (Exception ex)
{
Debug.Log("客户端异常: " + ex.Message);
//客户端出现异常或者断开的时候,关闭线程防止溢出
tcpListener.Stop();
break;
}
} while (true);
}
/// <summary>
/// 服务器端根据当前连接的远程客户端发送消息
/// </summary>
public void SendMessageToClient(www.yongshiyule178.com )
{
if (romoteClient != null)
{
romoteClient.Client.Send(Encoding.UTF8.GetBytes("Hello Client ,This is Server!"));
}
}
/// <summary>
/// 销毁时关闭监听线程及连接
/// </summary>
void OnDestroy()
{
if (romoteClient != null)
romoteClient.Close();
if (connectThread != null)
connectThread.Abort();
}
客户端代码:
[csharp] view plain copy
public string serverAddress;//服务器地址
public int port;//服务器端口
private TcpClient localClient;//当前tcp客户端
private Thread receiveThread;//接收服务器消息线程
private byte[] resultBuffer = new byte[1024];//服务器返回流字节
private string resultStr;//服务器返回字符串
void Start()
{
//连接至服务端
InitClientSocket();
}
/// <summary>
/// 销毁时操作
/// </summary>
private void OnDestroy()
{
if (localClient != null)
localClient.Close();
if (receiveThread != null)
receiveThread.Abort();
}
/// <summary>
/// 客户端实例化Socket连接
/// </summary>
private void InitClientSocket(www.thd1956.com/ )
{
localClient = new TcpClient(www.huayu521.com );
try
{
//当前客户端连接的服务器地址与远程端口
localClient.Connect(IPAddress.Parse(serverAddress), port);
//开始接收服务器消息子线程
receiveThread = new Thread(SocketReceiver);
receiveThread.Start();
Debug.Log("客户端-->服务端完成,开启接收消息线程");
}
catch (Exception ex)
{
Debug.Log("客户端连接服务器异常: " + ex.Message);
}
Debug.Log("连接到服务器 本地地址端口:" + localClient.Client.LocalEndPoint + " 远程服务器端口:" + localClient.Client.RemoteEndPoint);
}
/// <summary>
/// 客户端发送消息到服务器
/// </summary>
private void SendMessageToServer(www.huayyule.com)
{
try
{
string clientStr = "Hello Server, This is Client!";
//获取当前客户端的流对象,然后将要发送的字符串转化为byte[]写入发送
NetworkStream stream = localClient.GetStream();
byte[] buffer = Encoding.UTF8.GetBytes(clientStr);
stream.Write(buffer, 0,www.dfgjpt.com buffer.Length);
}
catch (Exception ex)
{
Debug.Log("发送消息时服务器产生异常: " + ex.Message);
}
}
/// <summary>
/// 客户端检测收到服务器信息子线程
/// </summary>
private void SocketReceiver()
{
if (localClient != null)
{
while (true)
{
if (localClient.Client.Connected == false)
break;
//在循环中,
localClient.Client.Receive(resultBuffer);
resultStr = Encoding.UTF8.GetString(resultBuffer);
Debug.Log("客户端收到服务器消息 : " + resultStr);
}
}
}
此时,面板填入服务端的地址及端口,运行服务端,再运行客户端,客户端点击发送消息,服务器收到消息,服务端发送消息后,客户端收到消息。本人是在两台机器上进行测试,Debug如下:
服务端:
客户端:
注意事项:
1.服务端和客户端的地址不要写错
2.服务端的端口确保未被占用
3.在进行通讯的时候,要保持字符串编码格式一致
4.子线程的生命周期,记得销毁,为了保证在主线程销毁同时销毁子线程可以使用thread.IsBackground = true
Unity使用C#实现简单Scoket连接及服务端与客户端通讯的更多相关文章
- 简单的异步HTTP服务端和客户端
/// <summary> /// 异步Http服务器 /// </summary> class AsyncHttpServer { readonly HttpListener ...
- WCF心跳判断服务端及客户端是否掉线并实现重连接
WCF心跳判断服务端及客户端是否掉线并实现重连接 本篇文章将通过一个实例实现对WCF中针对服务端以及客户端是否掉线进行判断:若掉线时服务器或客户端又在线时将实现自动重连:将通过WCF的双工知识以及相应 ...
- 动手实现一个较为简单的MQTT服务端和客户端
项目地址:https://github.com/hnlyf168/DotNet.Framework 昨天晚上大致测试了下 ,490个客户端(一个收一个发) 平均估计每个每秒60个包 使用mqtt协 ...
- eureka服务端和客户端的简单搭建
本篇博客简单记录一下,eureka 服务端和 客户端的简单搭建. 目标: 1.完成单机 eureka server 和 eureka client 的搭建. 2.完成eureka server 的添加 ...
- (C#:Socket)简单的服务端与客户端通信。
要求:1.可以完成一对一的通信:2.实现服务端对客户端一对多的选择发送:3.可以实现服务端的群发功能:4.可以实现客户端文件的发送: 要点:服务器端:第一步:用指定的端口号和服务器的ip建立一个End ...
- C# 编写WCF简单的服务端与客户端
http://www.wxzzz.com/1860.html Windows Communication Foundation(WCF)是由微软开发的一系列支持数据通信的应用程序框架,可以翻译为Win ...
- 怎样连接REDIS服务端
怎样连接REDIS服务端 REDIS服务器是TCP/IP SERVER,因此客户端要访问,必须先同服务器建立SOCKET连接,然后才可以发送各种REDIS COMMAND(指令). 首先要引用单元文件 ...
- Ubuntu下ssh连接在服务端显示图形界面
Ubuntu下ssh连接在服务端显示图形界面 step1 安装ssh服务 服务端安装运行ssh,在终端运行命令如下: sudo apt-get install openssh-server 在客户端安 ...
- 保持WCF服务端与客户端的长连接
背景 客户端与服务端使用WCF建立连接后:1.可能长时间不对话(调用服务操作):2.客户端的网络不稳定. 为服务端与客户端两边都写“心跳检测”代码?不愿意. 解决 设置inactivityTimeou ...
随机推荐
- 控制台报错: SCRIPT1006: Expected ')'
今天做网站的时候,jsp页面取一个值死活取不出来. <script> if(${not empty requestScope.article.articleId}){ alert(${re ...
- 5. 使用Flask蓝图(blueprint)
一直到现在都没有怎么写代码,可能更得比较慢. 作业回顾 先来看一下文章4的作业吧,使用logbook的时候,遇到了时区不对的情况.那么我们怎么去解决这个问题呢? 实际上logbook默认采用的是世界标 ...
- Netty源码分析第6章(解码器)---->第2节: 固定长度解码器
Netty源码分析第六章: 解码器 第二节: 固定长度解码器 上一小节我们了解到, 解码器需要继承ByteToMessageDecoder, 并重写decode方法, 将解析出来的对象放入集合中集合, ...
- Xiuno BBS 4.0 修改时间显示
修罗开源轻论坛程序 - Xiuno BBS 4.0Xiuno BBS 4.0 是一款轻论坛产品,前端基于 BootStrap 4.0.JQuery 3,后端基于 PHP/7 MySQL XCache/ ...
- 使用OpenCV通过摄像头捕获实时视频并探测人脸
在Opencv初接触,图片的基本操作这篇手记中,我介绍了一些图片的基本操作,视频可以看作是一帧一帧的图片,因此图片操作其实是视频操作的基础,这篇手记就来讲讲OpenCV中的视频操作,并实现一个用笔记本 ...
- 在 Linux 下执行安装 bin 文件
原文: http://www.linuxidc.com/Linux/2014-03/98541.htm
- Node.js中module文件定义的top-level变量为何是私有的
在Node.js中,module文件里面使用var,const或者let定义的top-level变量为何是私有的,只能在这个模块文件中使用呢? 原因就是,在模块文件中的内容执行之前,node.js会降 ...
- t团队项目计划
团队的backlog: .用户登录网站后,可以选择是买或者卖, (1)买 点击链接,可以分类浏览商品信息,也可以按价钱筛选 (2)卖 点击链接,选择要挂出的商品种类,填写信息(名称.价格.数量等)接着 ...
- oracle 分页的sql语句
已知有两种方法效率上貌似第一种更优: 1. select * from( select t1.*, rownum n from (select * from cm_log order by oper_ ...
- java微信开发之接受消息回复图片或者文本
上回说到 接口连接成功,接下来是真正的开发了. 消息的接收,整个过程就是关注订阅号的用户在微信订阅号中发送消息,微信服务器接收到消息,将消息发给开发者的服务器,服务器接收消息然后可以根据内容进行回复. ...