JBTALKS.CC

标题: c# 問題!!Server and Client [打印本页]

作者: 狂天使    时间: 2011-5-30 02:36 AM
标题: c# 問題!!Server and Client
各位

當我Client 按 connect 的時候我的Server 出現這個問題,請問怎樣解決

這是 Server
  1. using System;
  2. using System.Drawing;
  3. using System.Collections;
  4. using System.ComponentModel;
  5. using System.Windows.Forms;
  6. using System.Data;
  7. using System.Net;
  8. using System.Net.Sockets;
  9. using System.Threading;

  10. namespace ChatServer
  11. {
  12.         /// <summary>
  13.         /// Summary description for Form1.
  14.         /// </summary>
  15.         public class ChatServer : System.Windows.Forms.Form
  16.         {
  17.                 /// <summary>
  18.                 /// Required designer variable.
  19.                 /// </summary>
  20.                 private System.ComponentModel.Container components = null;
  21.                 private int listenport = 5555;
  22.                 private TcpListener listener;
  23.                 private System.Windows.Forms.ListBox lbClients;
  24.                 private ArrayList clients;
  25.                 private Thread processor;
  26.                 private Socket clientsocket;
  27.                 private Thread clientservice;

  28.                 public ChatServer()
  29.                 {
  30.                         //
  31.                         // Required for Windows Form Designer support
  32.                         //
  33.                         InitializeComponent();
  34.                         clients = new ArrayList();
  35.                         processor = new Thread(new ThreadStart(StartListening));
  36.                         processor.Start();
  37.                 }

  38.                 /// <summary>
  39.                 /// Clean up any resources being used.
  40.                 /// </summary>
  41.                 protected override void Dispose( bool disposing )
  42.                 {
  43.                         if( disposing )
  44.                         {
  45.                                 if (components != null)
  46.                                 {
  47.                                         components.Dispose();
  48.                                 }
  49.                         }
  50.                         base.Dispose( disposing );
  51.                 }

  52.                 #region Windows Form Designer generated code
  53.                 /// <summary>
  54.                 /// Required method for Designer support - do not modify
  55.                 /// the contents of this method with the code editor.
  56.                 /// </summary>
  57.                 private void InitializeComponent()
  58.                 {
  59.                         this.lbClients = new System.Windows.Forms.ListBox();
  60.                         this.SuspendLayout();
  61.                         //
  62.                         // lbClients
  63.                         //
  64.                         this.lbClients.Font = new System.Drawing.Font("Tahoma", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
  65.                         this.lbClients.ItemHeight = 16;
  66.                         this.lbClients.Location = new System.Drawing.Point(16, 8);
  67.                         this.lbClients.Name = "lbClients";
  68.                         this.lbClients.Size = new System.Drawing.Size(264, 228);
  69.                         this.lbClients.TabIndex = 0;
  70.                         //
  71.                         // ChatServer
  72.                         //
  73.                         this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
  74.                         this.ClientSize = new System.Drawing.Size(292, 273);
  75.                         this.Controls.AddRange(new System.Windows.Forms.Control[] {
  76.                                                                                                                                                   this.lbClients});
  77.                         this.Name = "ChatServer";
  78.                         this.Text = "ChatServer";
  79.                         this.ResumeLayout(false);

  80.                 }
  81.                 #endregion
  82.                 protected override void OnClosed(EventArgs e)
  83.                 {
  84.                         try
  85.                         {
  86.                                 for(int n=0; n<clients.Count; n++)
  87.                                 {
  88.                                         Client cl = (Client)clients[n];
  89.                                         SendToClient(cl, "QUIT|");
  90.                                         cl.Sock.Close();
  91.                                         cl.CLThread.Abort();
  92.                                 }
  93.                                 listener.Stop();
  94.                                 if(processor != null)
  95.                                         processor.Abort();
  96.                         }
  97.                         catch(Exception ex)
  98.                         {
  99.                                 Console.WriteLine(ex.ToString() );
  100.                         }
  101.                         base.OnClosed(e);
  102.                 }
  103.                 private void StartListening()
  104.                 {
  105.                         listener = new TcpListener(listenport);
  106.                         listener.Start();
  107.                         while (true) {
  108.                                 try
  109.                                 {
  110.                                         Socket s = listener.AcceptSocket();
  111.                                         clientsocket = s;
  112.                                         clientservice = new Thread(new ThreadStart(ServiceClient));
  113.                                         clientservice.Start();
  114.                                 }
  115.                                 catch(Exception e)
  116.                                 {
  117.                                         Console.WriteLine(e.ToString() );
  118.                                 }
  119.                         }
  120.                         //listener.Stop();
  121.                 }
  122.                 private void ServiceClient()
  123.                 {
  124.                         Socket client = clientsocket;
  125.                         bool keepalive = true;

  126.                         while (keepalive)
  127.                         {
  128.                                 Byte[] buffer = new Byte[1024];
  129.                                 client.Receive(buffer);
  130.                                 string clientcommand = System.Text.Encoding.ASCII.GetString(buffer);

  131.                                 string[] tokens = clientcommand.Split(new Char[]{'|'});
  132.                                 Console.WriteLine(clientcommand);

  133.                                 if (tokens[0] == "CONN")
  134.                                 {
  135.                                         for(int n=0; n<clients.Count; n++) {
  136.                                                 Client cl = (Client)clients[n];
  137.                                                 SendToClient(cl, "JOIN|" + tokens[1]);
  138.                                         }
  139.                                         EndPoint ep = client.RemoteEndPoint;
  140.                                         //string add = ep.ToString();
  141.                                         Client c = new Client(tokens[1], ep, clientservice, client);
  142.                                         clients.Add(c);
  143.                                         string message = "LIST|" + GetChatterList() +"\r\n";
  144.                                         SendToClient(c, message);

  145.                                         //lbClients.Items.Add(c.Name + " : " + c.Host.ToString());
  146.                                         lbClients.Items.Add(c);
  147.                                        
  148.                                 }
  149.                                 if (tokens[0] == "CHAT")
  150.                                 {
  151.                                         for(int n=0; n<clients.Count; n++)
  152.                                         {
  153.                                                 Client cl = (Client)clients[n];
  154.                                                 SendToClient(cl, clientcommand);
  155.                                         }
  156.                                 }
  157.                                 if (tokens[0] == "PRIV") {
  158.                                         string destclient = tokens[3];
  159.                                         for(int n=0; n<clients.Count; n++) {
  160.                                                 Client cl = (Client)clients[n];
  161.                                                 if(cl.Name.CompareTo(tokens[3]) == 0)
  162.                                                         SendToClient(cl, clientcommand);
  163.                                                 if(cl.Name.CompareTo(tokens[1]) == 0)
  164.                                                         SendToClient(cl, clientcommand);
  165.                                         }
  166.                                 }
  167.                                 if (tokens[0] == "GONE")
  168.                                 {
  169.                                         int remove = 0;
  170.                                         bool found = false;
  171.                                         int c = clients.Count;
  172.                                         for(int n=0; n<c; n++)
  173.                                         {
  174.                                                 Client cl = (Client)clients[n];
  175.                                                 SendToClient(cl, clientcommand);
  176.                                                 if(cl.Name.CompareTo(tokens[1]) == 0)
  177.                                                 {
  178.                                                         remove = n;
  179.                                                         found = true;
  180.                                                         lbClients.Items.Remove(cl);
  181.                                                         //lbClients.Items.Remove(cl.Name + " : " + cl.Host.ToString());
  182.                                                 }
  183.                                         }
  184.                                         if(found)
  185.                                                 clients.RemoveAt(remove);
  186.                                         client.Close();
  187.                                         keepalive = false;
  188.                                 }
  189.                         }
  190.                 }
  191.                 private void SendToClient(Client cl, string message)
  192.                 {
  193.                         try{
  194.                                 byte[] buffer = System.Text.Encoding.ASCII.GetBytes(message.ToCharArray());
  195.                                 cl.Sock.Send(buffer,buffer.Length,0);
  196.                         }
  197.                         catch(Exception e){
  198.                                 cl.Sock.Close();
  199.                                 cl.CLThread.Abort();
  200.                                 clients.Remove(cl);
  201.                                 lbClients.Items.Remove(cl.Name + " : " + cl.Host.ToString());
  202.                                 //MessageBox.Show("Could not reach " + cl.Name + " - disconnected","Error",
  203.                                 //MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
  204.                         }
  205.                 }
  206.                 private string GetChatterList()
  207.                 {
  208.                         string chatters = "";
  209.                         for(int n=0; n<clients.Count; n++)
  210.                         {
  211.                                 Client cl = (Client)clients[n];
  212.                                 chatters += cl.Name;
  213.                                 chatters += "|";
  214.                         }
  215.                         chatters.Trim(new char[]{'|'});
  216.                         return chatters;
  217.                 }

  218.                 /// <summary>
  219.                 /// The main entry point for the application.
  220.                 /// </summary>
  221.                 [STAThread]
  222.                 static void Main()
  223.                 {
  224.                         Application.Run(new ChatServer());
  225.                 }
  226.         }
  227. }
复制代码
它說這兒有問題
  1. lbClients.Items.Add(c);
复制代码
錯誤信息
Cross-thread operation not valid: Control 'lbClients' accessed from a thread other than the thread it was created on.

我該怎樣解決
作者: 宅男-兜着走    时间: 2011-5-30 07:47 PM
各位

當我Client 按 connect 的時候我的Server 出現這個問題,請問怎樣解決

這是 Server它說這兒有問 ...
狂天使 发表于 2011-5-30 02:36 AM



    因为是 threading, UI 是在另外个thread, 你必须用 Invoke Method.
    上网查 C# Threading Invoke.
作者: goodday    时间: 2011-5-30 10:09 PM
delegate 搞定她
你的 delegate 不强吧

呵呵 你过来 我这里 我教你
呵呵
作者: goodday    时间: 2011-5-30 10:11 PM
我还有一大堆的 书
我请人荒  现在能做的是 引诱你

呵呵
作者: 狂天使    时间: 2011-5-31 12:00 AM
goodday... 你不會吧 =.= 你這樣引誘我,真的很吸引我也很想過來幫你啊。但是現在不行。哈哈。

現在還在請人荒哦,沒人來應徵嗎?
作者: goodday    时间: 2011-5-31 10:23 AM
有两个了,

一个充  大头鬼
说会什么 会什么的
我给我的 VS 他, 拿走其中的一段
compile 问他 bug 在哪里
找不出来  

另外几个 是 HTML javascripts 罢了

我不4是没请, 我丢给了我师父罢了
我师父也是很厉害的 programmer
他们住的地方比较 近我师傅
跟过我师傅的出来都是 超厉害的
包括本人

我背后还有2间公司都请人
请人 哦
作者: zechs    时间: 2011-5-31 12:21 PM
回复 6# goodday

有jb的公司吗 ?
作者: goodday    时间: 2011-6-2 11:46 AM
JB 的要 ASP 而已
你要的话 通知我
呵呵
作者: goodday    时间: 2011-6-2 11:47 AM
上来找我啦
我拿我的 书借你 office 看
不能借回家
很多人没还我




欢迎光临 JBTALKS.CC (https://www.jbtalks.cc/) Powered by Discuz! X2.5