C# C/S 异步通信问题
一下代码在Winform中运行正常,但是在console中,执行到DoBeginAcceptTcpClient的 listener.BeginAcceptTcpClient(new AsyncCallback(this.DoAcceptTcpClientCallback), listener);后系统就运行结束了,请问是什么原因
public void Start()
{
Thread t = new Thread(new ThreadStart(this.BeginListen));
t.Start();
}
private void BeginListen()
{
try
{
IPAddress ip = IPAddress.Parse("127.0.0.1");
TcpListener listener = new TcpListener(ip, Settings.Default.Port);
listener.Start();
Console.WriteLine("=====Socket文件服务开启=====");
DoBeginAcceptTcpClient(listener);
}
catch (Exception ex)
{
Console.WriteLine("文件服务开启失败原因为:");
Console.WriteLine(ex.Message);
}
}
/// <summary>
/// begin a new connection by asynchronous
/// </summary>
/// <param name="listener"></param>
private void DoBeginAcceptTcpClient(TcpListener listener)
{
listener.BeginAcceptTcpClient(new AsyncCallback(this.DoAcceptTcpClientCallback), listener);
}
}
private void DoAcceptTcpClientCallback(IAsyncResult ar)
{
try
{
TcpListener listener = ar.AsyncState as TcpListener;
TcpClient tcpClient = listener.EndAcceptTcpClient(ar);
NetworkStream netStream = tcpClient.GetStream();
string remoteIp = tcpClient.Client.RemoteEndPoint.ToString();
Console.WriteLine("Connect " + remoteIp);
//add a new listener,so we can accept a new connection
listener.BeginAcceptTcpClient(new AsyncCallback(this.DoAcceptTcpClientCallback), listener);
string receive = string.Empty;
//receive data
netStream.BeginRead(buffer, 0, buffer.Length, new AsyncCallback(DoReceiveCallback), netStream);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
private void DoReceiveCallback(IAsyncResult ar)
{
try
{
NetworkStream netStream = ar.AsyncState as NetworkStream;
if (netStream == null)
{
return;
}
int count = 0;
try
{
count = netStream.EndRead(ar);
netStream.BeginRead(buffer, 0, buffer.Length, new AsyncCallback(DoReceiveCallback), netStream);
}
catch { }
string msg = System.Text.Encoding.Default.GetString(buffer, 0, count);
// Console.WriteLine(msg);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
[最优解释]
Server server = new Server();
server.Start();
在后面加一句Console.ReadLine();
[其他解释]
main函数里面的代码看看,估计是主线程结束了
[其他解释]
main中就直接调用了Start 函数
static void Main(string[] args) {
Server server = new Server();
server.Start();
}
[其他解释]
应该是线程问题,我最近也在研究C# Socket异步通信,还不是很了解,推荐你看一下《Visual C# 网络编程技术与实践》中异步通信的部分,希望对你有帮助
[其他解释]
我也觉得是主线程结束了,请问该怎么改呢
[其他解释]
Server server = new Server();
server.Start();
在后面加一句Console.ReadLine();