读书人

C# C/S 异步通信有关问题

发布时间: 2012-12-24 10:43:14 作者: rapoo

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();

读书人网 >C#

热点推荐