C#网络通信的简单问题,高手帮忙!

gaoweipeng7851 2009-04-21 03:41:45
我现在正在弄一个聊天的小软件,有三个窗体(登陆(A),主窗体(B),发送聊天信息窗体(C))

是CS的,通过服务器进行数据的转发,服务器开启监听。

现在的问题是我在主窗体中定义了接收数据的线程,一旦有人发送过来数据可以提示用户,可是不知道怎么将聊天数据传到聊天信息窗体(C)。主窗体(B)的线程怎么访问聊天信息窗体(C)中的控件啊??高手给个代码,这个应该做过聊天的都可能遇到过,大家帮帮小弟!!

类似QQ那样的。在(C)中的textbox显示聊天内容。

万分感谢!
...全文
275 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
starts_2000 2009-04-22
  • 打赏
  • 举报
回复
把MainForm改为下面就不会卡死了:
public partial class MainForm : Form
{
private MessageForm _messageForm;
private Thread _testThread;
private bool _createMessge = true;

public MainForm()
{
InitializeComponent();

_testThread = new Thread(new ThreadStart(TestRecieveMsg));
}

internal MessageForm MessageForm
{
get
{
if (_messageForm == null)
{
_messageForm = new MessageForm();
}
return _messageForm;
}
}

private void TestRecieveMsg()
{
while (_createMessge)
{
string testMessage = "This is Test Message! " + DateTime.Now.ToShortTimeString();

BeginInvoke(new MethodInvoker(delegate()
{
MessageForm.SetMessage(testMessage);
if (!MessageForm.Visible)
{
MessageForm.Show();
}
}));
Thread.Sleep(1000);
}
}

private void button1_Click(object sender, EventArgs e)
{
_testThread.Start();
}

protected override void OnFormClosing(FormClosingEventArgs e)
{
base.OnFormClosing(e);

_createMessge = false;
_testThread.Join();
_testThread.Abort();
}
}
chuxue1342 2009-04-22
  • 打赏
  • 举报
回复
mark!
sjlianan 2009-04-22
  • 打赏
  • 举报
回复
wolf1118baby 2009-04-22
  • 打赏
  • 举报
回复
你看看飞Q
大概就差不多!
ouyangyanyue 2009-04-22
  • 打赏
  • 举报
回复
我觉得可以不用SOCKET
ouyangyanyue 2009-04-22
  • 打赏
  • 举报
回复
在winform界面上设置需要的控件
一个显示聊天记录,一个是设定当前用户的称呼,还有所要发送的消息,还有就是执行发送消息的按钮
首先定义一个Message类,在类中对消息的内容进行封装,将消息转换成文本
然后消息的发送和接收都是通过消息管理器MessageManager类来进行
添加消息发送按钮和定时器的事件处理函数
实现点对点的通信
gaoweipeng7851 2009-04-22
  • 打赏
  • 举报
回复
感谢楼上大哥的代码。可是有点问题,当我点击按钮的时候MessageForm 窗体弹出程序就死掉了.
gaoweipeng7851 2009-04-22
  • 打赏
  • 举报
回复
没错,是socket
jdhlowforever 2009-04-22
  • 打赏
  • 举报
回复
SOCKET?
真罗剑 2009-04-22
  • 打赏
  • 举报
回复
发表下我的愚见
如果用 委托来写

可以先 声明一个委托,再自定义一个方法用于更改聊天窗口的信息

具体如下 public delegate void myDelegate();

public void updateStr() {//这里面是你要写的更改聊天窗口的代码}

然后 在你的DataReceived事件中
调用beginInvoke方法
比如
this.BeginInvoke(new myDelegate(updateStr));

过河石头 2009-04-22
  • 打赏
  • 举报
回复
C/S...
只能帮顶了
Tensionli 2009-04-22
  • 打赏
  • 举报
回复
消息做为参数来传递
chwlyr 2009-04-22
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 starts_2000 的回复:]
主窗体:

C# code
public partial class MainForm : Form
{
private MessageForm _messageForm;
private Thread _testThread;
private bool _createMessge = true;

public MainForm()
{
InitializeComponent();

_testThread = new Thread(new ThreadStart(TestRecieveMsg));
}

internal MessageForm MessageForm

[/Quote]

socket呢?


lomioliang 2009-04-22
  • 打赏
  • 举报
回复
up
gaoweipeng7851 2009-04-22
  • 打赏
  • 举报
回复
飞Q是什么?到哪看???
starts_2000 2009-04-21
  • 打赏
  • 举报
回复
主窗体:

public partial class MainForm : Form
{
private MessageForm _messageForm;
private Thread _testThread;
private bool _createMessge = true;

public MainForm()
{
InitializeComponent();

_testThread = new Thread(new ThreadStart(TestRecieveMsg));
}

internal MessageForm MessageForm
{
get
{
if (_messageForm == null)
{
_messageForm = new MessageForm();
}
return _messageForm;
}
}

private void TestRecieveMsg()
{
while (_createMessge)
{
string testMessage = "This is Test Message! " + DateTime.Now.ToShortTimeString();
MessageForm.SetMessage(testMessage);
if (!MessageForm.Visible)
{
MessageForm.Show();
}
Thread.Sleep(1000);
}
}

private void button1_Click(object sender, EventArgs e)
{
_testThread.Start();
}

protected override void OnFormClosing(FormClosingEventArgs e)
{
base.OnFormClosing(e);

_createMessge = false;
_testThread.Join();
_testThread.Abort();
}
}



消息窗体:

public partial class MessageForm : Form
{
public MessageForm()
{
InitializeComponent();
}

internal void SetMessage(string message)
{
if (messageTextBox.InvokeRequired)
{
messageTextBox.Invoke(new MethodInvoker(delegate()
{
messageTextBox.AppendText(message);
messageTextBox.AppendText("\n");
}));
}
else
{
messageTextBox.AppendText(message);
messageTextBox.AppendText("\n");
}
}
}
gaoweipeng7851 2009-04-21
  • 打赏
  • 举报
回复
大概用到委托,但是不知道具体怎么写。

110,499

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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