我写了一个SOCKET 服务器端的程序,在接收数据时,由于不是窗体线程,怎么在线程里面给窗体控件 textBox1 赋值呀?????听说委托可以做到,怎么做呀???? public class Server : System.Windows.Forms.Form
{
private System.Windows.Forms.Button button1;
private System.Windows.Forms.Button button2;
private System.Windows.Forms.TextBox textBox2;
private System.Windows.Forms.Button button3;
/// <summary>
/// 必需的设计器变量。
/// </summary>
private System.ComponentModel.Container components = null;
static int maxCount = 50; //最大连接数
string port = "10000"; //端口号
private Thread clientHandleThread;
public TextBox textBox1;
private Socket serverSocket; private void InitializeComponent()
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
Application.Run(new Server());
} private void button1_Click(object sender, System.EventArgs e)
{
try
{
this.button1.Enabled= false;
serverSocket =new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
IPHostEntry serverIP = Dns.GetHostEntry(Dns.GetHostName()); IPEndPoint serverHost = new IPEndPoint(serverIP.AddressList[0], Int32.Parse(port)); serverSocket.Bind(serverHost);
serverSocket.Listen(maxCount); textBox1.Clear();
textBox1.Text += "已经建立服务器SOCKET线程,正在监听10000端口" + "\r\n" ; clientHandleThread = new Thread(new ThreadStart(listen));
clientHandleThread.Start();
}
catch(Exception ex)
{
MessageBox.Show("error",ex.Message.ToString());
}
} private void listen()
{
byte[] recv = new byte[1024];
System.Net.Sockets.Socket handle;
handle = serverSocket.Accept();
while (true)
{
if (handle.Connected)
{
textBox1.Text += "已经连接上一个客户端发来的连接!";//就这里出错!
handle.Receive(recv);
textBox1.Text += BitConverter.ToString(recv, 0);//就这里出错!
}
}
} private void button3_Click(object sender, System.EventArgs e)
{
clientHandleThread.Abort(); //中止线程
serverSocket.Close();
//Appliend.ExitThread();
} }
}
{
private System.Windows.Forms.Button button1;
private System.Windows.Forms.Button button2;
private System.Windows.Forms.TextBox textBox2;
private System.Windows.Forms.Button button3;
/// <summary>
/// 必需的设计器变量。
/// </summary>
private System.ComponentModel.Container components = null;
static int maxCount = 50; //最大连接数
string port = "10000"; //端口号
private Thread clientHandleThread;
public TextBox textBox1;
private Socket serverSocket; private void InitializeComponent()
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
Application.Run(new Server());
} private void button1_Click(object sender, System.EventArgs e)
{
try
{
this.button1.Enabled= false;
serverSocket =new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
IPHostEntry serverIP = Dns.GetHostEntry(Dns.GetHostName()); IPEndPoint serverHost = new IPEndPoint(serverIP.AddressList[0], Int32.Parse(port)); serverSocket.Bind(serverHost);
serverSocket.Listen(maxCount); textBox1.Clear();
textBox1.Text += "已经建立服务器SOCKET线程,正在监听10000端口" + "\r\n" ; clientHandleThread = new Thread(new ThreadStart(listen));
clientHandleThread.Start();
}
catch(Exception ex)
{
MessageBox.Show("error",ex.Message.ToString());
}
} private void listen()
{
byte[] recv = new byte[1024];
System.Net.Sockets.Socket handle;
handle = serverSocket.Accept();
while (true)
{
if (handle.Connected)
{
textBox1.Text += "已经连接上一个客户端发来的连接!";//就这里出错!
handle.Receive(recv);
textBox1.Text += BitConverter.ToString(recv, 0);//就这里出错!
}
}
} private void button3_Click(object sender, System.EventArgs e)
{
clientHandleThread.Abort(); //中止线程
serverSocket.Close();
//Appliend.ExitThread();
} }
}
怎么用委托解决呀?textBox1.Text += "已经连接上一个客户端发来的连接!";//就这里出错!
handle.Receive(recv);
textBox1.Text += BitConverter.ToString(recv, 0);//就这里出错!
http://blog.csdn.net/knight94/archive/2006/03/16/626584.aspx
中提到的invoke方法。
怎么在线程里面以事件的方式委托给控件所在的线程处理?????????????
d.begindelegate("已经连接上一个客户端发来的连接!",null,null);
handle.Receive(recv);
d.begindelegate(BitConverter.ToString(recv, 0),null,null);public void changetext(string str)
{
textBox1.Text +=str;
}
{
Application.Run(new Server());
//加上下面这一句!用于取消线程冲突验证。所有的跨线程都不验证了。
//但是弱点是隐患比较大,有冲突时调试也不会报错。
//适合少量线程并且调用关系简单的程序使用!
Control.CheckForIllegalCrossThreadCalls = false;
}
{
textBox1.Text += s;
}private void listen()
{
changeTextDelegate ct = new changeTextDelegate(changeText);
byte[] recv = new byte[1024];
System.Net.Sockets.Socket handle;
handle = serverSocket.Accept();
while (true)
{
if (handle.Connected)
{
//ct.BeginInvoke("已经连接上一个客户端发来的连接55555555!", null, null);
ct("连接上一个客户端发来的连接55555555!");
handle.Receive(recv);
//ct(BitConverter.ToString(recv, 0));
}
}
}为什么我用了委托还是不行呀??? 大家看看我有用错吗?
加入事件方式更好,当有数据就自动触发.
public delegate void OnChangedEvent(string message);
public event OnChangedEvent ChangedEvent;
private void OnChangedText(string message)
{
if (this.textBox1.InvokeRequired)
{
OnChangedEvent handle = new OnChangedEvent(this.OnChangedText);
this.Invoke(handle, new object[] { message });
}
else
{
this.textBox1.Text+=message + "\n";
}
}