1. 程式人生 > >Unity中的Socket通訊(多個客戶端的非同步通訊)

Unity中的Socket通訊(多個客戶端的非同步通訊)

using UnityEngine;
using System;
using System.Net;
using System.Net.Sockets;
using System.Collections;
using System.Text;
using System.Collections.Generic;

public class NetServer {

	//單例指令碼
	public static readonly NetServer Instance = new NetServer();
	//定義tcp伺服器
	private Socket server;
	private int maxClient = 10;
	//定義埠
	private int port = 35353;
	//使用者池
	private Stack<NetUserToken> pools;
	private NetServer()
	{
		//初始化socket
		server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
		server.Bind(new IPEndPoint(IPAddress.Any, port));
	}

	//開啟伺服器
	public void Start()
	{
		server.Listen(maxClient);
		Debug.Log("Server OK!");
		//例項化客戶端的使用者池
		pools = new Stack<NetUserToken>(maxClient);
		for(int i = 0; i < maxClient; i++)
		{
			NetUserToken usertoken = new NetUserToken();
			pools.Push(usertoken);
		}
		//可以非同步接受客戶端, BeginAccept函式的第一個引數是回撥函式,當有客戶端連線的時候自動呼叫
		server.BeginAccept (AsyncAccept, null);
	}

	//回撥函式, 有客戶端連線的時候會自動呼叫此方法
	private void AsyncAccept(IAsyncResult result)
	{
		try {
			//結束監聽,同時獲取到客戶端
			Socket client = server.EndAccept(result);
			UnityEngine.Debug.Log("有客戶端連線");
			//來了一個客戶端
			NetUserToken userToken = pools.Pop();
			userToken.socket = client;
			//客戶端連線之後,可以接受客戶端訊息
			BeginReceive(userToken);

			//尾遞迴,再次監聽是否還有其他客戶端連入
			server.BeginAccept(AsyncAccept, null);
		} catch (Exception ex) {
			Debug.Log(ex.ToString());
		}
	}

	//非同步監聽訊息
	private void BeginReceive(NetUserToken userToken)
	{
		try {
			//非同步方法
			userToken.socket.BeginReceive(userToken.buffer, 0, userToken.buffer.Length, SocketFlags.None,
				EndReceive, userToken);
			string msg = Encoding.UTF8.GetString(userToken.buffer);
			Debug.Log(msg);
		} catch (Exception ex) {
			Debug.Log(ex.ToString());
		}
	}

	//監聽到訊息之後呼叫的函式
	private void EndReceive(IAsyncResult result)
	{
		try {
			//取出客戶端
			NetUserToken userToken = result.AsyncState as NetUserToken;
			//獲取訊息的長度
			int len = userToken.socket.EndReceive(result);
			if(len > 0)
			{ 
				byte[] data = new byte[len];
				Buffer.BlockCopy(userToken.buffer, 0, data, 0, len);
				//使用者接受訊息
				userToken.Receive(data);
				//尾遞迴,再次監聽客戶端訊息
				BeginReceive(userToken);
			}

		} catch (Exception ex) {
			Debug.Log(ex.ToString());
		}
	}

}


相關推薦

UnitySocket通訊客戶非同步通訊

using UnityEngine; using System; using System.Net; using System.Net.Sockets; using System.Collections; using System.Text; using System.Collections.Generic;

socket ( java ) 簡單客戶、服務通訊執行緒

實現: 客戶端:多個socket(多個埠),其中一個客戶端的一個埠用於接收服務端傳送過來的訊息,其一個用於向服務端傳送訊息。其它客戶端只有發訊息的功能。 服務端:兩個socket,一個用於迴圈接收客戶端傳送過來的socket請求。一個用於接收訊息手自動向客戶端

基於非阻塞socket執行緒伺服器的實現------一個伺服器如何與客戶進行通訊

      我們首先來看服務端(涉及非阻塞socket和多執行緒): #include <stdio.h> #include <winsock2.h> #include <windows.h> #pragma comment(li

C++ Socket 一個伺服器 客戶 阻塞式

服務端 ServerNet.h #pragma once #include <stdio.h> #include <winsock.h> #include<vector> #include<iterator>

C++ Socket網路通訊實現一個伺服器客戶通訊

一 描述1 採用C++語言 2 編譯環境是code::blocks 3 使用的是非阻塞套接字 二 功能描述1 一個伺服器對多個客戶端 2 伺服器端主要負責處理資料的輸入併發送,具體是通過傳送指令向其指定的客戶端傳送資料,傳送接收指令讀取其指定的客戶端傳送的資料 3 客戶端的

Windows Socket 程式設計_單個伺服器對客戶簡單通訊

單個伺服器對多個客戶端程式: 一。簡要說明 二。檢視效果 三。編寫思路 四。程式原始碼 五。存在問題 一。簡要說明:  程式名為:TcpSocketOneServerToMulClient  程式功能:實現單個伺服器對多個客戶端通訊功能的小程式。 PS: 這是繼上次簡單的

