当前位置:编程学习 > C#/ASP.NET >>

c#关于SOCKET多线程有难度的一个问题

大家好请教一个SOCKET线程问题很纠结我  我用C# SOCKET做了一款/CS模式的聊天室 问题在客户端这里
我在一个聊天框中开启一个线程来接受服务器发送来的消息一切正常,如果我在打开一个子对话框 我在建立一个线程 我的目标是 接受服务器的线程 不是最开始那个线程  而是我新打开那个对话框里面的线程  结果我测试  服务器发送的消息 为什么还是在第一个线程里面 我想接受的消息在第二个对话框线程里面    原因是应为如果在第二个线程接受 我就可以更新我地二个对话框里面的控件值    还说下第一个对话框是父对话框 第二个是个子对话框 
有不有什么办法  让接受的消息在第二个线程  或则  接受接受的消息在第一个线程  接受到的消息如何更新我的子对话框
  请大家给点思路 有的人说用委托 但我不会 大家给点思路谢谢 --------------------编程问答-------------------- 真没看太懂是什么意思,不过socket收/发数据,客户端是比较简单的,收到数据后通知到主界面就行了,具体显示在哪一个窗口我个人觉得应该有个分发机制; --------------------编程问答-------------------- 每天回帖即可获得10分可用分!小技巧:教您如何更快获得可用分 --------------------编程问答-------------------- 這個網站看你對你有沒有用
http://cs0.wikidot.com/chatbox --------------------编程问答-------------------- 读了 一半后面就看不懂了。。。

--------------------编程问答-------------------- 我也只看懂了前面 --------------------编程问答-------------------- 这个应该是只有一个线程负责接受。每条消息都有一个包头来标识是哪个窗体的(即qq的qq号)。接受的消息后先打开包头看看标识,然后把消息具体内容传到对应的窗体里。
lz的做法是每个窗体有自己的监听线程吧,这样很不合理的 --------------------编程问答-------------------- 两个对话框,用的都是界面线程,当然是同一个线程了 --------------------编程问答-------------------- 看得不是很明白,贴上一个代码让你参考吧

 public partial class Form1 : Form
    {
        private const int port = 500;
        private System.Net.Sockets.TcpClient tcpClient;
        private byte[] data;

        public Form1()
        {
            InitializeComponent();
        }

        //登录聊天室
        private void btnLogin_Click(object sender, EventArgs e)
        {
            tcpClient = new System.Net.Sockets.TcpClient();
            tcpClient.Connect("127.0.0.1", port);
            data = new byte[tcpClient.ReceiveBufferSize];
            SendMessage(tbName.Text);
            tcpClient.GetStream().BeginRead(data, 0, data.Length, ReceiveMessage, null);
        }
        
        private void SendMessage(string message)
        {
            try
            {
                NetworkStream networkStream = tcpClient.GetStream();
                byte[] data = Encoding.ASCII.GetBytes(message);
                networkStream.Write(data, 0, data.Length);
                networkStream.Flush();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void ReceiveMessage(IAsyncResult result)
        {
            try
            {
                int byteRead;
                byteRead = tcpClient.GetStream().EndRead(result);
                if (byteRead < 1)
                {
                    SendMessage("Is Noting");
                    return;
                }
                else
                {
                    object[] para = { System.Text.Encoding.ASCII.GetString(data, 0, byteRead) };
                    this.Invoke(new delUpdateHistory(UpdateHistory), para);
                    //不知道阁下是不是需要这个,以Controls.Invoke()使用委托调用异步处理
                }
                tcpClient.GetStream().BeginRead(data, 0, tcpClient.ReceiveBufferSize, ReceiveMessage, null);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        public delegate void delUpdateHistory(string str);
        public void UpdateHistory(string str)
        {
            tbData.AppendText("\r\n"+str);
        }

        //发送信息
        private void btnSend_Click(object sender, EventArgs e)
        {
            string message = tbSend.Text;
            SendMessage(message);
        }
    }
--------------------编程问答-------------------- 我就是来打酱油的 --------------------编程问答-------------------- QQ群:59557329 .NET技术开发联盟
希望大家可以踊跃参加,积极讨论
[img=http://cgi.qun.qq.com/gscgi/s1/gp.do?gid=59557329]点击这里加入此群[/img] --------------------编程问答-------------------- 路过                在路过 --------------------编程问答--------------------
问题在于:客户端是两个线程,但是,如果是同一个socket的话,那肯定只有一个线程接收。
处理方法:启动第二个线程的时候,将第一个线程挂起。
其他的处理办法,比如可以判断服务器发过来的包的头,然后启用哪个窗口,
--------------------编程问答-------------------- 帮顶,多线程编程学习下 --------------------编程问答-------------------- 能否重新描述下,看不大懂。。 --------------------编程问答--------------------

    ///主界面中 添加一个SocketAssign 变量
    ///主界面向 SocketAssign.MessageReceived事件 添加事件处理;
    ///当主界面收到信息时,调用SocketAssign变量.TestMethod方法
    ///子窗口打开时,添加子窗口对SocketAssign变量.MessageReceived 添加事件处理(注意子窗口关闭时,记得删除子窗口对SocketAssign变量.MessageReceived的事件处理);
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    /// <summary>
    /// 定义 Socket消息 事件
    /// </summary>
    public class SocketMessageEventArgs : EventArgs
    {
        /// <summary>
        /// 
        /// </summary>
        /// <param name="Message">消息内容</param>
        public SocketMessageEventArgs(String Message)
        {
            m_message = Message;
        }
        private string m_message;
        public string Message
        {
            get
            {
                return m_message;
            }
        }
    }

    /// <summary>
    /// 定义 Socket消息 委托 
    /// </summary>
    public delegate void SocketMessageEventHandler(object sender, SocketMessageEventArgs e);

    /// <summary>
    /// Socket转发 收到信息后触发事件 
    /// </summary>
    public class SocketAssign
    {

        public SocketAssign()
        {

        }
        /// <summary>
        /// 收到消息后调用此方法
        /// </summary>
        public void TestMethod(string message)
        {

            OnMessageReceived(new SocketMessageEventArgs(message));
        }
        public event SocketMessageEventHandler MessageReceived;

        protected void OnMessageReceived(SocketMessageEventArgs e)
        {
            if (MessageReceived != null)
            {
                MessageReceived(this, e);
            }
        }

    }

    public class Program
    {
        static void Main(string[] args)
        {
            SocketAssign assign = new SocketAssign();
            //添加 Listener1 监听
            assign.MessageReceived += Listener1;
            assign.TestMethod("你好");
            //删除 Listener1 监听
            assign.MessageReceived -= Listener1;
            //添加 Listener2 监听
            assign.MessageReceived += Listener2;

            assign.TestMethod("谢谢");
        }
        public static void Listener1(object sender, SocketMessageEventArgs e)
        {
            Console.WriteLine("测试1:" + e.Message);
        }
        public static void Listener2(object sender, SocketMessageEventArgs e)
        {
            Console.WriteLine("测试2:" + e.Message);
        }
    }
    
    


--------------------编程问答-------------------- 学习学习
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,