Skip to content

Instantly share code, notes, and snippets.

@EsProgram
Created December 5, 2014 02:24
Show Gist options
  • Save EsProgram/96fa84fa6516affc3770 to your computer and use it in GitHub Desktop.
Save EsProgram/96fa84fa6516affc3770 to your computer and use it in GitHub Desktop.
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using UnityEngine;
/// <summary>
/// TCPOpponentSingleテスト使用クラス
/// Int32型の大きさを1つのパケットとして、Int32型の範囲内の乱数を送受信する。
/// </summary>
public class TestUseTcp : MonoBehaviour
{
private const int PACKET_SIZE = sizeof(int);
private TCPOpponentSingle trans;
private SceneState scene_state = SceneState.SelectRoll;
private byte[] recvMessage = new byte[PACKET_SIZE];
private float timer;
private enum SceneState
{
SelectRoll,
WaitConnect,
SendAndReceive,
}
private void OnGUI()
{
switch(scene_state)
{
case SceneState.SelectRoll:
if(GUI.Button(new Rect(1, 1, 150, 40), "サーバになる"))
{
trans = new TCPOpponentSingle(OnErrStartServer, OnErrAccept, OnErrRunWork, PACKET_SIZE);
trans.StartServer(54321);
scene_state = SceneState.WaitConnect;
timer = Time.time;
}
if(GUI.Button(new Rect(1, 50, 150, 40), "クライアントになる"))
{
trans = new TCPOpponentSingle(OnErrConnect, OnErrRunWork, PACKET_SIZE);
trans.ConnectAsync(new IPEndPoint(IPAddress.Loopback, 54321));
scene_state = SceneState.WaitConnect;
timer = Time.time;
}
break;
case SceneState.WaitConnect:
//接続待ち状態の表示
GUI.Label(new Rect(1, 1, 150, 40), "接続待ちしています");
if(trans.IsConnected)
{
trans.RunWorkAsync(millisecondsTimeout: 100);
scene_state = SceneState.SendAndReceive;
}
//クライアントがしばらくの時間接続できなかった場合の復帰処理を書く
if(!trans.isServer && !trans.IsConnected && Time.time - timer > 2f)
{
trans.Close();
scene_state = SceneState.SelectRoll;
}
//サーバがAccept待ちをキャンセルできるようにする
if(trans.isServer)
if(GUI.Button(new Rect(1, 50, 150, 40), "待ち受けを解除"))
{
trans.Close();
scene_state = SceneState.SelectRoll;
}
break;
case SceneState.SendAndReceive:
//Sendテスト
if(GUI.Button(new Rect(1, 1, 150, 40), "乱数を送る"))
trans.Send(BitConverter.GetBytes(UnityEngine.Random.Range(int.MinValue, int.MaxValue)));
//Receiveテスト
if(GUI.Button(new Rect(1, 50, 150, 40), "乱数を受け取る"))
trans.Receive(ref recvMessage);
//結果表示
GUI.Label(new Rect(1, 100, 150, 40), "受け取った乱数:" + BitConverter.ToInt32(recvMessage, 0));
//Disconnect
if(GUI.Button(new Rect(1, 150, 100, 40), "Disconnect"))
{
trans.Close();
scene_state = SceneState.SelectRoll;
}
break;
default:
break;
}
}
private void OnErrStartServer(Exception e)
{
Debug.Log("StartServer : " + e.Message);
trans.Close();
scene_state = SceneState.SelectRoll;
}
private void OnErrConnect(Exception e)
{
Debug.Log("ConnectAsync : " + e.Message);
trans.Close();
scene_state = SceneState.SelectRoll;
}
private void OnErrAccept(Exception e)
{
Debug.Log("AcceptAsync" + e.Message);
trans.Close();
scene_state = SceneState.SelectRoll;
}
private void OnErrRunWork(Exception e)
{
Debug.Log("RunWorkThreadErr : " + e.Message);
trans.Close();
scene_state = SceneState.SelectRoll;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment