Create a gist now

Instantly share code, notes, and snippets.

@kou-yeung /Server.cs Secret
Last active Feb 17, 2017

// MMORPGゲームサーバプログラミング
// 第2章:チャットサーバ
// C# & Unity アレンジサンプル
using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using System.Threading.Tasks;
namespace Server
{
class Program
{
// 接続されたセッション一覧
static List<Session> sessions = new List<Session>();
// Clientから受信したコマンドをするメソッド
static void SessionCommandExec(Session session, Command cmd)
{
switch (cmd.type)
{
case ProtoType.Message:
var message = Unpack(cmd.bytes);
Console.WriteLine(message);
// session.Send(...); // 返事を返す(本来は送信キューに入れるべき)
break;
}
}
// Workaround : Jsonなどの形式からデシリアライズ。(各自実装)
static object Unpack(byte[] bytes)
{
// bytes -> object
return "object";
}
// Client -> Server へ受信する用タスク
static void TaskReceive(TcpListener listener)
{
while (true)
{
// 接続要求あるかどうか確認
if (listener.Pending())
{
// 接続要求を処理する
var client = listener.AcceptTcpClient();
sessions.Add(new Session(client, SessionCommandExec));
Console.WriteLine("AcceptTcpClient : {0}", client.Client.RemoteEndPoint );
}
// 受信処理
foreach (var session in sessions)
{
session.Poll();
}
Task.Delay(16).Wait(); // 少し待機します
}
}
// Server -> Client へ送信する用タスク
static void TaskSend()
{
while (true)
{
// ... 送信キューからデータを取り出して送信する ... //
Task.Delay(16).Wait(); // 少し待機します
}
}
static void Main(string[] args)
{
// ローカルコンピューターのホスト名を取得。(未使用)
//IPHostEntry ipHostInfo = Dns.Resolve(Dns.GetHostName());
//IPAddress ipAddress = ipHostInfo.AddressList[0];
// MEMO : ネットを介さずにテストしているため、こっちのアドレスを使います
var ipString = "127.0.0.1"; // IPアドレス
var port = 2001; // Listenするポート番号
IPAddress ipAddress = IPAddress.Parse(ipString);
TcpListener listener = new TcpListener(ipAddress, port);
listener.Start(100);
List<Task> tasks = new List<Task>();
tasks.Add(Task.Run(() => TaskReceive(listener))); // Client -> Server 受信用タスク
tasks.Add(Task.Run(() => TaskSend())); // Server -> Client 送信用タスク
Task.WaitAll(tasks.ToArray());
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment