【发布时间】:2018-07-02 09:22:50
【问题描述】:
我正在开发一个可以处理许多客户端的 tcp 服务器。它是用 c# 异步和回调编写的。 所以我完成了,但服务器只能处理一个连接...... Somewehre 包含一个错误,但经过 3 天的搜索,我不知道在哪里。我将粘贴代码。搞笑:客户端不会抛出任何错误。服务器只显示一个连接的客户端。其他客户端无法连接。
public class StateObject
{
public Socket WorkSocket;
public const int BufferSize = 32;
public byte[] Buffer = new byte[BufferSize];
public StringBuilder Sb = new StringBuilder();
}
internal class TcpServer
{
public static Socket ServerSocket;
public static List<SimClient> LbConnections = new List<SimClient>();
public static async void StartTcpServerAsync()
{
try
{
await Task.Run(() =>
{
ServerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
LbConnections = new List<SimClient>();
var serverIp = new IPEndPoint(IPAddress.Parse(Settings.Default.IPAddress), Settings.Default.Port);
ServerSocket.Bind(serverIp);
ServerSocket.Listen(0);
InitServer.IsServerReady = true;
ServerSocket.BeginAccept(AcceptCallback, ServerSocket);
});
}
catch (Exception e)
{
AdvancedLogging.WriteLog(e.Message + "(" + e.InnerException + ")", 2);
InitServer.IsServerReady = false;
}
}
private static void AcceptCallback(IAsyncResult result)
{
var listener = (Socket)result.AsyncState;
var handler = listener.EndAccept(result);
var state = new StateObject();
state.WorkSocket = handler;
LbConnections.Add(new SimClient { State = state });
handler.BeginReceive(state.Buffer, 0, StateObject.BufferSize, SocketFlags.None, ReceiveCallback, state);
}
private static void ReceiveCallback(IAsyncResult result)
{
var state = (StateObject)result.AsyncState;
var socket = state.WorkSocket;
var received = socket.EndReceive(result);
if (received <= 0)
{
socket.BeginReceive(state.Buffer, 0, StateObject.BufferSize, SocketFlags.None, ReceiveCallback, state);
return;
}
state.Sb.Append(Encoding.ASCII.GetString(
state.Buffer, 0, received));
var content = state.Sb.ToString();
if (content.IndexOf("<EOF>", StringComparison.Ordinal) > -1)
{
DataHandler.HandleData(content.Substring(0, content.Length - 5), state);
state.Sb.Clear();
socket.BeginReceive(state.Buffer, 0, StateObject.BufferSize, SocketFlags.None, ReceiveCallback, state);
}
else
{
socket.BeginReceive(state.Buffer, 0, StateObject.BufferSize, SocketFlags.None, ReceiveCallback, state);
}
}
}
【问题讨论】:
标签: c# sockets tcp server connection