Unity的弱联网Json数据传输
void Start () {
Thread t = new Thread (Check); // No need to explicitly use ThreadStart
t.Start();
}
static string TestServer = "http://192.168.1.105:8080/cross";
static void Check() {
HttpClients httpClient = new HttpClients();
Dictionary<string, string> data = new Dictionary<string, string>();
if(result==null){
result = new Dictionary<string, string>();
}else{
result.Clear();
}
data.Add("appName","cutit");
data.Add("platform","android");
data.Add("language","chinese");
data.Add("channel","offical");
ResultResponse resultResponse = httpClient.OpenPostUrl(TestServer,null,data);
string resultString = resultResponse.GetContent().ToString();
Dictionary<string, string>m = httpClient.JsonToDict(resultString);
int resultCode = int.Parse(m["resultCode"]);
if(resultCode ==){
string adState = "" + m["adState"];
string isShowLogoText = "" + m["key1"];
Debug.Log("steve:" + adState + ":" + isShowLogoText);
if(adState == "OFF"){
}
if(isShowLogoText == "ON"){
}
}
}
using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Text;
using UnityEngine;
using System.Text.RegularExpressions; namespace HttpClient
{ /// <summary>
/// 通过Http协议访问Web
/// </summary>
public class HttpClients
{
#region Cookie集合
/// <summary>
/// Cookie集合
/// </summary>
private CookieContainer cookies;
#endregion #region Http user-agent标头值
/// <summary>
/// Http user-agent标头值
/// </summary>
public string UserAgent { get; set; }
#endregion #region HttpClient构造函数
public HttpClients()
{
this.cookies = new CookieContainer();
}
#endregion #region 获取HttpClient的Cookie集合
/// <summary>
/// 获取HttpClient的Cookie集合
/// </summary>
/// <returns></returns>
public CookieContainer GetCookieContainer()
{
return this.cookies;
}
#endregion #region 设置HttpClient的Cookie集合
/// <summary>
/// 设置HttpClient的Cookie集合
/// </summary>
/// <param name="_cookie">Cookie集合对象</param>
/// <returns>True设置成功 False设置失败</returns>
public bool SetCookieContainer(CookieContainer _cookie)
{
if (_cookie != null)
{
this.cookies = _cookie;
return true;
}
return false;
}
#endregion #region 以GET方式打开一个Http连接
/// <summary>
/// 以GET方式打开一个Http连接
/// </summary>
/// <param name="url">地址</param>
/// <param name="headers">请求头</param>
/// <returns></returns>
public ResultResponse OpenGetUrl(string url, Dictionary<string, string> headers)
{
HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
request.CookieContainer = this.cookies;
request.Method = HttpClients.ConnectionType.GET;
request.KeepAlive = true;
if (this.UserAgent != null && this.UserAgent != "")
{
request.UserAgent = this.UserAgent;
}
this.FillHeaders(request, headers);
HttpWebResponse response = request.GetResponse() as HttpWebResponse;
return new ResultResponse(response);
}
#endregion #region 以GET方式打开一个Http连接,302自定义处理行为
/// <summary>
/// 以GET方式打开一个Http连接,302自定义处理行为
/// </summary>
/// <param name="url">地址</param>
/// <param name="headers">请求头</param>
/// <param name="action">302跳转处理</param>
/// <returns></returns>
public ResultResponse OpenGetUrlRedirect(string url, Dictionary<string, string> headers,HttpClients.RedirectAction action)
{
HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
request.CookieContainer = this.cookies;
request.Method = HttpClients.ConnectionType.GET;
request.KeepAlive = true;
request.AllowAutoRedirect = false; //302不采用默认行为处理
if (this.UserAgent != null && this.UserAgent != "")
{
request.UserAgent = this.UserAgent;
}
this.FillHeaders(request, headers);
HttpWebResponse response = request.GetResponse() as HttpWebResponse;
ResultResponse result=new ResultResponse(response);
if (response.StatusCode == HttpStatusCode.Found)
{
bool ret = true;
if (action != null)
{
ret = action(result);
}
string locationurl = response.Headers["Location"];
if (ret == true)
{
return this.OpenGetUrlRedirect(locationurl, null, action);
}
return result;
}
return result;
}
#endregion #region Http 302跳转处理
/// <summary>
/// Http 302跳转处理
/// </summary>
/// <param name="result">响应对象</param>
/// <returns>False 不继续跳转 True继续跳转</returns>
public delegate bool RedirectAction(ResultResponse result);
#endregion #region 将Http标头值添加到Request对象中
/// <summary>
/// 将Http标头值添加到Request对象中
/// </summary>
/// <param name="headers"></param>
private void FillHeaders(HttpWebRequest request,Dictionary<string, string> headers)
{
if (headers != null && headers.Count > )
{
Dictionary<string, string>.Enumerator em = headers.GetEnumerator();
while (em.MoveNext())
{
request.Headers.Add(em.Current.Key, em.Current.Value);
}
}
}
#endregion #region 以POST方式打开一个Http连接
/// <summary>
/// 以POST方式打开一个Http连接
/// </summary>
/// <param name="url">地址</param>
/// <param name="headers">请求头</param>
/// <param name="data">发送的数据</param>
/// <returns></returns>
public ResultResponse OpenPostUrl(string url,Dictionary<string,string> headers,Dictionary<string,string> data)
{
HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
request.CookieContainer = this.cookies;
request.Method = HttpClients.ConnectionType.POST;
request.KeepAlive = true;
if (this.UserAgent != null && this.UserAgent != "")
{
request.UserAgent = this.UserAgent;
}
this.FillHeaders(request, headers);
byte[] buff = DictToBytes(data);
request.GetRequestStream().Write(buff, , buff.Length);
request.GetRequestStream().Close();
HttpWebResponse response = request.GetResponse() as HttpWebResponse;
return new ResultResponse(response);
}
#endregion #region 以POST方式打开一个Http连接,302自定义处理行为
/// <summary>
/// 以POST方式打开一个Http连接,302自定义处理行为
/// </summary>
/// <param name="url">地址</param>
/// <param name="headers">请求头</param>
/// <param name="data">发送的数据</param>
/// <param name="action">302自定义处理</param>
/// <returns></returns>
public ResultResponse OpenPostUrlRedirect(string url, Dictionary<string, string> headers, Dictionary<string, string> data,HttpClients.RedirectAction action)
{
HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
request.CookieContainer = this.cookies;
request.Method = HttpClients.ConnectionType.POST;
request.KeepAlive = true;
request.AllowAutoRedirect = false;
if (this.UserAgent != null && this.UserAgent != "")
{
request.UserAgent = this.UserAgent;
}
this.FillHeaders(request, headers);
byte[] buff = DictToBytes(data);
request.GetRequestStream().Write(buff, , buff.Length);
request.GetRequestStream().Close();
HttpWebResponse response = request.GetResponse() as HttpWebResponse;
ResultResponse result = new ResultResponse(response); if (response.StatusCode == HttpStatusCode.Found)
{
bool ret = true;
if (action != null)
{
ret = action(result);
}
string locationurl = response.Headers["Location"];
return result;
}
return result;
}
#endregion #region 将字典的key和value拼接成http参数
/// <summary>
/// 将字典的key和value拼接成http参数
/// </summary>
/// <param name="dic">参数</param>
/// <returns></returns>
private byte[] DictToBytes(Dictionary<string, string> dic)
{
StringBuilder sb = null;
if (dic != null)
{
Dictionary<string,string>.Enumerator em= dic.GetEnumerator();
sb = new StringBuilder();
sb.Append("{");
while (em.MoveNext())
{
sb.Append(String.Format("{0}:{1};", '"'+ em.Current.Key + '"', '"' + em.Current.Value + '"'));
}
sb.Remove (sb.Length-,);
sb.Append("}");
return System.Text.Encoding.UTF8.GetBytes(sb.ToString());
}
return null;
} public Dictionary<string, string> JsonToDict(string json)
{
StringBuilder sb = new StringBuilder(json);
Dictionary<string, string> result = new Dictionary<string, string>();
if (json != null && json != "") {
sb.Remove (, );
sb.Remove (sb.Length - , );
string t = "" + sb;
string[] temp = Regex.Split (t, ",", RegexOptions.IgnoreCase); for (int i = ; i < temp.Length; i++) {
temp[i] = Regex.Replace (temp [i], "\"","", RegexOptions.IgnoreCase);
string[] splits = Regex.Split (temp [i],":", RegexOptions.IgnoreCase);
result.Add (splits [].ToString(), splits [].ToString());
} return result;
} return null;
} #endregion #region HttpClient打开连接的方式
/// <summary>
/// HttpClient打开连接的方式
/// </summary>
public static class ConnectionType
{
public static string GET { get { return "GET"; } }
public static string POST { get { return "POST"; } }
}
#endregion }
}
using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Text; namespace HttpClient
{ /// <summary>
///包含服务器响应数据的对象
/// </summary>
public class ResultResponse
{
#region HttpWebResponse对象
/// <summary>
/// HttpWebResponse对象
/// </summary>
private HttpWebResponse m_response;
#endregion #region 创建一个HttpWebResponse对象
/// <summary>
/// 创建一个HttpWebResponse对象
/// </summary>
/// <param name="_response">HttpWebResponse</param>
public ResultResponse(HttpWebResponse _response)
{
this.m_response = _response;
}
#endregion #region 获取响应内容的二进制流
/// <summary>
/// 获取响应内容的二进制流
/// </summary>
/// <returns></returns>
public Stream GetResponseStream()
{
if (this.m_response != null)
{
return this.m_response.GetResponseStream();
}
return null;
}
#endregion #region Http版本
/// <summary>
/// Http版本
/// </summary>
public string ProtocolVersion { get { return this.m_response != null ? this.m_response.ProtocolVersion.ToString() : ""; } }
#endregion
/// <summary>
/// 响应方法
/// </summary>
public string Method { get { return this.m_response != null ? this.m_response.Method : ""; } }
/// <summary>
/// Http状态码
/// </summary>
public string StatusCode { get { return this.m_response != null ? this.m_response.StatusCode.ToString() : ""; } }
/// <summary>
/// Http响应头
/// </summary>
public WebHeaderCollection Headers { get { return this.m_response != null ? this.m_response.Headers : null;} } /// <summary>
/// 响应流的字符编码
/// </summary>
/// <returns></returns>
public Encoding getResponseEncoding()
{
if (this.m_response != null)
{
return Encoding.GetEncoding(this.m_response.ContentEncoding);
}
return null;
} /// <summary>
/// 获取响应内容的字符串
/// </summary>
/// <param name="encoding">字符串编码(默认utf8)</param>
/// <returns></returns>
public string GetContent(string encoding="utf-8")
{
return System.Text.Encoding.GetEncoding(encoding).GetString(this.StreamtoBytes(this.GetResponseStream())); // return System.Text.Encoding.GetEncoding(encoding).GetString(this.StreamtoBytes(this.GetResponseStream()));
} /// <summary>
/// 获取原始的HttpWebResponse
/// </summary>
/// <returns></returns>
public HttpWebResponse GetRawResponse()
{
return this.m_response;
} /// <summary>
/// 二进制流转换成字节数组
/// </summary>
/// <param name="_stream"></param>
/// <returns></returns>
private byte[] StreamtoBytes(Stream _stream)
{
byte[] buff;
int rlen;
MemoryStream _ms;
if (_stream != null)
{
buff = new byte[];
rlen = ;
_ms = new MemoryStream();
while ((rlen = _stream.Read(buff, , )) > )
{
_ms.Write(buff, , rlen);
}
buff = _ms.ToArray();
_ms.Close();
_ms.Dispose();
return buff;
}
return null;
}
}
}
Unity的弱联网Json数据传输的更多相关文章
- Java游戏服务器成长之路——弱联网游戏篇(源码分析)
前言 前段时间由于公司的一款弱联网游戏急着上线,没能及时分享,现在基本做的差不多,剩下的就是测试阶段了(本来说元旦来分享一下服务器技术的).公司的这款游戏已经上线一年多了,在我来之前一直都是单机版本, ...
- 【Cocos2d-Js基础教学(6)网络层(弱联网)的封装及使用】
谈到联网,在游戏中也是非常核心的模块,在官方Js-test中我们可以找到联网部分 的NetworkTest文件下有两个类 SocketIOTest.js(Socket 类) WebSocketTest ...
- 单机 & 弱联网手游 防破解、金币改动 简单措施
手游经常使用破解方法 对于一个弱联网或者单机游戏,能够从下面方面去破解: 1.找得到存档文件的,直接破解改动存档文件. 2.找不到存档文件,就在游戏执行时借助一些软件来改动数值,比方用各种改动器手游助 ...
- 【Cocos2d-x游戏开发】Cocos2d-x中的弱联网技术
在上一篇博客中,我们一起学习了如何在Cocos2d-x中存储数据和读取信息,本篇博客我们将一起讨论和数据存储同样重要的联网技术. 一.弱联网技术介绍 在网络游戏中许多重要的功能都需要网络连接,而根据需 ...
- 5.QT中关于HTTPClient相关的操作,Json数据传输
新建项目T12HttpClient T12HttpClient.pro SOURCES += \ main.cpp QT += network CONFIG += C++11 main.cpp ...
- Unity判断用户联网状态,WiFi/移动网络/无网络
Unity判断用户联网状态 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分享. ...
- Unity游戏数据用Json保存
(一)关于路径 unity有几个关键的路径 (1).Application.dataPath 只读路径,就是工作目录的Assets路径 (2).Application.streamingAssetsP ...
- unity 通过JsonUtility实现json数据的本地保存和读取
本文主要讲解json数据在本地的保存和读取,使用的是unity5之后提供的JsonUtility工具. 一.关于json数据的保存 在实际开发中,有时候可能涉及到大量数据保存到本地,以便于下次客户端的 ...
- 【一天一个小知识10/20】Unity通过www获取json文本信息。
前提:领导要我在unity获取局域网服务器的文本信息.给了一个json的网络文本让我测试.我对于json以及服务器比较陌生.就直接去网上找相关的资料. 以下是自己测试的代码,没问题. 测试的网络jso ...
随机推荐
- python3+pyQt5+QtDesignner实现窗口化猜数字游戏
描述:使用QtDesignner设计界面,pyQt5+python3实现主体方法制作的猜数字游戏. 游戏规则:先选择游戏等级:初级.中级.高级.魔鬼级,选择完游戏等级后点击“确定”,然后后台会自动生成 ...
- Java项目案例之---开灯(面向对象复习)
开灯(面向对象复习) 设计一个台灯类(Lamp)其中台灯有灯泡类(Buble)这个属性,还有开灯(on)这个方法 设计一个灯泡类(Buble),灯泡类有发亮的方法 其中有红灯泡类(RedBuble)和 ...
- 跟着大彬读源码 - Redis 4 - 服务器的事件驱动有什么含义?(上)
众所周知,Redis 服务器是一个事件驱动程序.那么事件驱动对于 Redis 而言有什么含义?源码中又是如何实现事件驱动的呢?今天,我们一起来认识下 Redis 服务器的事件驱动. 对于 Redis ...
- 原创:Python编写通讯录,支持模糊查询,利用数据库存储
1.要求 数据库存储通讯录,要求按姓名/电话号码查询,查询条件只有一个输入入口,自动识别输入的是姓名还是号码,允许模糊查询. 2.实现功能 可通过输入指令进行操作. (1)首先输入“add”,可以对通 ...
- 在CentOS6.5部署Redis为开机自启
2 - redis的生产启动方案 要把redis作为一个系统的daemon进程 去运行的,每次系统启动,redis进程一起启动,配置方案如下: 1. 在redis utils 目录下,有个redis_ ...
- Java编程思想:序列化基础部分
import java.io.*; import java.util.Date; import java.util.Random; public class Test { public static ...
- FAIRR
FAIRR 在进行一项工作时需要注意学习.应用和改进已有信息和成果,可参考FAIRR原则: Find existing info and result, Add to and Improve it, ...
- django中ORM的model对象和querryset 简单解析
欢迎大家查看我的博客,我会不定时的用大白话发一些看了就能懂的文章,大家多多支持!如您对此文章内容有独特见解,欢迎与笔者练习一起探讨学习!原创文创!转载请注明出处! ORM是干嘛的? 介绍orm之前我应 ...
- Python学习6——再谈抽象(面对对象编程)
1.对象魔法 在面对对象编程中,术语对象大致意味着一系列数据(属性)以及一套访问和操作这些数据的方法. 使用对象而非全局变量以及函数的原因有多个,而最重要的好处不过以下几点: 多态:可对不同类型的对象 ...
- Android App安装包瘦身计划
Android App安装包瘦身计划 Android App安装包体积优化: 理由, 指标和可以采用的方法. 本文内容归纳如下图: 为什么要安装包瘦身 安装包需要瘦身吗? 不需要吗? 安装包要瘦身的主 ...