开发Unity项目过程中,即时通信功能来完成服务器与客户端自定义的数据结构封装。

如果要序列化和数据封装参考:Unity3D之C#用Socket传数据包

蓝鸥3G封装的类

客户端脚本ClientScript

/// <summary>
/// Client Script.
/// Created By 蓝鸥3G 2014.08.23
/// </summary> using UnityEngine;
using System.Collections; public class ClientScript: MonoBehaviour {
string msg = "";
// Use this for initialization LOSocket client;
void Start () {
client = LOSocket.GetSocket(LOSocket.LOSocketType.CLIENT);
client.InitClient ("127.0.0.1", 2222, ((string content) => {
//收到服务器的回馈信息
}));
} void OnGUI() {
msg = GUI.TextField(new Rect(0, 0, 500, 40), msg);
if(GUI.Button(new Rect(0, 50, 100, 30), "Send"))
{ client.SendMessage (msg);
}
}
}

服务器端脚本

using UnityEngine;
using System.Collections; public class ServerScript : MonoBehaviour { private string receive_str;
LOSocket server;
// Use this for initialization
void Start ()
{
server = LOSocket.GetSocket(LOSocket.LOSocketType.SERVER);
//初始化服务器
server.InitServer((string content) => {
receive_str = content;
});
} void OnGUI()
{
if (receive_str != null)
{
GUILayout.Label (receive_str);
}
}
}

LOSocket框架

using UnityEngine;
using System.Collections;
using System.Net;
using System.Net.Sockets;
using System.Text; //收到消息后的委托回调
public delegate void ReceiveCallBack(string content); public class LOSocket{ //可以创建的Socket端口类型
public enum LOSocketType
{
CLIENT = 0,
SERVER = 1,
}
#region --------取消构造器
private LOSocket()
{
} #endregion #region --------公共代码
//通过静态方法获取不同的端口类型
public static LOSocket GetSocket(LOSocket.LOSocketType type)
{
LOSocket socket = null; switch (type) {
case LOSocketType.CLIENT:
{
//创建一个新的客户端
socket = new LOSocket ();
break;
}
case LOSocketType.SERVER:
{
//获取服务端
socket = GetServer ();
break;
}
} return socket;
} #endregion
#region --------客户端部分代码
private Socket clientSocket; //声明客户端收到服务端返回消息后的回调委托函数
private ReceiveCallBack clientReceiveCallBack;
//用来存储服务端返回的消息数据
byte[] Buffer = new byte[1024]; //初始化客户端Socket信息
public void InitClient(string ip,int port,ReceiveCallBack ccb)
{
this.clientReceiveCallBack = ccb;
this.clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPAddress address = IPAddress.Parse (ip);
IPEndPoint ep = new IPEndPoint (address, port); this.clientSocket.Connect(ep);
//开始异步等待接收服务端消息
this.clientSocket.BeginReceive (Buffer, 0, Buffer.Length, SocketFlags.None, new System.AsyncCallback(ReceiveFromServer), this.clientSocket);
} //收到服务端返回消息后的回调函数
void ReceiveFromServer(System.IAsyncResult ar)
{
//获取当前正在工作的Socket对象
Socket worker = ar.AsyncState as Socket;
int ByteRead=0;
try
{
//接收完毕消息后的字节数
ByteRead = worker.EndReceive(ar);
}
catch (System.Exception ex)
{
this.clientReceiveCallBack (ex.ToString ());
}
if (ByteRead > 0)
{
string Content = Encoding.Default.GetString (Buffer);
//通过回调函数将消息返回给调用者
this.clientReceiveCallBack (Content);
}
//继续异步等待接受服务器的返回消息
worker.BeginReceive(Buffer, 0, Buffer.Length, SocketFlags.None, new System.AsyncCallback(ReceiveFromServer), worker);
} //客户端主动发送消息
public void SendMessage(string message)
{
if (message == null)
return; message += "\r\n";
byte[] sendData = Encoding.UTF8.GetBytes (message); //异步发送消息请求
clientSocket.BeginSend (sendData, 0, sendData.Length, SocketFlags.None, new System.AsyncCallback (SendToServer), clientSocket);
}
//发送消息结束的回调函数
void SendToServer(System.IAsyncResult ar)
{
Socket worker = ar.AsyncState as Socket;
worker.EndSend (ar);
} #endregion #region -------服务器部分代码
//服务器端收到消息的存储空间
byte[] ReceiveBuffer = new byte[1024];
//服务器收到消息后的回调委托
private ReceiveCallBack callback; //单例模式
private static LOSocket serverSocket;
private static LOSocket GetServer() {
if (serverSocket == null) {
serverSocket = new LOSocket();
}
return serverSocket;
} //初始化服务器信息
public void InitServer(ReceiveCallBack cb) {
this.callback = cb;
// 1.
Socket server_socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
// 2.
IPEndPoint endPoint = new IPEndPoint(IPAddress.Any, 2222);
// 3.
server_socket.Bind(endPoint);
// 4.
server_socket.Listen(10);
// 5.开始异步等待客户端的请求链接
server_socket.BeginAccept (new System.AsyncCallback (Accept), server_socket); this.callback ("开启服务器" + endPoint.ToString());
} //接受到客户端的链接请求后的回调函数
void Accept(System.IAsyncResult ar){
//获取正在工作的Socket对象
Socket socket = ar.AsyncState as Socket;
//存储异步操作的信息,以及用户自定义的数据
Socket worker = socket.EndAccept(ar); SocketError error; //开始异步接收客户端发送消息内容
worker.BeginReceive (ReceiveBuffer, 0, ReceiveBuffer.Length, SocketFlags.None, new System.AsyncCallback (Receive), worker);
//继续异步等待新的客户端链接请求
socket.BeginAccept(new System.AsyncCallback(Accept), socket); }
//服务端收到客户端的消息后的回调函数
void Receive(System.IAsyncResult ar)
{
//获取正在工作的Socket对象
Socket worker = ar.AsyncState as Socket;
int ByteRead=0;
try
{
ByteRead = worker.EndReceive(ar);
}
catch (System.Exception ex)
{
this.callback (ex.ToString ());
}
if (ByteRead > 0)
{
string Content = Encoding.Default.GetString (ReceiveBuffer);
this.callback (Content);
}
//继续异步等待客户端的发送消息请求
worker.BeginReceive(ReceiveBuffer, 0, ReceiveBuffer.Length, SocketFlags.None, new System.AsyncCallback(Receive), worker);
}
#endregion
}