【隨堂筆記】unitysocket用法三,伺服器執行緒的使用

手機專案,最好不要使用執行緒,因為unity專門提供了協程,枝執行緒不能訪問主執行緒(ui) 手機使用執行緒,容易導致硬體出問題 執行緒測試程式碼 /// <summary> /// 執行緒的測試方法 /// </summary>

java_執行緒_socket通訊_客戶傳送,伺服器響應

/** * 伺服器端不斷接受請求 * 接受一個請求開啟一段執行緒 */ package 練習0927; import java.io.BufferedReader; import java.io.IOException; import java.io.InputSt

Linux下網路socket程式設計——實現伺服器select客戶通訊

Linux下網路socket程式設計——實現伺服器(select)與多個客戶端通訊 置頂 2017年06月23日 14:44:37 閱讀數:3225 標籤: socket程式設計伺服器與多個客戶端通epoll多路複用C語言網路程式設計 更多

C# Socket簡單例子伺服器與客戶通訊

這個例子只是簡單實現瞭如何使用 Socket 類實現面向連線的通訊。 注意:此例子的目的只是為了說明用套接字寫程式的大概思路,而不是實際專案中的使用程式。在這個例子中,實際上還有很多問題沒有解決,如訊息邊界問題、埠號是否被佔用、訊息命令的解析問題等。。 下面是兩個

C#一個伺服器客戶Socket通訊

原理: 啟動服務端後,服務端通過持續監聽客戶端發來的請求,一旦監聽到客戶端傳來的資訊後,兩端便可以互發資訊了。伺服器端需要繫結一個IP和埠號,用於客戶端在網路中尋找並建立連線。資訊傳送原理:將手動輸入字串資訊轉換成機器可以識別的位元組陣列,然後呼叫套接字的Send()方法將位元組陣列傳送出去

Socket通訊 一個伺服器對客戶,不能延遲接受資訊的實現

實驗要求: 1.一個時間點,無論哪個基站有資料傳送,伺服器必須同時接收。不能延遲等待這個客戶端接收完畢再接收另一個客戶端; 2.客戶端不能關閉,一直連線,以防資料遺漏 知識點: 多執行緒 同時開啟多個任務,不用按照程式的執行順序來; 基本的程式碼如下: pack

SOCKET讀取客戶下面基站下面手環傳送的資料驗收專案版本

之前,本人,發了一大堆關於socket 多執行緒 客戶端 的一大堆博文,有理論的也有實現版本的,有缺陷有成功的! 但是,今天我要說的是,之前的關於socket博文的,都有誤區,而且達不上真正驗收專案的標準!! 今天是2018/10/7 17:09:00,我真正實現了這個功

java網路程式設計:9、基於TCP的socket程式設計伺服器迴圈監聽接收客戶_執行緒伺服器程式

宣告:本教程不收取任何費用,歡迎轉載,尊重作者勞動成果,不得用於商業用途,侵權必究!!! 文章目錄 一、核心程式碼編寫 1、伺服器端程式的編寫 2、客戶端程式的編寫 3、測試列印輸出 二、系列文章(java網路程式設計) 上篇講了基於tcp的程式設計的一些基礎知識

Java Socket客戶與伺服器通訊

client程式碼: package com.cqut.test4; import java.io.*; import java.net.Socket; import java.net.SocketException; import java.net.U

linux下socket實現客戶與伺服器的通訊

學習完《UNIX環境高階程式設計》套接字一章的內容之後,自己實現了單個客戶端與伺服器的通訊程式,後面想想要是多個客戶端如何與伺服器通訊呢?這就有了這篇文章。 伺服器端程式: #include<stdio.h> #include <stdlib.h&g

LInux利用執行緒實現客戶和伺服器進行通訊

上一篇博文講了如何利用子程序實現多個客戶端和伺服器端進行通訊, 那麼,這一篇部落格就來實現一下如何利用執行緒實現多個客戶端和伺服器端進行通訊 程式碼實現: ser1.c #include <

python3.6入門到高階(全棧) day29 socketserver實現服務客戶通訊

 什麼是socketserver?      TCP協議下的socket實現了服務端一次只能和一個客戶端進行通訊, 而socketserver實現了服務端一次能和多個客戶端進行通訊, 底層呼叫的還是socket. import socketserver class MyServer(so

java網路程式設計(二)複用Socket連線以及使用執行緒完成客戶的連線

在前面的示例中,客戶端中建立了一次連線,只發送一次資料就關閉了,這就相當於撥打電話時,電話打通了只對話一次就關閉了,其實更加常用的應該是撥通一次電話以後多次對話,這就是複用客戶端連線。 那 麼如何實現建立一次連線,進行多次資料交換呢?其實很簡單,建立連線以後,