点“MessageBox”上的确认后出现异常
timer1控制picturebox1的背景色不停变换,就像灯在闪烁一样。使用的是异步网络通信。
当接收到数据时timer1启动,同时MessageBox.Show"连接成功"。
可是点了MessageBox上的确认后灯就停止闪烁了,此时timer1还是Enalbed,这是为什么呀?
using System; using System.Collections.Generic; using using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using using using System.Threading; namespace 异步通信服务器 { public partial class Form1 : Form { private Socket serversocket,clientsocket; private const int dataSize=1024; private byte[] data = new byte[dataSize]; public String message1="123#"; public int num = 0; public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { this.button1.Enabled = false; IPAddress ip = IPAddress.Parse("127.0.0.1"); IPEndPoint server = new IPEndPoint(ip, 8000); serversocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); serversocket.Bind(server); serversocket.Listen(10); serversocket.BeginAccept(new AsyncCallback(AcceptConnection), serversocket); } private void AcceptConnection(IAsyncResult ar) { Socket oldServer = (Socket)ar.AsyncState; //异步接受传入的连接,并创建新的Socket来处理远程主机通信 clientsocket = oldServer.EndAccept(ar); MessageBox.Show("与客户建立连接!"); clientsocket.BeginReceive(data, 0, dataSize, SocketFlags.None, new AsyncCallback(ReceiveData), clientsocket); } private void ReceiveData(IAsyncResult ar) { Socket client = (Socket)ar.AsyncState; try { int receiveDataLength = client.EndReceive(ar); String str =Encoding.ASCII.GetString(data, 0, receiveDataLength); if (str == message1) { this.timer1.Enabled = true; } else { this.timer1.Enabled = false; } MessageBox.Show("接受成功!"); clientsocket.BeginReceive(data, 0, dataSize, SocketFlags.None, new AsyncCallback(ReceiveData), clientsocket); } catch { client.Close(); MessageBox.Show("等待新客户!"); serversocket.BeginAccept(new AsyncCallback(AcceptConnection), serversocket); } } private void button2_Click(object sender, EventArgs e) { try { serversocket.Close(); MessageBox.Show("停止监听!"); } catch (Exception err) { MessageBox.Show(err.Message,"错误"); } } private void timer1_Tick(object sender, EventArgs e) { num++; if (num <= 10) { this.pictureBox1.BackColor = Color.Red; } if ((num > 10) && (num < 20)) { this.pictureBox1.BackColor = Color.DimGray; } if (num == 20) { num = 0; } } private void richTextBox1_TextChanged(object sender, EventArgs e) { } } }using System; using System.Collections.Generic; using using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using using using System.Threading; namespace 异步通信客户端 { public partial class Form1 : Form { private Socket clientsocket; private const int datasize = 1024; private byte[] data = new byte[datasize]; public int num = 0; public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { IPAddress ip = IPAddress.Parse("127.0.0.1"); IPEndPoint server = new IPEndPoint(ip, 8000); Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); socket.BeginConnect(server, new AsyncCallback(ConnectServer), socket); } private void ConnectServer(IAsyncResult ar) { clientsocket = (Socket)ar.AsyncState; try { clientsocket.EndConnect(ar); MessageBox.Show("与服务器连接成功!"); clientsocket.BeginReceive(data, 0, datasize, SocketFlags.None, new AsyncCallback(ReceiveData), clientsocket); } catch { MessageBox.Show("与服务器连接失败!"); } } private void ReceiveData(IAsyncResult ar) { try { Socket server = (Socket)ar.AsyncState; int receiveDataLength = server.EndReceive(ar); string str =Encoding.ASCII.GetString(data, 0, receiveDataLength); if (str == "fire") { timer1.Enabled = true; } if (str == "error") { timer1.Enabled = false; } MessageBox.Show("接收到指令"); clientsocket.BeginReceive(data, 0, datasize, SocketFlags.None, new AsyncCallback(ReceiveData), clientsocket); } catch { } } private void button2_Click(object sender, EventArgs e) { try { int bytes = 0; Byte[] SendBytes = new Byte[256]; string SendString = "123#"; SendBytes = Encoding.ASCII.GetBytes(SendString.ToCharArray()); bytes = clientsocket.Send(SendBytes, SendBytes.Length, 0); } catch { MessageBox.Show("发送失败!"); } } private void button4_Click(object sender, EventArgs e) { try { int bytes = 0; Byte[] SendBytes = new Byte[256]; string SendString = "456#"; SendBytes = Encoding.ASCII.GetBytes(SendString.ToCharArray()); bytes = clientsocket.Send(SendBytes, SendBytes.Length, 0); } catch { MessageBox.Show("发送失败!"); } } private void button5_Click(object sender, EventArgs e) { try { int bytes = 0; Byte[] SendBytes = new Byte[256]; string SendString = "01#"; SendBytes = Encoding.ASCII.GetBytes(SendString.ToCharArray()); bytes = clientsocket.Send(SendBytes, SendBytes.Length, 0); } catch { MessageBox.Show("发送失败!"); } } private void button3_Click(object sender, EventArgs e) { try { clientsocket.Close(); MessageBox.Show("与服务器断开连接!"); } catch { MessageBox.Show("连接尚未开始"); } } private void timer1_Tick(object sender, EventArgs e) { num++; if (num <= 10) { this.pictureBox1.BackColor = Color.Red; } if ((num > 10) && (num < 20)) { this.pictureBox1.BackColor = Color.DimGray; } if (num == 20) { num = 0; } } } }麻烦帮我看下,上面是服务器,下面是客户端,其他的参数都正确的,就是和timer有关的操作不正确。
private void ReceiveData(IAsyncResult ar) { Socket client = (Socket)ar.AsyncState; try { int receiveDataLength = client.EndReceive(ar); String str =Encoding.ASCII.GetString(data, 0, receiveDataLength); if (str == message1) { this.timer1.Enabled = true; } else { this.timer1.Enabled = false; } MessageBox.Show("接受成功!"); clientsocket.BeginReceive(data, 0, dataSize, SocketFlags.None, new AsyncCallback(ReceiveData), clientsocket); } catch { client.Close(); MessageBox.Show("等待新客户!"); serversocket.BeginAccept(new AsyncCallback(AcceptConnection), serversocket); } }MessageBox.Show("接受成功!")弹出对话框后,time1已经启动,当点了确定后,这个方法继续往后执行,而后面调用的函数又是接收消息,如果接收不到的话,那么整个函数就处于等待状态,当中没有用到线程说明是单线程的函数,那么整个程序应该在等待这个函数执行完(假死状态),所以看不到变化,解决的办法嘛就应当把接收消息放在一个单独的线程里处理,各干各的互不影响