当前位置:网站首页>Unity的网络请求_短连接
Unity的网络请求_短连接
2022-06-21 08:19:00 【kuilaurence】
using System.Text;
using UnityEngine;
using System.Collections;
using UnityEngine.Networking;
using System.Collections.Generic;
public class HttpControl : MonoBehaviour
{
public HttpType hType;
private void Start() //测试代码
{
Debug.Log("HttpType:" + hType.ToString());
string url = "https://api.apiopen.top/todayVideo";
string urlGET = "https://api.apiopen.top/musicRankingsDetails?";
if (hType == HttpType.GET)
{
StartCoroutine(SendMsgGET(urlGET, "type=1"));
}
else if (hType == HttpType.POST)
{
StartCoroutine(SendMsgPOST(url, "1", "1"));
}
}
/// <summary>
/// POST请求
/// </summary>
/// <param name="url"></param>
/// <param name="content"></param>
/// <param name="token"></param>
/// <returns></returns>
public IEnumerator SendMsgPOST(string url, string content, string token)
{
UnityWebRequest unityWeb = new UnityWebRequest(url, "POST");
byte[] body = Encoding.UTF8.GetBytes(content);
unityWeb.uploadHandler = new UploadHandlerRaw(body);
unityWeb.SetRequestHeader("Content-Type", "application/json;charset=utf-8");
unityWeb.SetRequestHeader("authorization", "Bearer " + token);
unityWeb.certificateHandler = new WebRequestCert();
unityWeb.downloadHandler = new DownloadHandlerBuffer();
UnityWebRequestAsyncOperation ao = unityWeb.SendWebRequest();
yield return ao;
if (ao.webRequest.isNetworkError || ao.webRequest.isHttpError)
{
Debug.Log("error receiving.");
}
else
{
byte[] encodedBytes = Encoding.UTF8.GetBytes(ao.webRequest.downloadHandler.text);
string data = Encoding.UTF8.GetString(encodedBytes);
Debug.Log("POST" + data);
}
}
public IEnumerator SendMsgGET(string url, string content)
{
UnityWebRequest unityWeb = UnityWebRequest.Get(url + content);
unityWeb.downloadHandler = new DownloadHandlerBuffer();
UnityWebRequestAsyncOperation ao = unityWeb.SendWebRequest();
yield return ao;
if (ao.webRequest.isNetworkError || ao.webRequest.isHttpError)
{
Debug.Log("error receiving.");
}
else
{
byte[] encodedBytes = Encoding.UTF8.GetBytes(ao.webRequest.downloadHandler.text);
string data = Encoding.UTF8.GetString(encodedBytes);
Debug.Log("GET" + data + "...");
}
}
}
/// <summary>
/// HTTP类型选择
/// </summary>
public enum HttpType
{
POST,
GET
}
/// <summary>
/// https跳过证书验证
/// </summary>
public class WebRequestCert : CertificateHandler
{
protected override bool ValidateCertificate(byte[] certificateData)
{
return true;
}
}
C#服务器代码参考:
https://www.cnblogs.com/tuyile006/p/11857590.html
using System;
using System.IO;
using System.Net;
using System.Threading;
using System.Net.Sockets;
using System.Collections;
namespace Bend.Util
{
public class HttpProcessor
{
public string http_url;
public string http_method;
public HttpServer srv;
public TcpClient socket;
public StreamWriter outputStream;
public string http_protocol_versionstring;
public Hashtable httpHeaders = new Hashtable();
private Stream inputStream;
private static int MAX_POST_SIZE = 10 * 1024 * 1024; // 10MB
public HttpProcessor(TcpClient socket, HttpServer srv)
{
this.socket = socket;
this.srv = srv;
}
private string StreamReadLine(Stream inputStream)
{
int next_char;
string data = "";
while (true)
{
next_char = inputStream.ReadByte();
if (next_char == '\n') {
break; }
if (next_char == '\r') {
continue; }
if (next_char == -1) {
Thread.Sleep(1); continue; };
data += Convert.ToChar(next_char);
}
return data;
}
public void Process()
{
// we can't use a StreamReader for input, because it buffers up extra data on us inside it's
// "processed" view of the world, and we want the data raw after the headers
inputStream = new BufferedStream(socket.GetStream());
// we probably shouldn't be using a streamwriter for all output from handlers either
outputStream = new StreamWriter(new BufferedStream(socket.GetStream()));
try
{
ParseRequest();
ReadHeaders();
if (http_method.Equals("GET"))
{
HandleGETRequest();
}
else if (http_method.Equals("POST"))
{
HandlePOSTRequest();
}
}
catch (Exception e)
{
Console.WriteLine("Exception: " + e.ToString());
WriteFailure();
}
outputStream.Flush();
// bs.Flush(); // flush any remaining output
inputStream = null; outputStream = null; // bs = null;
socket.Close();
}
public void ParseRequest()
{
string request = StreamReadLine(inputStream);
string[] tokens = request.Split(' ');
if (tokens.Length != 3)
{
throw new Exception("invalid http request line");
}
http_method = tokens[0].ToUpper();
http_url = tokens[1];
http_protocol_versionstring = tokens[2];
Console.WriteLine("starting: " + request);
}
public void ReadHeaders()
{
Console.WriteLine("readHeaders()");
string line;
while ((line = StreamReadLine(inputStream)) != null)
{
if (line.Equals(""))
{
Console.WriteLine("got headers");
return;
}
int separator = line.IndexOf(':');
if (separator == -1)
{
throw new Exception("invalid http header line: " + line);
}
string name = line.Substring(0, separator);
int pos = separator + 1;
while ((pos < line.Length) && (line[pos] == ' '))
{
pos++; // strip any spaces
}
string value = line.Substring(pos, line.Length - pos);
Console.WriteLine("header: {0}:{1}", name, value);
httpHeaders[name] = value;
}
}
public void HandleGETRequest()
{
srv.HandleGETRequest(this);
}
private const int BUF_SIZE = 4096;
public void HandlePOSTRequest()
{
// this post data processing just reads everything into a memory stream.
// this is fine for smallish things, but for large stuff we should really
// hand an input stream to the request processor. However, the input stream
// we hand him needs to let him see the "end of the stream" at this content
// length, because otherwise he won't know when he's seen it all!
Console.WriteLine("get post data start");
MemoryStream ms = new MemoryStream();
if (httpHeaders.ContainsKey("Content-Length"))
{
int content_len = Convert.ToInt32(httpHeaders["Content-Length"]);
if (content_len > MAX_POST_SIZE)
{
throw new Exception(string.Format("POST Content-Length({0}) too big for this simple server", content_len));
}
byte[] buf = new byte[BUF_SIZE];
int to_read = content_len;
while (to_read > 0)
{
Console.WriteLine("starting Read, to_read={0}", to_read);
int numread = this.inputStream.Read(buf, 0, Math.Min(BUF_SIZE, to_read));
Console.WriteLine("read finished, numread={0}", numread);
if (numread == 0)
{
if (to_read == 0)
{
break;
}
else
{
throw new Exception("client disconnected during post");
}
}
to_read -= numread;
ms.Write(buf, 0, numread);
}
ms.Seek(0, SeekOrigin.Begin);
}
Console.WriteLine("get post data end");
srv.HandlePOSTRequest(this, new StreamReader(ms));
}
public void WriteSuccess()
{
outputStream.WriteLine("HTTP/1.0 200 OK");
outputStream.WriteLine("Content-Type: text/html;charset=utf-8");
outputStream.WriteLine("Connection: close");
outputStream.WriteLine("");
}
public void WriteFailure()
{
outputStream.WriteLine("HTTP/1.0 404 File not found");
outputStream.WriteLine("Connection: close");
outputStream.WriteLine("");
}
}
public abstract class HttpServer
{
protected int port;
protected string ip;
TcpListener listener;
bool is_active = true;
public HttpServer(string ip, int port)
{
this.ip = ip;
this.port = port;
}
public void Listen()
{
listener = new TcpListener(IPAddress.Parse(ip), port);
listener.Start();
while (is_active)
{
TcpClient tc = listener.AcceptTcpClient();
HttpProcessor processor = new HttpProcessor(tc, this);
Thread thread = new Thread(new ThreadStart(processor.Process));
thread.Start();
Thread.Sleep(1);
}
}
public abstract void HandleGETRequest(HttpProcessor p);
public abstract void HandlePOSTRequest(HttpProcessor p, StreamReader inputData);
}
public class MyHttpServer : HttpServer
{
public MyHttpServer(string ip, int port) : base(ip, port)
{
}
public override void HandleGETRequest(HttpProcessor p)
{
p.WriteSuccess();
p.outputStream.Write("{\"needs\":[{\"token\":\"0x610178dA211FEF7D417bC0e6FeD39F05609AD788\",\"value\":1},{\"token\":\"0x610178dA211FEF7D417bC0e6FeD39F05609AD788\",\"value\":2}],\"rewards\":[{\"token\":\"0xB7f8BC63BbcaD18155201308C8f3540b07f84F5e\",\"value\":{\"type\":\"BigNumber\",\"hex\":\"0x24150e\"}}]}");
Console.WriteLine("request: {0}", p.http_url);
//p.outputStream.WriteLine("<html><body><h1>test server</h1>");
//p.outputStream.WriteLine("Current Time: " + DateTime.Now.ToString());
//p.outputStream.WriteLine("url : {0}", p.http_url);
//p.outputStream.WriteLine("<form method=post action=/form>");
//p.outputStream.WriteLine("<input type=text name=foo value=foovalue>");
//p.outputStream.WriteLine("<input type=submit name=bar value=barvalue>");
//p.outputStream.WriteLine("</form>");
}
public override void HandlePOSTRequest(HttpProcessor p, StreamReader inputData)
{
Console.WriteLine("POST request: {0}", p.http_url);
string data = inputData.ReadToEnd();
p.outputStream.WriteLine("<html><body><h1>test server</h1>");
p.outputStream.WriteLine("<a href=/test>return</a><p>");
p.outputStream.WriteLine("postbody: <pre>{0}</pre>", data);
}
}
public class Program
{
public static int Main(String[] args)
{
string ip = "192.168.3.216";
int port = 8080;
HttpServer httpServer;
if (args.GetLength(0) > 0)
{
httpServer = new MyHttpServer(ip, Convert.ToInt16(args[0]));
}
else
{
httpServer = new MyHttpServer(ip, port);
}
Thread thread = new Thread(new ThreadStart(httpServer.Listen));
thread.Start();
return 0;
}
}
}
其他记录:
例如:http://192.168.3.216:8080/help?age=21&limit=2&offset=1
1.HandleGETRequest(HttpProcessor p)中的 HttpProcessor p 是指“/help?age=21&limit=2&offset=1”,即为地址的请求部分。
2.HttpUtility.ParseQueryString(url.Split(’?’)[1])意为将请求部分的参数字典话;
var queryObj = HttpUtility.ParseQueryString(url.Split('?')[1]);
//url.Split('?')[1]是age=21&limit=2&offset=1
string age=queryObj["age"];//21
3.另一种获取地址参数部分的方法:URI
Uri uri = new Uri("http://192.168.3.216:8080/help?age=21&limit=2&offset=1");
Console.WriteLine(uri.Query);//?age=21&limit=2&offset=1
边栏推荐
- Why is there no error in the code, but the data in the database cannot be displayed
- Visual studio code annotation plug-in: korofileheader
- 关于sql的问题:两张表的字段关联问题
- (greedy) B. avoid local maximums
- 【kotlin】第一天
- Bean实例化的三种方法
- Redis cache use case
- For hand drawn graphics, covering multiple topics, CVPR 2022 sketchdl workshop begins to solicit contributions!
- Haidilao is expected to have an annual net loss of 3.8 billion to 4.5 billion and close more than 300 stores
- 26. Hikvision camera configuration and preliminary test
猜你喜欢

