我写了一个window应用程序,是关于网络方面的,开了发送/接收两个线程。但是接收线程无法通过thread.Abort()方法关闭,请问大家是否遇到同样的情况。接收线程代码如下:
private void RecvThread()
{
socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress serverIp = IPAddress.Parse("127.0.0.1");
//获得SERVER端PORT
IPEndPoint iep = new IPEndPoint(serverIp, 8890);
//连接服务器端
socket.Connect(iep);
byte[] recvBytes = new byte[1024];
while (true)
{
int i = socket.Receive(recvBytes, recvBytes.Length, 0);
if (i == 0)
{
break;
}
}
}
private void RecvThread()
{
socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress serverIp = IPAddress.Parse("127.0.0.1");
//获得SERVER端PORT
IPEndPoint iep = new IPEndPoint(serverIp, 8890);
//连接服务器端
socket.Connect(iep);
byte[] recvBytes = new byte[1024];
while (true)
{
int i = socket.Receive(recvBytes, recvBytes.Length, 0);
if (i == 0)
{
break;
}
}
}
否则
socket receive并不是阻塞了,而是在一直请求不存在的数据。在tcp/ip编程中要给一个报头告诉接收方消息到底有多长。
namespace WindowsApplication2
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} private Thread SendTread;
private Socket socket;
private void button1_Click(object sender, EventArgs e)
{
RecvTread = new Thread(new ThreadStart(RecvThread));
RecvTread .Start();
} private void RecvThread()
{
socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress serverIp = IPAddress.Parse("127.0.0.1");
//获得SERVER端PORT
IPEndPoint iep = new IPEndPoint(serverIp, 8890);
//连接服务器端
socket.Connect(iep);
byte[] recvBytes = new byte[1024];
while (true)
{
int i = socket.Receive(recvBytes, recvBytes.Length, 0);
if (i <= 0)
{
MessageBox.Show("exit");
break;
}
}
} private void button2_Click(object sender, EventArgs e)
{
try
{
SendTread.Abort();
SendTread.Join();
}
catch(Exception b)
{
MessageBox.Show(b.ToString());
}
}
}
}
{
try
{
int p=Convert.ToInt32(textBox1.Text);
m_sock = new Socket( AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp );
IPEndPoint epServer = new IPEndPoint( IPAddress.Parse( m_tbServerAddress.Text ), p );
m_sock.Connect(epServer);
statusBar1.Text="已连接";
thread=new Thread(new ThreadStart(receive));
thread.IsBackground=true;
thread.Start(); }
catch( Exception ex )
{
MessageBox.Show( this, ex.Message, "Server Connect failed!" );
} }public void receive()
{
try
{
while (true)
{
byte[] bytes = new byte[1024];
int bytesRec = m_sock.Receive(bytes);
if(bytesRec>0)
{
string data = System.Text.Encoding.ASCII.GetString(bytes,0,bytesRec);
Invoke( m_AddMessage, new string [] { data } ); //触发事件,显示消息内容
}
}
}
catch (System.Net.Sockets.SocketException e)
{ //关闭连接触发此异常
string s=e.ToString();
statusBar1.Text="断开连接";
}
}
{
try
{
if( m_sock != null )
{
m_sock.Close();
}
if(thread!=null)
{
thread.Abort();
thread=null;
}
catch{}
}
private void btnclose_Click(object sender, System.EventArgs e)
{
try
{
if( m_sock != null )
{ m_sock.Close(); }
if(thread!=null)
{
thread.Abort();
thread.Join();
thread=null;
}
catch{}
}
因为socket没有被关闭,所以Thread是不会被abort的,thread的状态会变为System.Threading.ThreadState.Background | System.Threading.ThreadState.AbortRequested因此,你要做的是先关闭这个Thread里的socket,再abort这个thread即可。
这个方法会引发一个ERROR的,你要注意处理!
另外如果SOCET没有关闭,关闭不了,它会在后台等关闭。