c#socket两个窗口公用同一个socket连接

不咬人的冷血蛇 2019-06-02 07:51:28
c#socket两个窗口公用同一个socket连接,如何使这两个窗口同时接收到服务器传来的数据?
private void ReceiveMsg()
{
while (true)
{
try
{
byte[] buffer = new byte[1024 * 1024];//接受数据
int n = TcpClient.Sclient.Receive(buffer);//将接收到的数据放到buffer里,并返回实际长度
ShowMsg(buffer[0].ToString());
catch (Exception ex)
{
ShowMsg(ex.Message);
}
}
}
另一个窗体也是类似的代码。打开另一个窗体之后,之前的窗体就无法接收数据,如何解决。
...全文
435 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
mk_lucifer 2019-06-03
  • 打赏
  • 举报
回复
我只想说一下,窗口只是UI,并不是程序逻辑主体,他的目的只有一个,就是用户交互。。。程序是分层的,最起码你要有个数据表示层吧。。直接窗口上硬干,那不是真正的程序,那叫demo,总在这个上面打转转,很难对编程有更深层次的理解,还是多看看相对复杂书写较规范的开源的应用程序源码,看看别人怎么组织程序,会有新的认识。。。
wid999 2019-06-03
  • 打赏
  • 举报
回复
ec_DataReceived就是接收到的数据。事件里面要干什么得你写,比如,你要显示到窗。

引用 3 楼 不咬人的冷血蛇 的回复:
[quote=引用 1 楼 wid999 的回复:]
在namespace下声明:
    public static class DataTreatClass
{
public static EventContainer ec = new EventContainer();
}

public delegate void DataReceivedHandle(byte[] buffer);

public class EventContainer
{
public event DataReceivedHandle DataReceived;
public void ReceiveMsg(byte[] buffer)
{
DataReceived(buffer);
}
}


在窗体的Load事件中订阅事件:
        private void Form1_Load(object sender, EventArgs e)
{
DataTreatClass.ec.DataReceived += new DataReceivedHandle(ec_DataReceived);
}

void ec_DataReceived(byte[] buffer)
{

}


在你的ReceiveMsg()方法中调用:
            DataTreatClass.ec.ReceiveMsg(byte[] buffer)

ec_DataReceived是干嘛的。。里面什么都不用写的吗。。[/quote]
threenewbee 2019-06-03
  • 打赏
  • 举报
回复
https://bbs.csdn.net/topics/360140208
  • 打赏
  • 举报
回复
引用 2 楼 caozhy 的回复:
一个窗口接收就可以了,然后再同步到另一个窗口,用事件/委托
在新打开的窗口接收,然后使用委托传递给之前的窗口。。但是怎么写。。可以给个具体的例子吗
  • 打赏
  • 举报
回复
引用 1 楼 wid999 的回复:
在namespace下声明:
    public static class DataTreatClass
    {
        public static EventContainer ec = new EventContainer();
    }

    public delegate void DataReceivedHandle(byte[] buffer);

    public class EventContainer
    {
        public event DataReceivedHandle DataReceived;
        public void ReceiveMsg(byte[] buffer)
        {
            DataReceived(buffer);
        }
    }
在窗体的Load事件中订阅事件:
        private void Form1_Load(object sender, EventArgs e)
        {
            DataTreatClass.ec.DataReceived += new DataReceivedHandle(ec_DataReceived);
        }

        void ec_DataReceived(byte[] buffer)
        {
            
        }
在你的ReceiveMsg()方法中调用:
            DataTreatClass.ec.ReceiveMsg(byte[] buffer)
ec_DataReceived是干嘛的。。里面什么都不用写的吗。。
threenewbee 2019-06-03
  • 打赏
  • 举报
回复
一个窗口接收就可以了,然后再同步到另一个窗口,用事件/委托
游北亮 2019-06-03
  • 打赏
  • 举报
回复
了解一下生产消费者模式, 专门搞一个接收类,接收数据,根据数据类型或flg,分发给对应的方法或委托进行处理。
  • 打赏
  • 举报
回复
引用 5 楼 caozhy的回复:
https://bbs.csdn.net/topics/360140208
使用了委托,但是新打开的窗体在执行委托之后的代码无法执行。
wid999 2019-06-02
  • 打赏
  • 举报
回复
在namespace下声明:
    public static class DataTreatClass
{
public static EventContainer ec = new EventContainer();
}

public delegate void DataReceivedHandle(byte[] buffer);

public class EventContainer
{
public event DataReceivedHandle DataReceived;
public void ReceiveMsg(byte[] buffer)
{
DataReceived(buffer);
}
}


在窗体的Load事件中订阅事件:
        private void Form1_Load(object sender, EventArgs e)
{
DataTreatClass.ec.DataReceived += new DataReceivedHandle(ec_DataReceived);
}

void ec_DataReceived(byte[] buffer)
{

}


在你的ReceiveMsg()方法中调用:
            DataTreatClass.ec.ReceiveMsg(byte[] buffer)

110,566

社区成员

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

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

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