using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using UnityEngine;
using UnityEngine.UI;
public class TcpServer : MonoBehaviour {
private List listConnectedClients = new List(new TcpClient[0]);
private TcpListener tcpListener;
private bool running = false;
///
/// Background thread for TcpServer workload.
///
private Thread tcpListenerThread;
///
/// Create handle to connected tcp client.
///
private TcpClient connectedTcpClient;
void Awake()
{
UnityThread.initUnityThread();
}
private void ListenForIncommingRequests()
{
tcpListener = new TcpListener(IPAddress.Any, 9999);
tcpListener.Start();
running = true;
ThreadPool.QueueUserWorkItem(this.ListenerWorker, null);
}
private void ListenerWorker(object token)
{
while (running)
{
connectedTcpClient = tcpListener.AcceptTcpClient();
listConnectedClients.Add(connectedTcpClient);
Debug.Log("连接:" + listConnectedClients.Count);
// Thread thread = new Thread(HandleClientWorker);
// thread.Start(connectedTcpClient);
ThreadPool.QueueUserWorkItem(this.HandleClientWorker, connectedTcpClient);
}
tcpListener.Stop();
}
private void HandleClientWorker(object token)
{
Byte[] bytes = new Byte[1024];
using (var client = token as TcpClient)
using (var nwStream = client.GetStream())
{
while (true)
{
//接收第一个数字,表示数据长度,占16位
byte[] bufNumber = new byte[16];
int byReadNumber = nwStream.Read(bufNumber, 0, 16);
if (byReadNumber < 1)
{
listConnectedClients.Remove(client);
Debug.Log("断开1:" + listConnectedClients.Count);
break;
}
string dataReceived = Encoding.UTF8.GetString(bufNumber, 0, byReadNumber);
dataReceived = dataReceived.Trim();
Debug.Log("收到:" + dataReceived);
}
}
// ThreadPool.QueueUserWorkItem(this.SendMessage, connectedTcpClient);
}
private void SendMessage(object token, string msg)
{
if (connectedTcpClient == null)
{
Debug.Log("Problem connectedTCPClient null");
return;
}
var client = token as TcpClient;
{
try
{
NetworkStream stream = client.GetStream();
if (stream.CanWrite)
{
// Get a stream object for writing.
// Convert string message to byte array.
byte[] serverMessageAsByteArray = Encoding.ASCII.GetBytes(msg);
// Write byte array to socketConnection stream.
stream.Write(serverMessageAsByteArray, 0, serverMessageAsByteArray.Length);
Debug.Log("Server sent his message - should be received by client");
}
}
catch (SocketException socketException)
{
Debug.Log("Socket exception: " + socketException);
return;
}
}
}
void Start()
{
tcpListenerThread = new Thread(new ThreadStart(ListenForIncommingRequests));
tcpListenerThread.IsBackground = true;
tcpListenerThread.Start();
}
private void OnDisable()
{
for (int i = 0; i < listConnectedClients.Count; i++)
{
listConnectedClients[i].GetStream().Close();
listConnectedClients[i].Close();
}
tcpListener.Stop();
running = false;
}
}
Unity代码用到的UnityThread类参见这篇文章