unity应用之socket连接–步骤二数据传输
上一文说明了使用socket搭建服务端和客户端程序,本文说的是socket的数据传输。
我们使用socket的目的是解决点对点之间的数据传输,之前提到了socket中一个重要的概念:端口。而socket传输数据的方式就是端口与端口之间以流(stream)的方式传输数据,socket命名空间中提供了该流的一个功能类(NetworkStream),用起来很方便,因为任何可以转换为二进制的数据都可以保存到流中,所以可以再客户端与服务器之前传输任何形式的数据。
1.新建一个VS的控制台应用程序,在工程中新建c#项目,在脚本中输入以下代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Net.Sockets;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
IPAddress ip = IPAddress.Parse("192.168.1.104");
TcpListener tlistener = new TcpListener(ip, 10001);
tlistener.Start();//有对应的客户端,即有正确的ip,才会开始运行这条语句
Console.WriteLine("server监听启动......");
TcpClient remoteClient = tlistener.AcceptTcpClient();//进行连接,返回remoteclient客户端变量
Console.WriteLine("client已连接!local:{0}<---Client:{1}", remoteClient.Client.LocalEndPoint, remoteClient.Client.RemoteEndPoint);
//服务端发送数据部分
string msg = "hello server";
//接收已连接的remoteclient的数据,即客户端的流
NetworkStream streamToClient = remoteClient.GetStream();
byte[] buffer = Encoding.Unicode.GetBytes(msg);//将字符串转化为二进制
streamToClient.Write(buffer, 0, buffer.Length);//将转换好的二进制数据写入客户端的流中并发送
Console.WriteLine("发出消息:{0}" , msg);
}
}
}
代码解析:
1.ip地址在cmd命令窗口中输入ipconfig/all,回车后得到本机ip地址,或者直接输入127.0.0.1无需换ip。
2.此处是服务端,要接收来自客户端的连接请求。
3.这里用到的是堵塞方法,即一直处于等待,等待unity客户端的请求后,继续输出。
4.连接后,服务端向客户端发送数据。
2. 客户端使用Unity3D,在unity项目中,在场景中新建空物体,将下面的脚本挂在该物体上。
using UnityEngine;
using System.Collections;
using System.Net;
using System.Net.Sockets;
using System;
using System.Text;
public class SocketClient : MonoBehaviour
{
//开始连接的请求信号
void Update()
{
if (Input.GetKeyDown(KeyCode.Alpha1))
{
Client();
}
}
private void Client()
{
TcpClient client = new TcpClient();//client是服务端的变量
try
{
//与服务端建立一个TCP连接,连接好以后,客户端就会等待服务端发来的数据
client.Connect(IPAddress.Parse("192.168.1.104"), 10001);
}
catch (Exception ex)
{
Debug.Log("客户端连接异常:" + ex.Message);
}
Debug.Log("LocalEndPoint = " + client.Client.LocalEndPoint + ". RemoteEndPoint = " + client.Client.RemoteEndPoint);
//客户端接收服务端发送的数据部分
const int bufferSize = 8792;
NetworkStream streamToClient = client.GetStream();//获得来自服务端的流
byte[] buffer = new byte[bufferSize];//定义一个缓存buffer数组
int byteRead = streamToClient.Read(buffer, 0, bufferSize);//将数据存入缓存中
string msg = Encoding.Unicode.GetString(buffer, 0, byteRead);//从二进制转换为字符串对应的客户端会有从字符串转换为二进制的方法
Debug.Log("接收消息:" + msg);
}
}
代码解析:
1、IP地址的获取和上面是一样的,因为这里两个程序的连接是在同一台电脑上,所以ip地址相同。
2、运行时,先运行第一个程序,再运行该unity程序,在unity运行窗口中输入1,2,第一个程序才开始连接接口。
注意:是服务端等待客户端连接的请求,再进行连接。
3、客户端接受服务端的数据,并输出。
成功界面:
1、数据量过大超过自定义的缓存大小,8192字节。一般发送字符串的话几乎不可能超过8192字节,如果发送图片或者音效的话就会出现数据被截断的现象。
2、以上程序只是一个程序想服务端发送一次数据的过程,不能多次发送,更不能多个客户端想服务器发送数据。