我在一个类里写了两个方法:
 public int Connect(string serverIp, int port)
 {
       this.serverIp = serverIp;
       this.port = port;
       //解析服务器地址
       System.Net.IPHostEntry ip_HE = System.Net.Dns.GetHostEntry(serverIp);
       //指定端口
       System.Net.IPEndPoint lep = new System.Net.IPEndPoint(ip_HE.AddressList[0], Convert.ToInt32(port));
       ///新建socket对象
       Socket s;
       try
       {
            s= new Socket(lep.Address.AddressFamily, System.Net.Sockets.SocketType.Stream, System.Net.Sockets.ProtocolType.Tcp);
        }
        catch (Exception e)
        {
            Console.WriteLine(e.Message.ToString());
            return Constant.RetErr;
        }
        catch
        {
            return Constant.RetErr;
         }
            new Thread(new ThreadStart(ReadThread)).Start();            return Constant.RetOK;
 }private void ReadThread()
        {            while (true)
            {
                try
                {
                    //byte[] data = udp.Receive(ref remote);
                    byte[] data = new byte[1024];
                    line = null;
                    int count = 0;                    count = udp.ReceiveFrom(data, ref remote);
                    //count = udp.Receive(data);
                    if (count <= 0)
                    {
                        break;
                    }
                    line = Encoding.GetEncoding("GB2312").GetString(data, 0, count);
                    Console.WriteLine(line);
                    if (OnReceived != null)
                    {
                        OnReceived(line);
                    }
                }
                catch (Exception e)
                {
                    Console.WriteLine(e.Message.ToString());
                    break;
                }
                catch
                {
                    Console.WriteLine("chucuo");
                    break;
                }
            }
        }我在WinFrom里一个Button里如何调用这个线程ReadThread。如何取出这个线程里line 它所获得的字符串。这个系统就像QQ聊天那样,发给服务器一个消息,服务器返还一个消息回来!如果我发完一条消息后,如何收到服务器返回的消息!我十秒钟后在发一条消息如何接收啊!谢谢各位师哥啦!小妹这厢有礼啦~~

