方案主要功能:
(1)客户端同步监听来自服务器端的数据(开启子线程监听)
(2)客户端向服务器端发送数据(主线程发送,并控制)
(3)IsOnline判断连接是否中断,如中断则子线程结束执行
TcpClient tcpClient;
NetworkStream ns;
Thread receiveThread;
/// <summary>
/// 网络连接
/// </summary>
private void client()
{
tcpClient = new TcpClient(); //创建一个TcpClient对象,自动分配主机IP地址和端口号
string ipaddr = this.IpAddress.Text;
int port = Int32.Parse(this.Port.Text);
//MessageBox.Show(ipaddr);
try
{
//发起TCP连接
tcpClient.Connect(ipaddr, port);
if (tcpClient != null)
{
MessageBox.Show("连接服务器成功");
this.button1.Text = "关闭连接";
//获得绑定的网络数据流
ns = tcpClient.GetStream();
Control.CheckForIllegalCrossThreadCalls = false;
//实例化并启动接受消息线程
receiveThread = new Thread(receive_message);
receiveThread.Start();
string mestext = "hello world!";
send_message(mestext);
connectFlag = true;
modeChangeInit();
}
else
{
MessageBox.Show("连接服务器失败");
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
/// <summary>
/// 检测TCP连接是否存在还是已经中断
/// </summary>
/// <param name="c"></param>
/// <returns></returns>
public bool IsOnline(TcpClient c)
{
return !((c.Client.Poll(1000, SelectMode.SelectRead) && (c.Client.Available == 0)) || !c.Client.Connected);
}
//接收消息
private void receive_message()
{
revWrong = 0;
while (IsOnline(tcpClient))
{
try
{
//创建接收数据的字节流
byte[] getData = new byte[1024];
//从网络流中读取数据
ns.Read(getData, 0, getData.Length);
//将字节数组转换成文本形式
string getMsg = Encoding.Default.GetString(getData);
string msgStr = getMsg.Trim('\0');
if (!string.IsNullOrEmpty(msgStr))
processMsgInShow(msgStr);
}
catch (ThreadAbortException)
{
//捕捉到线程被终止异常则表示是人为的断开TCP连接
//不弹出错误提示
break;
}
catch (Exception e)
{
//接受消息发生异常
MessageBox.Show(e.Message);
//并释放相关资源
if (ns != null)
ns.Dispose();
break;
}
}
MessageBox.Show("网络中断");
/// 当接收中断时
///if (ns != null)
/// ns.Dispose();
}
// 发送指令
private void send_order(commandType no, string mesg)
{
string str = ((int)no).ToString();
string order = string.Format("*0{0};{1}#", str, mesg);
send_message(order);
}
private void send_message(string messageText)
{
//将要发送的文本转换为字符数组形式
byte[] sendData = Encoding.Default.GetBytes(messageText);
//将数据写入到网络数据流中
ns.Write(sendData, 0, sendData.Length);
}
//断开连接
private void disconnect()
{
//断开TCP连接
tcpClient.Close();
//销毁绑定的网络数据流
ns.Dispose();
//销毁接受消息的线程
receiveThread.Abort();
//修改控件状态
this.button1.Text = "连接";
connectFlag = false;
showMessage.Stop();
// 删除时钟
// showMessage.Dispose();
}
///
/// <summary>
/// 网络连接
/// </summary>
private void client()
{
tcpClient = new TcpClient(); //创建一个TcpClient对象,自动分配主机IP地址和端口号
string ipaddr = this.IpAddress.Text;
int port = Int32.Parse(this.Port.Text);
//MessageBox.Show(ipaddr);
try
{
//发起TCP连接
tcpClient.Connect(ipaddr, port);
if (tcpClient != null)
{
MessageBox.Show("连接服务器成功");
this.button1.Text = "关闭连接";
//获得绑定的网络数据流
ns = tcpClient.GetStream();
Control.CheckForIllegalCrossThreadCalls = false;
//实例化并启动接受消息线程
receiveThread = new Thread(receive_message);
receiveThread.Start();
string mestext = "hello world!";
send_message(mestext);
connectFlag = true;
}
else
{
MessageBox.Show("连接服务器失败");
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
/// <summary>
/// 检测TCP连接是否存在还是已经中断
/// </summary>
/// <param name="c"></param>
/// <returns></returns>
public bool IsOnline(TcpClient c)
{
return !((c.Client.Poll(1000, SelectMode.SelectRead) && (c.Client.Available == 0)) || !c.Client.Connected);
}
//接收消息
private void receive_message()
{
revWrong = 0;
while (IsOnline(tcpClient))
{
try
{
//创建接收数据的字节流
byte[] getData = new byte[1024];
//从网络流中读取数据
ns.Read(getData, 0, getData.Length);
//将字节数组转换成文本形式
string getMsg = Encoding.Default.GetString(getData);
string msgStr = getMsg.Trim('\0');
if (!string.IsNullOrEmpty(msgStr))
processMsgInShow(msgStr);
}
catch (ThreadAbortException)
{
//捕捉到线程被终止异常则表示是人为的断开TCP连接
//不弹出错误提示
break;
}
catch (Exception e)
{
//接受消息发生异常
MessageBox.Show(e.Message);
//并释放相关资源
if (ns != null)
ns.Dispose();
break;
}
}
MessageBox.Show("连接中断");
}
// 发送指令
private void send_message(string messageText)
{
//将要发送的文本转换为字符数组形式
byte[] sendData = Encoding.Default.GetBytes(messageText);
//将数据写入到网络数据流中
ns.Write(sendData, 0, sendData.Length);
}
//断开连接
private void disconnect()
{
//断开TCP连接
tcpClient.Close();
//销毁绑定的网络数据流
ns.Dispose();
//销毁接受消息的线程
receiveThread.Abort();
//修改控件状态
this.button1.Text = "连接";
connectFlag = false;
}
///
参考文章(1):https://blog.youkuaiyun.com/godsight/article/details/60968437
参考文章(2):https://www.cnblogs.com/Lexy/p/3556924.html