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 ...
随机推荐
- 使用TCP在同一台电脑上可以建立连接,在两台电脑上却连接失败的原因分析
最近在用unity做联机游戏,在网络方面费了不少劲,总是在代码没问题的时候出一些莫名奇妙的BUG,不过后来都决定了.如果感觉代码没问题,八成就是防火墙的问题. 用unity发布后的游戏,如果涉及网络, ...
- Selenium笔记:PO模型
所有用到的页面都定义成一个类,继承自基础的Page类 把页面中用到的元素定义成方法 把页面上一些操作定义成方法
- linux的date命令使用指定时间的加减方法与异常
在一般网页里,date命令减时间方法为: date -d '-100 days' 我的需求是,在指定时间上减8小时.按一般理解来看,命令写成如下样子(有异常错误的写法): date -d " ...
- 高可用OpenStack(Queen版)集群-1. 集群环境
参考文档: Install-guide:https://docs.openstack.org/install-guide/ OpenStack High Availability Guide:http ...
- ubuntu安装中文输入法必看
ubuntu安装中文输入法必看以下两篇文章,按照顺序来做: http://www.2cto.com/os/201207/144189.html http://www.cnblogs.com/slide ...
- python数据分析画图体验
对于numpy的函数,pands等,不是很熟,我来copy一下code,敲击一下,找找感觉. 默认的导入包import numpy as npimport matplotlib.pyplot as p ...
- $.each()用法
通过它,你可以遍历对象.数组的属性值并进行处理. 使用说明 each函数根据参数的类型实现的效果不完全一致: 1.遍历对象(有附加参数) $.each(Object, function(p1, p2) ...
- “Hello World!“”团队第七周召开的第三次会议
今天是我们团队“Hello World!”团队第七周召开的第三次会议.博客内容: 一.会议时间 二.会议地点 三.会议成员 四.会议内容 五.todo list 六.会议照片 七.燃尽图 八.代码 一 ...
- TeamWork#3,Week5,Scrum Meeting 11.15
经过最近一段时间的努力,我们调整了爬虫结构,并在继续进行爬虫开发,马上可以进行新爬虫与服务器连接的测试. 成员 已完成 待完成 彭林江 基本完成爬虫结构调整 新爬虫与服务器连接 郝倩 基本完成爬虫结构 ...
- 团队博客作业Week2 --- 学长学姐访谈录
## 团队作业2 ## ### 团队一 ### 这个团队中组员是位研一的学姐,她的软件工程老师是姚淑珍,当时她们团队总共有4个人,而且她们都很努力,但是可能是最后团队的作品不太理想,她们的软件并没有上 ...