线程间操作无效: 从不是创建控件“richTextBox1”的线程访问它。(Socket)

life_reincarnation 2010-07-16 08:58:00

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Windows.Forms;
//添加引用
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
namespace SocketServer
{
public partial class Form1 : Form
{
Thread mythread;//创建线程
Socket socket;
int port = 8000;//定义侦听端口号

public Form1()//服务器端
{
InitializeComponent();

}
//获取本机IP地址
public static IPAddress GetServerIP()
{
IPHostEntry ieh = Dns.GetHostEntry(Dns.GetHostName());
return ieh.AddressList[0];
}
//监听
private void BeginListen()
{
socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

IPAddress ServerIp = GetServerIP();
IPEndPoint iep = new IPEndPoint(ServerIp, port);
socket.Bind(iep);

toolStripStatusLabel1.Text = iep.ToString() + "正在监听...";
byte[] byteMessage = new byte[100];
while (true)
{
try
{
socket.Listen(5);
Socket newSocket = socket.Accept();
newSocket.Receive(byteMessage);

string sTime = DateTime.Now.ToShortTimeString();
string msg = sTime + "-" + "信息来自:";
msg += newSocket.RemoteEndPoint.ToString() +" "+ Encoding.Default.GetString(byteMessage).Trim(new char[] {'\0'});
this.richTextBox1.AppendText(msg + "\r\n");
}
catch (SocketException ex)
{
toolStripStatusLabel1.Text += ex.ToString();
}
}
}
private void btn_Listen_Click(object sender, EventArgs e)
{
try
{
mythread = new Thread(new ThreadStart(BeginListen));
mythread.Start();
}
catch (System.Exception er)
{
MessageBox.Show(er.Message, "完成", MessageBoxButtons.OK, MessageBoxIcon.Stop);
}
}

}
}



using System;
using System.Windows.Forms;
//添加引用
using System.Net;
using System.Net.Sockets;
using System.Text;
namespace SocketClient
{
public partial class Form1 : Form
{
public Form1()//客户端
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
//得到本机地址
IPHostEntry ieh = Dns.GetHostEntry(Dns.GetHostName());
txtIP.Text = ieh.AddressList[0].ToString();
}
private void btn_Send_Click(object sender, EventArgs e)
{
BeginSend();
}
//发送信息
private void BeginSend()
{
string ip = txtIP.Text;
string port = txtPort.Text;
string msg = txtMsg.Text.Trim();

Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

IPAddress serverIp = IPAddress.Parse(ip);
int serverPort = Convert.ToInt32(port);
IPEndPoint iep = new IPEndPoint(serverIp, serverPort);
socket.Connect(iep);

byte[] byteMessage;
byteMessage = Encoding.ASCII.GetBytes(msg);
socket.Send(byteMessage);
socket.Shutdown(SocketShutdown.Both);
socket.Close();
}
}
}

...全文
2351 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
(*^__^*) 嘻嘻……
digua_14 2011-08-25
  • 打赏
  • 举报
回复
我也搞定了
ghost281536992 2010-08-04
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wuyq11 的回复:]
使用委托操作相关控件
Invoke操作
[/Quote]

线程安全是.NET提供的一个重要特性,虽然说设置那个属性可以解决问题,但是那样的话线程不安全。
还是用invoke比较好。
happy664618843 2010-07-20
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 life_reincarnation 的回复:]

引用 1 楼 wuyq11 的回复:
使用委托操作相关控件
Invoke操作

thank you
解决了。
load中添加Control.CheckForIllegalCrossThreadCalls = false;搞定。
[/Quote]
恩 对的 是跨线程操作
whb147 2010-07-18
  • 打赏
  • 举报
回复
要用委托,
life_reincarnation 2010-07-17
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wuyq11 的回复:]
使用委托操作相关控件
Invoke操作
[/Quote]
thank you
解决了。
load中添加Control.CheckForIllegalCrossThreadCalls = false;搞定。
jackyzsy2008 2010-07-17
  • 打赏
  • 举报
回复
恭喜,结贴吧
wuyq11 2010-07-16
  • 打赏
  • 举报
回复
使用委托操作相关控件
Invoke操作

17,740

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 .NET Framework
社区管理员
  • .NET Framework社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