#python客户端测试代码

#! /usr/env/bin python
#codinf=utf-8
import socket
import time def Client():
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(('', 8000))#链接服务器
while 1:
print 'enter something:',
ent = raw_input()
if ent == '':
break
sock.send(ent)#发送数据给服务器
time.sleep(1)
data = sock.recv(1024)#接收服务器发过来到数据
print 'echo=>',data
sock.close() if __name__ == '__main__':
Client()   

python服务器端测试代码

#! /usr/env/bin python
#coding=utf-8
import socket #Server
def Server():
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(('localhost', 8000))
sock.listen(5)#监听,最大链接数
while 1:
connection, address = sock.accept()#开始接受请求,进入等待阻塞状态,直到有链接到达
while 1:
data = connection.recv(1024)#接收客户端发过来的数据
if not data:
break
print data,address
connection.send(data)#发送数据到客户端,即上面到connection
connection.close() if __name__ == '__main__':
Server()

注意,这里没有对服务器的连接关闭,自己可以加上:sock.close()  

  

  

  

Unity中进程间通信——使用异步Socket的更多相关文章

  1. [Unity Socket]在Unity中如何实现异步Socket通信技术

    在刚刚开发Unity项目的过程中,需要用到即时通信功能来完成服务器与客户端自定义的数据结构封装. 现在将部分主要功能的实现代码抽取出来实现了可以异步Socket请求的技术Demo. 客户端脚本Clie ...

  2. Unity中进程间通信——使用Protobuf-net序列化与反序列化

    基于ProtoBuf协议实现网络传输(上) Protobuf 全称Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,很适合做数据存储或 RPC 数据交换格 ...

  3. C#使用ProtocolBuffer(ProtoBuf)进行Unity中的Socket通信

    首先来说一下本文中例子所要实现的功能: 基于ProtoBuf序列化对象 使用Socket实现时时通信 数据包的编码和解码 下面来看具体的步骤: 一.Unity中使用ProtoBuf 导入DLL到Uni ...

  4. 《Unity 3D游戏客户端基础框架》多线程异步 Socket 框架构建

    引言: 之前写过一个 demo 案例大致讲解了 Socket 通信的过程,并和自建的服务器完成连接和简单的数据通信,详细的内容可以查看 Unity3D -- Socket通信(C#).但是在实际项目应 ...

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

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

  6. GJM :异步Socket [转载]

    原帖地址:http://blog.csdn.net/awinye/article/details/537264 原文作者:Awinye 目录(?)[-] 转载请原作者联系 Overview of So ...

  7. Play!中使用HTTP异步编程

    本章译者:@Sam Liu (译者未留下自己的主页,请Sam Liu见此文,加入群168013302联系‘大黄蜂@翻译play’) 这一章主要讲解如何运用异步模式实现典型的长连接(long-polli ...

  8. Python简易聊天工具-基于异步Socket通信

    继续学习Python中,最近看书<Python基础教程>中的虚拟茶话会项目,觉得很有意思,自己敲了一遍,受益匪浅,同时记录一下. 主要用到异步socket服务客户端和服务器模块asynco ...

  9. 项目笔记---C#异步Socket示例

    概要 在C#领域或者说.net通信领域中有着众多的解决方案,WCF,HttpRequest,WebAPI,Remoting,socket等技术.这些技术都有着自己擅长的领域,或者被合并或者仍然应用于某 ...

随机推荐

  1. .NET本质论 实例

    对象和值的比较 CLR的类型系统(其实就是通用类型系统(CTS),它定义了如何在运行库中声明,使用和管理类型,同时也是运行库支持跨语言集成的一个重要组成部分)将对应简单值的类型同对应传统"对 ...

  2. Airtest Project的探索和使用

    Airtest使用参考博文: https://testerhome.com/topics/12391 1. 安装Python 3 2. 安装pip: 安装方法参考另外一篇随笔 pip3部署: C:\U ...

  3. IntelliJ IDEA使用心得

    前言:我原来一直使用的是Eclipse,但是发现有的教程上使用的是Intellij这个IDE,而且我发现Eclipse在Web编程上特别是页面上的自动补全上确实有些不足,而且Intellij这个软件的 ...

  4. java 连接 hiveserver2 例子

    启动了  hiveserver2 以后才能使用 程序连接 .目前的 使用的 是  server2 版本.和以前的版本驱动包名不同: package hadoop; import java.sql.Co ...

  5. Feign的使用

    一.Feign实现应用间的通信 声明式REST客户端(伪RPC),采用基于接口的注解.本质上是Http客户端,Http远程调用. 1. 在Order工程中的pom文件增加 <dependency ...

  6. golang gopacket网络抓包和分析

    gopacket 是golang语言使用的网络数据抓取和分析的工具包. 本文简单介绍如何使用gopacket进行网络抓包. 下载gopacket # go get git@github.com:goo ...

  7. cmp命令详解

    Linux cmp命令 Linux cmp命令用于比较两个文件是否有差异.主要用来比较两个二进制文件 当相互比较的两个文件完全一样时,则该指令不会显示任何信息.若发现有所差异,预设会标示出第一个不同之 ...

  8. Apache Kafka监控之KafkaOffsetMonitor

    转载自:http://www.cnblogs.com/Leo_wl/p/4564699.html 1.概述 前面给大家介绍了Kafka的背景以及一些应用场景,并附带上演示了Kafka的简单示例.然后, ...

  9. 基于Eclipse搭建hadoop开发环境

    一.基础环境准备 1.Eclipse 下载地址:http://pan.baidu.com/s/1slArxAP 2.JDK1.8  下载地址:http://pan.baidu.com/s/1i5iNy ...

  10. php代码覆盖率执行

    我们做平台项目时,我会为整个项目核心架构拆分成三部分:前段(pc展示.mobile展示).网关.中间层 中间层业务逻辑开发人员怎么保证自己的业务逻辑是严谨的,每个测试用例都run codecover呢 ...