简介:

网络编程是个很有意思的事情,偶然翻出来很久之前刚开始看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连接及服务端与客户端通讯的更多相关文章

  1. 简单的异步HTTP服务端和客户端

    /// <summary> /// 异步Http服务器 /// </summary> class AsyncHttpServer { readonly HttpListener ...

  2. WCF心跳判断服务端及客户端是否掉线并实现重连接

    WCF心跳判断服务端及客户端是否掉线并实现重连接 本篇文章将通过一个实例实现对WCF中针对服务端以及客户端是否掉线进行判断:若掉线时服务器或客户端又在线时将实现自动重连:将通过WCF的双工知识以及相应 ...

  3. 动手实现一个较为简单的MQTT服务端和客户端

    项目地址:https://github.com/hnlyf168/DotNet.Framework 昨天晚上大致测试了下 ,490个客户端(一个收一个发)  平均估计每个每秒60个包  使用mqtt协 ...

  4. eureka服务端和客户端的简单搭建

    本篇博客简单记录一下,eureka 服务端和 客户端的简单搭建. 目标: 1.完成单机 eureka server 和 eureka client 的搭建. 2.完成eureka server 的添加 ...

  5. (C#:Socket)简单的服务端与客户端通信。

    要求:1.可以完成一对一的通信:2.实现服务端对客户端一对多的选择发送:3.可以实现服务端的群发功能:4.可以实现客户端文件的发送: 要点:服务器端:第一步:用指定的端口号和服务器的ip建立一个End ...

  6. C# 编写WCF简单的服务端与客户端

    http://www.wxzzz.com/1860.html Windows Communication Foundation(WCF)是由微软开发的一系列支持数据通信的应用程序框架,可以翻译为Win ...

  7. 怎样连接REDIS服务端

    怎样连接REDIS服务端 REDIS服务器是TCP/IP SERVER,因此客户端要访问,必须先同服务器建立SOCKET连接,然后才可以发送各种REDIS COMMAND(指令). 首先要引用单元文件 ...

  8. Ubuntu下ssh连接在服务端显示图形界面

    Ubuntu下ssh连接在服务端显示图形界面 step1 安装ssh服务 服务端安装运行ssh,在终端运行命令如下: sudo apt-get install openssh-server 在客户端安 ...

  9. 保持WCF服务端与客户端的长连接

    背景 客户端与服务端使用WCF建立连接后:1.可能长时间不对话(调用服务操作):2.客户端的网络不稳定. 为服务端与客户端两边都写“心跳检测”代码?不愿意. 解决 设置inactivityTimeou ...

随机推荐

  1. [Lua] 尾调用消除(tail-call elimination)

    <Lua程序设计(第2版)> 6.3 正确的尾调用(proper tail call) Lua是支持尾调用消除(tail-call elimination)的,如下面对函数g的调用就是尾调 ...

  2. Jmeter实战

    Jmeter实战 入门篇 1.下载与使用 下载地址:http://jmeter.apache.org/download_jmeter.cgi 开源,基于java编写,所以得有jdk(jre)环境,下载 ...

  3. 在python脚本中设置环境变量,并运行相关应用

    1. 问题 在自动化应用的时候 ,有时候环境变量与运行需要不一致.这时候有两种选择: 改变节点环境变量,使得其和运行需求保持一致: 在自动化脚本中设置环境变量,其范围只在脚本运行环境中有效. 显然,当 ...

  4. Docker--删除容器实例和镜像

    一.删除容器实例 使用命令docker rm 容器ID或者容器名 1.docker ps -a查询已有的实例 [root@cxt data]# docker ps -a 2.docker rm 容器I ...

  5. 基于python的scrapy框架爬取豆瓣电影及其可视化

    1.Scrapy框架介绍 主要介绍,spiders,engine,scheduler,downloader,Item pipeline scrapy常见命令如下: 对应在scrapy文件中有,自己增加 ...

  6. 04-matplotlib-柱形图

    import numpy as np import matplotlib.pyplot as plt # 柱形图 # 例一 N =5 y = [15,28,10,30,25] index = np.a ...

  7. EOS博彩合约设计

    集中博彩游戏合约设计 一.功能接口 1. 质押deposit 由用户发起,用户将个人账户中token质押给平台,从而可以进入平台去参与平台活动. 2. 赎回withdraw 由用户发起,在用户结束平台 ...

  8. windows 无法链接 \\ , 拼写错误或者网络有问题,解决方法

    1. 楼主首先在网上搜索了一遍问题, 比较全面的回答链接如下http://blog.csdn.net/newizan/article/details/50313137 然而并没有解决问题, 于是反思了 ...

  9. Python函数式编程中map()、reduce()和filter()函数的用法

    Python中map().reduce()和filter()三个函数均是应用于序列的内置函数,分别对序列进行遍历.递归计算以及过滤操作.这三个内置函数在实际使用过程中常常和“行内函数”lambda函数 ...

  10. find 删除文件

    find 目录 -type f -name '*' -print0 | xargs -0 rm