点“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已经启动,当点了确定后,这个方法继续往后执行,而后面调用的函数又是接收消息,如果接收不到的话,那么整个函数就处于等待状态,当中没有用到线程说明是单线程的函数,那么整个程序应该在等待这个函数执行完(假死状态),所以看不到变化,解决的办法嘛就应当把接收消息放在一个单独的线程里处理,各干各的互不影响