请教各位给一个解决方案:
下面是我的监听方法:
private void Listen ( )
{
//创建一个tcpListener对象,此对象主要是对给定端口进行侦听
Int32 port = 1234;
IPAddress localAddr = IPAddress.Parse("127.0.0.1");
tcpListener = new TcpListener ( localAddr, port ) ;
//开始侦听
tcpListener.Start ( ) ;
//返回可以用以处理连接的Socket实例
socketForClient = tcpListener.AcceptSocket ( ) ;
try
{
//如果返回值是"true",则产生的套节字已经接受来自远方的连接请求
if ( socketForClient.Connected )
{
listBox1.Items.Add ( "已经和客户端成功连接!" ) ;
//创建networkStream对象通过网络套节字来接受和发送数据
networkStream = new NetworkStream ( socketForClient ) ;
streamReader = new StreamReader (networkStream ) ;
streamWriter = new StreamWriter ( networkStream ) ;
while ( socketForClient.Connected)
{
//从当前数据流中读取一行字符,返回值是字符串
string msg = streamReader.ReadLine ( ) ;
listBox1.Items.Add ( "收到客户端信息:" + msg ) ;
if ( textBox1.Text != "" )
{
listBox1.Items.Add ( "往客户端反馈信息:" + textBox1.Text ) ;
streamWriter.WriteLine ( textBox1.Text ) ;
streamWriter.Flush ( ) ;
}
else
{
streamWriter.WriteLine (" hhehehehehe ") ;
streamWriter.Flush ( ) ;
}
}
}
}
catch ( Exception ey )
{
MessageBox.Show("hahaha"); //客户端单方面撤销,也会进入这个异常
MessageBox.Show ( ey.ToString ( ) ) ;
}
}
接着我采用了线程:
_thread1 = new Thread ( new ThreadStart ( Listen ) ) ;
_thread1.Start ( ) ;
启动了监听。
下面我要用一个按钮来关闭这个监听:
if(networkStream!=null) networkStream.Close ( ) ;
if(streamReader!=null) streamReader.Close ( ) ;
if(streamWriter!=null) streamWriter.Close ( ) ;
if(_thread1!=null) _thread1.Abort ( ) ;
if(tcpListener!=null) tcpListener.Stop ( ) ;
if(socketForClient!=null) socketForClient.Shutdown ( SocketShutdown.Both ) ;
if(socketForClient!=null) socketForClient.Close ( ) ;
以上就是基本的程序片断,下面说一下异常情况:
1.当客户端单方面关闭程序时,服务器这边会进入我写的捕获异常。
这是正常的情况吗,对服务器有其他影响吗。可以有好的方法解决吗。
2.当服务器用按钮关闭这个监听时又会出现:
无法从网络连接中读取数据,因为一个线程正在被终止。
这个问题怎么解决呢,要关闭监听线程,而这时监听程序又正在接受数据
总之,求一个好的网络通信一个好的解决方案,避免诸多异常。
另外,问一问有没有好的关于C#网络编程方面的例子和书籍可以下载。
先谢谢各位了!!!!!!!!!
2 个解决方案
#1
1.客户端关闭程序的时候,发送一个标记过来。通知服务器端关闭这个socket
似乎没法避免,只能在捕捉后根据实际要求处理它
似乎没法避免,只能在捕捉后根据实际要求处理它
#2
在catch语句块中写log文件。
#1
1.客户端关闭程序的时候,发送一个标记过来。通知服务器端关闭这个socket
似乎没法避免,只能在捕捉后根据实际要求处理它
似乎没法避免,只能在捕捉后根据实际要求处理它
#2
在catch语句块中写log文件。