上一篇博客主要介绍了使用socket搭建服务端和client程序,这一篇来说说socket的数据传输,我们使用socket的目的是解决点对点之间的数据传输,之前提到了socket中一个重要的概念:port。而socket数据传输的方式就是port与port之间以流(stream)的方式数据传输,socket命名空间中提供了该流的一个功能类(NetworkStream),用起来非常方便,由于不论什么能够转换为二进制的数据都能够保存到流中,所以能够再client与server之前传输不论什么形式的数据。

以下我们介绍最主要的传输数据,由client向服务端发送数据,服务端接收到数据后并显示!还是依照惯例,服务端使用VS的控制台应用程序。client使用Unity3D来整。核心语句都有凝视,重载方法能够再msdn上自行查看。

如有错误,欢迎指正!

1、服务端接收数据并显示:

static void Main(string[] args)
{
const int bufferSize = 8792;//缓存大小,8192字节
IPAddress ip = IPAddress.Parse("192.168.0.13"); TcpListener tlistener = new TcpListener(ip, 10001);
tlistener.Start();
Console.WriteLine("server监听启动......");
TcpClient remoteClient = tlistener.AcceptTcpClient();//接收已连接的client,堵塞方法
Console.WriteLine("client已连接!local:{0}<---Client:{1}", remoteClient.Client.LocalEndPoint, remoteClient.Client.RemoteEndPoint); //接收client发送的数据部分
NetworkStream streamToClient = remoteClient.GetStream();//获得来自client的流
byte[] buffer = new byte[bufferSize];//定义一个缓存buffer数组
int byteRead = streamToClient.Read(buffer,0,bufferSize);//将数据搞入缓存中(有朋友说read是堵塞方法,測试中未发现程序堵塞)
string msg = Encoding.Unicode.GetString(buffer, 0, byteRead);//从二进制转换为字符串相应的client会有从字符串转换为二进制的方法
Console.WriteLine("接收数据:{0}[{1}byte]",msg,byteRead); ConsoleKey key;
do
{
key = Console.ReadKey(true).Key;
}
while (key != ConsoleKey.Q);
}

2、client封装字符串并发送:

TcpClient client;
private void Client()
{
client = new TcpClient();
try
{
client.Connect(IPAddress.Parse("192.168.0.13"), 10001);//同步方法,连接成功、抛出异常、服务器不存在等之前程序会被堵塞
}
catch (Exception ex)
{
Debug.Log("客户端连接异常:"+ex.Message);
}
Debug.Log("LocalEndPoint = " + client.Client.LocalEndPoint + ". RemoteEndPoint = " + client.Client.RemoteEndPoint); //客户端发送数据部分
string msg = "hello server";
NetworkStream streamToServer = client.GetStream();//获得客户端的流
byte[] buffer = Encoding.Unicode.GetBytes(msg);//将字符串转化为二进制
streamToServer.Write(buffer, 0, buffer.Length);//将转换好的二进制数据写入流中并发送
Debug.Log("发出消息:"+msg);
}

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

注意:以上仅仅是基础的数据通信,真正项目中会存在两个问题:

1、数据量过大超过自己定义的缓存大小,8192字节。一般发送字符串的话差点儿不可能超过8192字节,假设发送图片或者音效的话就会出现数据被截断的现象。

2、以上程序仅仅是一个程序想服务端发送一次数据的过程。不能多次发送,更不能多个client想server发送数据。

我上网查了下这两个问题,都应对应的解决方法。採用“分次读取,然后转存”的方式解决数据量过大,使用do/while双层嵌套能够解决多个client向server发送多个消息的问题。兴许会将方案再分享给大家,与大家一起学习进步!