2022-2028 global hydrogen internal combustion engine industry research and trend analysis report

antd table长表格如何出现滚动条

Illustration Google V8 15: Hidden classes: how to quickly find object attributes in memory?

Antd table how scroll bars appear in long tables

26. Hikvision camera configuration and preliminary test

怎么搭建深度学习框架?

Blank screen of virtual machine browser

Haidilao is expected to have an annual net loss of 3.8 billion to 4.5 billion and close more than 300 stores

群暉DSM7添加套件源

古风排版 (20 分)(测试点4)
随机推荐
Cobaltstrike office macro virus utilization
About SQL: field association between two tables
Global and Chinese market for diamond blades 2022-2028: Research Report on technology, participants, trends, market size and share
古风排版 (20 分)(测试点4)
Blank screen of virtual machine browser
Extensions in kotlin
Ads Filter Design Wizard tool I
2022-2028 global postoperative pressure suit industry research and trend analysis report
Why is there no error in the code, but the data in the database cannot be displayed
Wechat official account docking: push article information to official account with one click
Difference between function declaration and function expression
CTF show WEB10
Antique typesetting (20 points) (test point 4)
一元多项式的乘法与加法运算 (20 分)
1004 counting leaves (30 points)
An aunt's towel holds up the 100 billion market behind 400million Chinese women
群晖DSM7添加套件源
/home/ljx/miniconda3/compiler_compat/ld: cannot find crtbeginS.o: 没有那个文件或目录
关于sql的问题:两张表的字段关联问题
[actual combat] ACM players illustrate leetcode using stack to realize queue