【发布时间】:2016-10-14 12:01:25
【问题描述】:
我正在尝试为学校项目制作多人 curve_fever。现在,我有一个有效的客户端-服务器连接和一个有效的聊天框。我不知道如何发送连接到所有客户端的客户端数量。通过这样做,我可以确保游戏等待合适数量的人。我也无法弄清楚如何将数据从客户端连续发送到服务器并返回。所以我可以看到所有玩家的所有坐标。
这是我的服务器:
public class Server
{
public TcpListener Listener;
private volatile bool Running; //wordt gebruikt door meerdere threads zonder lock te gebruiken (lock zorgt ervoor dat een thread niet doorgaat naar belangrijke code terwjil een andere thread nog bezig is om naar de locked code te gaan.
private List<BinaryWriter> writers = new List<BinaryWriter>();
public Server(int port)
{
Listener = new TcpListener(IPAddress.Any, port);
}
public void Start()
{
Listener.Start(10);
Running = true;
while (Running)
{
var connection = Listener.AcceptTcpClient();
ProcessConnection(connection);//Het zal asynchroon werken, omdat we nog niet eerder een beroep hebben geschreven af te wachten
}
}
public async Task ProcessConnection(TcpClient connection)
{ //Het zal worden uitgevoerd in een afzonderlijke thread
var writer = new BinaryWriter(connection.GetStream());
lock (writers)
{
writers.Add(writer);
}
using (var stream = new BinaryReader(connection.GetStream()))
{
//loop
while (Running && connection.Connected)
{
await Task.Factory.StartNew(() => {
var count = stream.ReadInt32();
var data = stream.ReadBytes(count);
ProcessCommand(connection, writer, data);
});
}
connection.Close();
}
lock (writers)
{
writers.Remove(writer);
}
}
private void ProcessCommand(TcpClient connection, BinaryWriter writer, byte[] data)
{
var info = connection.Client.RemoteEndPoint as IPEndPoint;
var line = System.Text.Encoding.ASCII.GetString(data);
var response = String.Format("{1}:{2}: {0}", line, info.Address.ToString(), info.Port);
Console.WriteLine(response);
lock (writers)
{
foreach (var w in writers)
{
if (w != null)
{
try
{
w.Write((Int32)data.Length);
w.Write(data);
w.Flush();
}
catch
{
}
}
}
}
}
public void Stop()
{
Running = false;
Listener.Stop();
}
~Server()
{
Running = false;
Listener.Stop();
}
}
他是我的客户:
public async Task Start(int port)
{
Connection.Connect("localhost", port);
Console.WriteLine("Connected");
Running = true;
Writer = new BinaryWriter(Connection.GetStream());
using (var stream = new BinaryReader(Connection.GetStream()))
{
//infinite loop
while (Running && Connection.Connected)
{
await Task.Factory.StartNew(() => {
var count = stream.ReadInt32();
var data = stream.ReadBytes(count);
ProcessCommand(data);
});
}
Stop();
}
}
//send data voor chat
public async Task Send(String line)
{
if (Writer == null)
return;
await Task.Factory.StartNew(() => {
var data = System.Text.Encoding.ASCII.GetBytes(line);
Writer.Write((Int32)data.Length);
Writer.Write(data);
Writer.Flush();
});
}
//krijg het aantal spelers connected
private void ProcessCommand(byte[] data)
{
var line = System.Text.Encoding.ASCII.GetString(data);
Console.WriteLine(line);
//stuur data van server naar method
textboxChat(line);
}
public void Stop()
{
Running = false;
Writer.Close();
Writer = null;
Connection.Close();
}
~GamePlay()
{
Stop();
}
【问题讨论】:
标签: c# asynchronous server client