unity3D中使用Socket进行数据通信(二)的更多相关文章

  1. unity3D中使用Socket进行数据通信(一)

    公司今年3D产品的工作中心主要集中在提高产品深度上,通过对竞争产品的分析,发现我们的缺陷在于多人在线与后台管理部分,多人在线使用unity自带的Network能够搞定,后台部分前段时间主要研究了下Sq ...

  2. Unity3D中简单的C#异步Socket实现

    Unity3D中简单的C#异步Socket实现 简单的异步Socket实现..net框架自身提供了很完善的Socket底层.笔者在做Unity3D小东西的时候需要使用到Socket网络通信.于是决定自 ...

  3. linux内核中的文件描述符(二)--socket和文件描述符

    http://blog.csdn.net/ce123_zhouwei/article/details/8459730 Linux内核中的文件描述符(二)--socket和文件描述符 Kernel ve ...

  4. 【Unity3d游戏开发】Unity3D中的3D数学基础---向量

    向量是2D.3D数学研究的标准工具,在3D游戏中向量是基础.因此掌握好向量的一些基本概念以及属性和常用运算方法就显得尤为重要.在本篇博客中,马三就来和大家一起回顾和学习一下Unity3D中那些常用的3 ...

  5. Python基础篇【第8篇】: Socket编程(二)SocketServer

    SocketServer 在上一篇文章中我们学习了利用socket模块创建socket通信服务,但细心学习后就会发现利用socket模块创建的服务无法进行多进程的处理,当需要进行大量请求处理时,请求就 ...

  6. unity3d中 刚体(Rigidbody) 碰撞体(Collider) 触发器(Is Trigger)

      刚体(Rigidbody)的官方(摘自Unity3d的官方指导书<Unity4.x从入门到精通>)解释如下: Rigidbody(刚体)组件可使游戏对象在物理系统的控制下来运动,刚体可 ...

  7. Unity3D中Ragdoll的用法

    一.创建Ragdoll      见unity3d组件文档里的Ragdoll Wizard.由于unity3d中的Ragdoll设置的骨骼点名字与3DMAX里人体骨骼命名有些不一样,下图为Unity3 ...

  8. Unity3D中的Coroutine详解

    Unity中的coroutine是通过yield expression;来实现的.官方脚本中到处会看到这样的代码. 疑问: yield是什么? Coroutine是什么? unity的coroutin ...

  9. Unity3d在线游戏Socket通讯

    网络游戏是一个人的互动娱乐软件应用.因为它是交互式,当然,需要了解对方的通信.这需要通信Socket:我们今天要实现的主角即套接字.Socket的英文原义是"孔"或"插座 ...

随机推荐

  1. Spring JdbcTemplate查询实例

    这里有几个例子向您展示如何使用JdbcTemplate的query()方法来查询或从数据库提取数据.整个项目的目录结构如下: 1.查询单行数据 这里有两种方法来查询或从数据库中提取单行记录,并将其转换 ...

  2. Linux开发环境必备十大开发工具

    Linux是一个优秀的开发环境,但是如果没有好的开发工具作为武器,这个环境给你带来的好处就会大打折扣.幸运的是,有很多好用的Linux和开源开发工具供你选择,如果你是一个新手,你可能不知道有哪些工具可 ...

  3. 把Jar文件转成exe安装文件

    1.你要清楚的目标文件是32位还是64位的,如果生成的是32位,你就要使用32位的jre,如果生成的是64位,就要使用64位的jre. 图 1 在圆圈位置进行32bit或64bit的选择.因为我要创建 ...

  4. H.264远程视频监控系统

    由usb摄像头驱动,h264编码库,采集read_video,传输,客户端显示组成 读取摄像头数据缓冲区是否有帧数据收到,有数据收到就读取数据并进行H264编码,把数据发送到socket发送到客户端. ...

  5. Orchard运用 - 整合多说评论插件

    曾经我在一随笔讲述如何整合第三方Disqus评论插件,不过这一插件不是本土,对中国客户毕竟有点别扭.比如这一随笔就提到为啥要选择多说 - 另外一个国内比较知名的评论插件. 今天跟大家分享如何用最简单的 ...

  6. go语言基础之格式化输出

    1.fmt包的格式化输出输入 格式说明 格式 含义 %% 一个%字面量 %b 一个二进制整数值(基数为2),或者是一个(高级的)用科学计数法表示的指数为2的浮点数 %c 字符型.可以把输入的数字按照A ...

  7. 如何配置通过Fiber Channel连接主机与存储

    在一台Windows Client上, 安装免费的Cisco Fabric Manager. 笔者安装的是Fabric Manager 5.0(7). 注意, 这台Windows Client上应该安 ...

  8. RS查询报错之递归公用表表达式不包含顶级 UNION ALL运算符

    在FM里面涉及模型的时候,修改了物理层的查询SQL如下 select * from TARGET_VISIT_GH where ghksdm in(select dept_id from DIM_BI ...

  9. C#中Split用法~字符串分隔

    1.用字符串分隔: using System.Text.RegularExpressions;string str="aaajsbbbjsccc";string[] sArray= ...

  10. .NET破解之PDF编辑器

    本教程只能用于学习研究,不可进行任何商业用途.如有使用,请购买正版,尊重他人劳动成果和知识产权! 第一效果团队(1XG Team)组建于2004年,并长期致力于WINDOWS平台应用软件开发,产品主要 ...