c# 网络服务器编程疑问,异常问题
图1
图2
问题1:
每次我运行是按下监听按钮时,图2 界面显示老是会卡在那里,我知道是可能是在监听时的那个while 循环那里问题,请问怎么解决?
问题2 :
每次我按下停止监听按钮时,老是会显示图2 所是的异常错误,请问需要怎么解决啊!
PS: 都23:37 了还在敲代码,苦逼啊!
直接代码吧
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 红相表测试
{
public partial class Form1 : Form
{
public Socket client = null;
public string str;
public Thread t1;
bool flag = false;
public string StringToHex(string str)
{
//str = str.Trim();
byte[] ByteFoo = System.Text.Encoding.Default.GetBytes(str);
string TempStr = "";
foreach (byte b in ByteFoo)
{
if (b <= 16) //16进制显示时加个0
{
TempStr += "0"+b.ToString("X") + " "; //X表示十六进制显示
}
else
TempStr += b.ToString("X") + " "; //X表示十六进制显示
}
return TempStr;
}
public void showinfo()
{
if (checkBox1.Checked)
{
richTextBox1.Text +="接收: "+ StringToHex(str) + "\n\r";
}
else
{
richTextBox1.Text += str + " " + "\n";
}
}
public delegate void showDelegate();
public void threadrun()
{
int n;
byte[] data = new byte[1024];
string[] frame = new string[256];
int j = 0;
while (true)
{
if ((n = client.Receive(data)) != 0)
{
byte[] buf = new byte[n];
for (int i = 0; i < n; i++)
{
buf[i] = data[i];
}
foreach (byte a in buf)
{
frame[j] = Convert.ToString(a,16);
j++;
}
j = 0;
if (frame[1] == "58")
{
str = System.Text.Encoding.Default.GetString(buf);
Invoke(new showDelegate(showinfo));
}
}
else
{
MessageBox.Show("断开!");
//client.Close();
break;
}
Thread.Sleep(100);
}
}
public Form1()
{
InitializeComponent();
}
private void groupBox1_Enter(object sender, EventArgs e)
{
}
private void button1_Click(object sender, EventArgs e)
{
//Socket client;
int recv;
Socket ServerSocket = null;
byte[] message = new byte[1024];
// byte[]
ServerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
IPAddress adr = IPAddress.Parse("192.168.0.200");
IPEndPoint ep = new IPEndPoint(adr, 12345);
try
{
ServerSocket.Bind(ep); //类似于客户机的connect()方法
ServerSocket.Listen(3); //开始监听
}
catch (SocketException err)
{
MessageBox.Show(err.Message);
}
Thread.Sleep(100);
while (true)
{
try
{
if ((client = ServerSocket.Accept()) != null)
{
label3.Text = "已经连接. . . .";
break;
}
}
catch (SocketException err)
{
MessageBox.Show(err.Message);
}
Thread.Sleep(100);
}
t1 = new Thread(threadrun);
t1.Start();
/* while(true)
{
if ((recv = client.Receive(message)) != 0)
{
richTextBox1.Text = System.Text.Encoding.Default.GetString(message);
}
Thread.Sleep(100);
}*/
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void button3_Click(object sender, EventArgs e)
{
t1.Abort();
// client.Dispose();
if (client!=null)
{
client.Close();
label3.Text = "";
}
client = null;
}
private void timer1_Tick(object sender, EventArgs e)
{
}
}
}
------解决方案--------------------
把整个创建ServerSocket,绑定端口,while循环都移到一个线程中。
把ServerSocket做成成员变量,在 button1_Click中判断,如果ServerSocket已经有值了,就跳过,否则才创建和bind到12345端口。在停止监听按钮事件中设一个标志,让while循环退出,关闭ServerSocket,并设为null。
[解决办法]
C#通讯调试工具v3.0
里面有你想要的代码。
[解决办法]
第一个问题是因为你采用的是同步的方式,监听线程和UI线程是同一个线程,所以才会界面卡死的,你用异步TCP就可以的,这个你可以百度下的,具体实现你也可以参考下:
http://www.cnblogs.com/zhili/archive/2012/08/25/TCP.html