这两天看了 C# Socket 编程 在关闭连接或终止监听的时候
遇到一个异常 “ 一个封锁操作被对 WSACancelBlockingCall 的调用中断”
或者即使能终止监听 或断开与服务端的连接
但cpu的占用率猛涨 一直涨到100% 把我的 T400 都差点儿搞死机 风扇狂转 可怜我小黑了
但最后功夫不负有心人 还是让我给解决了 其实大多都是从网上看论坛找到的破解之道
下面奉上程序部分源码
客户端:
接收消息、发送消息 分别是:richTextBox1,richTextBox2
服务器状态:txtStatus 文本框
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Threading;
namespace TcpClientApp
{
public partial class TcpClientFrm : Form
{
private TcpClient tcpSync;
private bool isExit = false;
public TcpClientFrm()
{
InitializeComponent();
}
private delegate void AddStatusDel(string msg);
private delegate void ReceMessageDel(string msg);
private void AddStatus(string msg)
{
if (txtStatus.InvokeRequired)
{
AddStatusDel d = AddStatus;
txtStatus.Invoke(d, msg);
}
else
{
txtStatus.AppendText(msg);
}
}
private void ReceMessage(string msg)
{
if (richTextBox1.InvokeRequired)
{
ReceMessageDel d = ReceMessage;
richTextBox1.Invoke(d, msg);
}
else
{
richTextBox1.AppendText(msg);
richTextBox1.ScrollToCaret();
}
}
private void btnStartMonitor_Click(object sender, EventArgs e)
{
btnStartMonitor.Enabled = false;
btnStopMonitor.Enabled = true;
isExit = false;
try
{
IPAddress ip = IPAddress.Parse(txtIP.Text);
IPEndPoint point = new IPEndPoint(ip, Convert.ToInt32(txtPort.Text));
tcpSync = new TcpClient();
tcpSync.Connect(point);
AddStatus("与主机:" + txtIP.Text + " 在端口:" + txtPort.Text + " 开始监听......."
+ "\r\n");
Thread receiveThread = new Thread(ReceiveMsg);
receiveThread.Start();
}
catch (Exception ex) {
MessageBox.Show(ex.Message);
}
}
private void ReceiveMsg()
{
while (isExit==false)
{
try
{
NetworkStream nStream = tcpSync.GetStream();
byte[] data = new byte[1024];
int len = nStream.Read(data, 0, data.Length);
if (len <= 0) {
break;
}
ReceMessage(System.Text.Encoding.BigEndianUnicode.GetString(data, 0, len) + "\r\n");
nStream.Flush();
}
catch (Exception ex) {
// MessageBox.Show(ex.Message);
break;
}
}
}
private void btnSend_Click(object sender, EventArgs e)
{
try
{
NetworkStream nStream = tcpSync.GetStream();
byte[] data = new byte[1024];
data = System.Text.Encoding.BigEndianUnicode.GetBytes(richTextBox2.Text);
nStream.Write(data, 0, data.Length);
nStream.Flush();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private void btnStopMonitor_Click(object sender, EventArgs e)
{
btnStartMonitor.Enabled = true;
btnStopMonitor.Enabled = false;
isExit = true;
try
{
tcpSync.Close();
}
catch (Exception ex)
{
// MessageBox.Show(ex.Message);
}
}
}
}
服务端:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Threading;
namespace TcpServerApp
{
public partial class TcpServerFrm : Form
{
private Socket socketClient;
private TcpListener tcpSync;
bool isNormalExit = false;
public TcpServerFrm()
{
InitializeComponent();
}
private delegate void AddStatusDel(string msg);
private delegate void ReceMessageDel(string msg);
private void AddStatus(string msg) {
if (txtStatus.InvokeRequired)
{
AddStatusDel d = AddStatus;
txtStatus.Invoke(d, msg);
}
else
{
txtStatus.AppendText(msg);
}
}
private void ReceMessage(string msg)
{
if (richTextBox1.InvokeRequired)
{
ReceMessageDel d = ReceMessage;
richTextBox1.Invoke(d, msg);
}
else
{
richTextBox1.AppendText(msg);
richTextBox1.ScrollToCaret();
}
}
private void btnStartMonitor_Click(object sender, EventArgs e)
{
btnStartMonitor.Enabled = false;
btnStopMonitor.Enabled = true;
isNormalExit = false;
try
{
IPAddress ip = IPAddress.Parse(txtIP.Text);
IPEndPoint point = new IPEndPoint(ip, Convert.ToInt32(txtPort.Text));
tcpSync = new TcpListener(point);
tcpSync.Start();
AddStatus("主机:" + txtIP.Text + " 在端口:" + txtPort.Text + " 开始监听......."
+ "\r\n");
Thread accpThread = new Thread(AccpConnection);
accpThread.Start();
}
catch (Exception ex) {
MessageBox.Show(ex.Message);
}
}
private void AccpConnection() {
while (isNormalExit==false)
{
try
{
socketClient = tcpSync.AcceptSocket();
if (socketClient.Connected)
{
AddStatus("客户端:" +
socketClient.RemoteEndPoint.ToString() +
" 与服务器连接" + "\r\n");
Thread receiveThread = new Thread(ReceiveMsg);
receiveThread.Start();
}
}
catch(Exception ex) {
break;
}
}
}
private void ReceiveMsg() {
while (isNormalExit==false)
{
try
{
NetworkStream nStream = new NetworkStream(socketClient);
byte[] data = new byte[1024];
int len = nStream.Read(data, 0, data.Length);
if (len <= 0) {
break;
}
ReceMessage(System.Text.Encoding.BigEndianUnicode.GetString(data, 0, len) + "\r\n");
nStream.Flush();
}
catch (Exception ex) {
}
}
}
private void btnSend_Click(object sender, EventArgs e)
{
try {
NetworkStream nStream = new NetworkStream(socketClient);
byte[] data = new byte[1024];
data = System.Text.Encoding.BigEndianUnicode.GetBytes(richTextBox2.Text);
nStream.Write(data, 0, data.Length);
nStream.Flush();
}
catch (Exception ex) {
MessageBox.Show(ex.Message);
}
}
private void btnStopMonitor_Click(object sender, EventArgs e)
{
btnStartMonitor.Enabled = true;
btnStopMonitor.Enabled = false;
isNormalExit = true;
try {
AddStatus("主机:" + txtIP.Text + " 在端口:" + txtPort.Text + " 停止监听......."
+ "\r\n");
tcpSync.Stop();
if (socketClient!=null)
{
socketClient.Close();
}
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private void TcpServerFrm_Load(object sender, EventArgs e)
{
}
}
}
--------------------------------------------
程序下载地址:
http://dl.dbank.com/c0bjz71qpd
--------------------------------------------