解决方案 »

  1.   

    去msdn上看看线程怎么写的和怎么来实现的,你可以写个小的程序,来试验一下
      

  2.   

    一塌糊涂 一个Tcp的Socket用Udp接收?
    而且根本没有accpet,怎么建立起连接?
      

  3.   

    using System.Threading;      Thread thread= new Thread(new ThreadStart(ReadThread));
    thread.Start();把line定义成公共变量,你爱怎么取都可以,小妹妹知道了不
      

  4.   

    把line定义成公共变量,你爱怎么取都可以,小妹妹知道了不
      

  5.   

    可以用事件,在收到消息后抛出一个事件。事件的参数就是line
      

  6.   

    不好意思,我不想看你的代码,但是我看了下面的描述,所以给你一个例子你就明白了
    using System;
    using System.Text;
    using System.IO;
    using System.Net;
    using System.Net.Sockets;
    namespace 客户端
    {
    /// <summary>
    /// Class1 的摘要说明。
    /// </summary>
    class Class1
    {
    /// <summary>
    /// 应用程序的主入口点。
    /// </summary>
    [STAThread]
    static void Main(string[] args)
        {
         try
      {
      int port = 10000;
      string host = "192.168.2.61";
      IPAddress ip = IPAddress.Parse(host);
      IPEndPoint ipe = new IPEndPoint(ip, port);//把ip和端口转化为IPEndPoint实例
      Socket c = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//创建一个Socket
        Console.WriteLine("今天是:"+DateTime.Now.ToLongDateString()+" "+DateTime.Now.ToLongTimeString());
      Console.WriteLine("连接服务器,请等待...");
      c.Connect(ipe);//连接到服务器
        Console.WriteLine("请输入您要发送的指令:");
      string sendStr = Console.ReadLine()+"\n";
      byte[] bs = Encoding.GetEncoding("GB2312").GetBytes(sendStr);
      Console.WriteLine("已经发送您的指令到服务器!");
      c.Send(bs, bs.Length, 0);//发送测试信息
      string recvStr = "";
      byte[] recvBytes = new byte[1024];
      int bytes;
      bytes = c.Receive(recvBytes,0);//从服务器端接受返回信息
       recvStr += Encoding.GetEncoding("GB2312").GetString(recvBytes, 0, bytes);
      Console.WriteLine("客户端端得到的来自服务器的信息:");//显示服务器返回信息
    }
    catch (ArgumentNullException e)
    {
      Console.WriteLine("ArgumentNullException: {0}", e);
    }
    catch (SocketException e)
    {
      Console.WriteLine("SocketException: {0}", e);
    }using System;
    using System.Text;
    using System.IO;
    using System.Net;
    using System.Net.Sockets;namespace 服务器端
    {
    /// <summary>
    /// Class1 的摘要说明。
    /// </summary>
    class Class1
    {
    /// <summary>
    /// 应用程序的主入口点。
    /// </summary>
    [STAThread]
    static void Main(string[] args)
    {
    try
       {
       int port = 1000;
    string   strHostIP="";   
    IPHostEntry   oIPHost=Dns.Resolve(Environment.MachineName);   
    if(oIPHost.AddressList.Length>0)   
    {
    strHostIP=oIPHost.AddressList[0].ToString();   
    }
       IPAddress ip = IPAddress.Parse(strHostIP);
       IPEndPoint ipe = new IPEndPoint(ip, port);
       Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//创建一个Socket类
       s.Bind(ipe);//绑定2000端口
       s.Listen(0);//开始监听
    Console.WriteLine("今天是:"+DateTime.Now.ToLongDateString()+" "+DateTime.Now.ToLongTimeString());
       Console.WriteLine("正在等待客户端的连接...");
       Socket temp = s.Accept();//为新建连接创建新的Socket。
       Console.WriteLine("连接成功");
       string recvStr = "";
       byte[] recvBytes = new byte[1024];
       int bytes;
       bytes = temp.Receive(recvBytes, recvBytes.Length, 0);//从客户端接受信息
       recvStr += Encoding.GetEncoding("GB2312").GetString(recvBytes, 0, bytes);
       Console.WriteLine("服务器端得到的来自客户端的信息:{0}",recvStr);//把客户端传来的信息显示出来
       string sendStr = "你好,客户端!";
       byte[] bs = Encoding.GetEncoding("GB2312").GetBytes(sendStr);
       temp.Send(bs, bs.Length, 0);//返回客户端成功信息
       temp.Close();
       s.Close();
       }
       catch (ArgumentNullException e)
       {
       Console.WriteLine("ArgumentNullException: {0}", e);
       }
       catch (SocketException e)
       {
       Console.WriteLine("SocketException: {0}", e);
       }
       Console.WriteLine("按任意退出!");
       Console.ReadLine();
    }
    }
    }
      

  7.   

    你的問題在於沒有完全明白thread和socket的使用方法,msdn上有這方面的例子,你應該先看看。而且寫的也不怎麼復雜。多用點時間把例子看明白了,再寫有思路了。
      

  8.   

    谢谢!yao991118() 你的例子我演示了!没问题!我也看明白了!剩下的就是我研究线程的问题了!你的例子只能发一条消息!服务器给发一条给客户端!可是客户端在发一条,程序就不运行了!
      

  9.   

    wangtiantian23(甜甜)甜甜就是甜甜
      

  10.   

    yao991118() 我发现发过去的消息只能接收到服务器返回的第一行!
      

  11.   

    这个很简单的,你将这些程序改为WINDOWS应用程序,然后在用一个TIMER空间10秒调用一次发送函数就行了嘛
      

  12.   

    你改为WINDOWS应用程序反复接受就是了,我这个只是一个发送接收的例子而已
      

  13.   

    先做通信这一部分,不要和具体的业务挂钩。第一步完成:客户端向服务器发数据,服务器可以收到,反之也可以。第二步:创建一个发送字符串缓冲区,要发送数据时就调用ADD方法添加到这个缓冲区,创建一个线程:这个线程只是检查缓冲区中是否有字符,如果有就发送。
    第三步:创建一个接收字符串缓冲区,当收到数据时就保存到这个缓冲区中,创建线程,仅检查是否接收缓冲区是否有数据,如果有就发一个消息到主窗体,主窗体收到后根据收到的索引号取出数据进行处理,处理结束后将对应接收缓冲区中的数据删除。完成上面三步后在根据不同的业务,实现不现的数据处理方法就可以了。
      

  14.   

    楼上的师哥说的很好,可是我不知道您说的那个第二步和第三步的线程怎么创建!我基本上对线程一窍不通!有没有示例代码,小妹我看看!yao991118() 照您说的我已经把您说的代码封装到Windows窗体里,写成一个方法调用了,可是还是只能收到最初的一条,不能收到我发送的第二条和第三条信息后,服务器返回的信息。
      

  15.   

    我刚踏入这行不久!很多东西都不懂!我今天的工作全靠各位师哥帮忙解决了!这是我刚改的!
          private void button1_Click(object sender, EventArgs e)
            {
                this.SendMessage(this.textBox1.Text.Trim());
            }        public void SendMessage(string msg)
            {
                try
                {
                    int port = 7908;
                    string host = "192.168.1.10";
                    IPAddress ip = IPAddress.Parse(host);
                    IPEndPoint ipe = new IPEndPoint(ip, port);//把ip和端口转化为IPEndPoint实例
                    Socket c = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//创建一个Socket
                    this.label1.Text="今天是:" + DateTime.Now.ToLongDateString() + " " + DateTime.Now.ToLongTimeString();
                    this.label2.Text="连接服务器,请等待...";
                    c.Connect(ipe);//连接到服务器
                    this.label3.Text="请输入您要发送的指令:";
                    string sendStr = msg;
                    byte[] bs = Encoding.GetEncoding("GB2312").GetBytes(sendStr);
                    this.label4.Text="已经发送您的指令到服务器!";
                    c.Send(bs, bs.Length, 0);//发送测试信息
                    string recvStr = "";
                    byte[] recvBytes = new byte[1024];
                    int bytes;
                    bytes = c.Receive(recvBytes, 0);//从服务器端接受返回信息
                    recvStr += Encoding.GetEncoding("GB2312").GetString(recvBytes, 0, bytes);
                    this.label5.Text="客户端端得到的来自服务器的信息:"+recvStr;//显示服务器返回信息
                    
                }
                catch (ArgumentNullException e)
                {
                    Console.WriteLine("ArgumentNullException: {0}", e);
                }
                catch (SocketException e)
                {
                    Console.WriteLine("SocketException: {0}", e);
                }
            }
      

  16.   

    你所说的是客户端获取服务器的信息收不到还是服务器获取不到客户端的信息呢?
    我给你说了用timer控件了的,你用了吗?
      

  17.   

    你的这段代码我看了,没有问题,你的服务器的代码的Socket是否关闭了
      

  18.   

    我确定服务器端在发信息!
                  客户端发送消息  服务器端返回消息
     例如:第一条    aa              服务器已收到
           第二条    bb              您输入的有错误
           第三条    cc              您输入的正确现在是我发送第一条aa 的时候能收到 服务器已收到的 消息
    第二条我发送bb 的时候,我通过程序收到的消息还是 服务器已收到的 消息
    第三条也一样。但是我测试过服务器没问题!
      

  19.   

    你将服务器接收到的客户端的信息之后清空,具体的我也没有试过。
    你仔细想想,你在第二次点击客户端的button1发送按钮的时候,服务器端是否再次接收到,如果接收到了,你就要强制调用服务器端的发送程序了。如果服务器端没有收到,那就是另外一回事了
      

  20.   

    你服务器的Socket是否关闭了?(也就是Close)
      

  21.   

    您的意思是!每点一次Button的时候都关上!下次在点的时候从新开!从新接收从服务器端发出字符串!是吗?
      

  22.   

    我感觉是这样的,客户端第一次连接之后,点击Button发送第一次消息,第二次点击Button之后就不用在连接服务器端了,因为它已经连接上了!
      

  23.   

    wangtiantian23(甜甜)
    帮我介绍女朋友我就帮你搞定
      

  24.   

    我感觉是这样的,客户端第一次连接之后,点击Button发送第一次消息,第二次点击Button之后就不用在连接服务器端了,因为它已经连接上了!能不能给我点思路!如何来做!
      

  25.   

    服务器:
    http://www.xiaopixie.com/web/news.aspx?id=162
    客户端
    http://www.xiaopixie.com/web/news.aspx?id=163
    这个是用来传送文件的,不过差不多
    客户端本来是c/s的,被版主硬改成了b/S,晕
    客户端连接要用多线程,当接收消息完成后,把消息内容通过事件发送到主线程,
    主线程不能直接访问接收线程消息线程的属性和方法
      

  26.   

    在服务器里的添加一个timer控件,将该控件的Interval的属性设置为1000,在服务器中声明全局变量:public Socket s;在服务器的Load事件了写上:
    int port = 1000;
    string   strHostIP="";   
    IPHostEntry   oIPHost=Dns.Resolve(Environment.MachineName);   
    if(oIPHost.AddressList.Length>0)   
    {
       strHostIP=oIPHost.AddressList[0].ToString();   
    }
    IPAddress ip = IPAddress.Parse(strHostIP);
    IPEndPoint ipe = new IPEndPoint(ip, port);
    s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//创建一个Socket类
    s.Bind(ipe);
    s.Listen(0);//开始监听
    Socket temp = s.Accept();//为新建连接创建新的Socket。
    string recvStr = "";
    byte[] recvBytes = new byte[1024];
    int bytes;
    bytes = temp.Receive(recvBytes, recvBytes.Length, 0);//从客户端接受信息
    recvStr += Encoding.GetEncoding("GB2312").GetString(recvBytes, 0, bytes);
    string sendStr = "你好!客户"
    byte[] bs = Encoding.GetEncoding("GB2312").GetBytes(sendStr);
    temp.Send(bs, bs.Length, 0);//返回客户端成功信息
    temp.Close();
    然后在timer1_Tick事件里写:
    Socket temp = s.Accept();//为新建连接创建新的Socket。
    string recvStr = "";
    byte[] recvBytes = new byte[1024];
    int bytes;
    bytes = temp.Receive(recvBytes, recvBytes.Length, 0);//从客户端接受信息
    recvStr += Encoding.GetEncoding("GB2312").GetString(recvBytes, 0, bytes);
    string sendStr = "你好!客户!"
    byte[] bs = Encoding.GetEncoding("GB2312").GetBytes(sendStr);
    temp.Send(bs, bs.Length, 0);//返回客户端成功信息
    temp.Close();
    在客户端加2个全局变量:public Socket c;public string recvStr = "";加一个按钮btnLianjie,Text属性为“连接”,在加一个richTextBox控件,Name属性为“rtbMessage”,在客户端的Load事件了写:
    int port = 1000;
    string host = "服务器IP";
    IPAddress ip = IPAddress.Parse(host);
    IPEndPoint ipe = new IPEndPoint(ip, port)  
    c = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//创建一个Socket
    rtbMessage.Text="连接服务器,请等待..."+"\n";
    c.Connect(ipe);//连接到服务器
    string sendStr = "你好!服务器";
    byte[] bs = Encoding.GetEncoding("GB2312").GetBytes(sendStr);
    rtbMessage.Text+="已经发送您的指令到服务器!"+"\n";
    c.Send(bs, bs.Length, 0);//发送测试信息
    byte[] recvBytes = new byte[1024];
    int bytes;
    bytes = c.Receive(recvBytes,0);//从服务器端接受返回信息
    recvStr += Encoding.GetEncoding("GB2312").GetString(recvBytes, 0, bytes);
    rtbMessage.Text+="客户端端得到的来自服务器的信息:"+"\n"+recvStr+"\n";
    在客户端的按钮事件btnLianjie_Click里写:
    rtbMessage.Text=string.Empty;
    byte[] recvBytes = new byte[1024];
    int bytes;
    bytes = c.Receive(recvBytes,0);//从服务器端接受返回信息
    recvStr += Encoding.GetEncoding("GB2312").GetString(recvBytes, 0, bytes);
    rtbMessage.Text+="客户端端得到的来自服务器的信息:"+"\n"+recvStr+"\n";
    我测试过了的,是正确无误的!
      

  27.   

    private void button1_Click(object sender, EventArgs e)
            {
                rtbMessage.Text = string.Empty;
                byte[] recvBytes = new byte[1024];
                int bytes;
                bytes = c.Receive(recvBytes, 0);//从服务器端接受返回信息
                recvStr += Encoding.GetEncoding("GB2312").GetString(recvBytes, 0, bytes);
                rtbMessage.Text += "客户端端得到的来自服务器的信息:" + "\n" + recvStr + "\n";
            }
            private void Form3_Load(object sender, EventArgs e)
            {
                this.Connection();
            }
            public void Connection()
            {                int port = 7910;
                    string host = "192.168.1.10";
                    IPAddress ip = IPAddress.Parse(host);
                    IPEndPoint ipe = new IPEndPoint(ip, port); 
                    c = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//创建一个Socket
                    rtbMessage.Text="连接服务器,请等待..."+"\n";
                    c.Connect(ipe);//连接到服务器
                    string sendStr = "你好!服务器";
                    byte[] bs = Encoding.GetEncoding("GB2312").GetBytes(sendStr);
                    rtbMessage.Text+="已经发送您的指令到服务器!"+"\n";
                    c.Send(bs, bs.Length, 0);//发送测试信息
                    byte[] recvBytes = new byte[1024];
                    int bytes;
                    bytes = c.Receive(recvBytes,0);//从服务器端接受返回信息
                    recvStr += Encoding.GetEncoding("GB2312").GetString(recvBytes, 0, bytes);
                    rtbMessage.Text+="客户端端得到的来自服务器的信息:"+"\n"+recvStr+"\n";        }照您说的我改了,我们测试服务器那边一般步骤是这样的开始->cmd->telnet 192.168.1.10 7910然后就显示如下格式:
    w 0.1.0.0[2005-1-12]
    然后我就输入你程序里的消息:你好!服务器
    应该返回:x F000003,unkonw command现在我只能接收到w 0.1.0.0[2005-1-12]这条,我想要得到这个结果:x F000003,unkonw command
      

  28.   

    能不能跟我QQ说一下怎么解决!QQ:195001405