C#+flash socket 聊天程序(flash源代码)

此篇文章为roading所有,欢迎转载,但请注明原处.
    看见还有很多人在研究flash的socket,其中经常会出现一些问题,所以将我以前写的一个程序代码拿出来给大家参考...
    服务器端程序请参考:http://www.roading.net/blog/article.asp?id=78 C#源代码

    这是flash的代码,代码比较简单,没有写什么注释.
//----------------------------------------------------------------------------------------------------------------
/*
http://www.roading.net/blog
代码由roading编写...欢迎测试...

*/
function OnConnect(success) {
 if (success) {
  trace("Connection succeeded!");
  isConn = true;
  socket.send("CONN|"+userNameIt.text);
  userList.addItem(’所有人’);
 } else {
  trace("Connection failed!");
 }
}
function OnData(src) {
 // 此处是您的语句
 trace(src)
 strArray = src.split(’|’);
 
 temp = strArray[0];
 trace(strArray.length+’/t’+strArray);
 if (temp == ’LIST’) {
  userList.removeAll();
  for (i=1; i<strArray.length; i++) {
   userList.addItem(strArray[i]);
  }
 } else if (temp == ’JOIN’) {
  userList.addItem(strArray[1]);
  smgText.text += strArray[1] + ’进来了···’+’/n’;
 } else if (temp == ’CHAT’) {
  smgText.text += strArray[1]+’/n’;
 } else if (temp == ’PRIV’) {
  smgText.text += strArray[strArray.length-1]+’/n’;
  break;
 } else if (temp == ’GONE’) {
  for (var i = 0; i<userList.length; i++) {
   if (userList.getItemAt(i).label == strArray[1]) {
    smgText.text += userList.getItemAt(i).label + ’离开了···’+’/n’;
    userList.removeItemAt(i);
   }
  }
 } else if (strArray[1] == ’CHAT’) {
  smgText.text += strArray[2]+’/n’;
 }
 temp = "";
 smgText.vPosition = smgText.maxVPosition;
}

connectBtn.onRelease = function() {
 socket = new XMLSocket();
 socket.onConnect = OnConnect;
 socket.onData = OnData;
 //
 if (!socket.connect("192.168.0.132", 9050)) {
  trace("Connection failed!");
 }
};
/
sendMsgBtn.onRelease = function() {
 if (msgIt.text != ’’) {
  if (userList.selectedItem == undefined || userList.selectedItem.label == ’所有人’ || userList.selectedItem.label == userNameIt.text) {
   socket.send("CHAT|"+userNameIt.text+’ 说:’+msgIt.text);
  } else if (!privateCheckBox.selected) {
   socket.send("CHAT|"+userNameIt.text+’ 对 ’+userList.selectedItem.label+’ 说:’+msgIt.text);
  } else {
   socket.send("PRIV|"+userNameIt.text+’|’+userList.selectedItem.label+’|’+userNameIt.text+’ 悄悄的对 ’+userList.selectedItem.label+’ 说:’+msgIt.text);
  }
 }
 msgIt.text = ’’;
};
disconnectBtn.onRelease = function() {
 isConn = false;
 socket.send("GONE|"+userNameIt.text);
 socket.close();
};
function init() {

 connected=false;
 
 smgText.text = ’’;
 temp = ’’;
}
init();
//连接到服务器
var isConn:Boolean = false;

myListener = new Object();
myListener.onKeyDown = function () {
if(Key.getCode() == 13)
sendMsgBtn.onRelease();
}

Key.addListener(myListener);
源文件下载:
 点击下载此文件
这是c#的代码,经过测试的,本来想把源程序都放上来,可以我用的是vs2005(而且现在又坏了,系统出问题了),下面是程序的主要源代码,不包含一些自动生成的代码.这些代码是根据一个开源的C#socket程序改编的,而且我已经写了比较详细的注释了,如果你看了这些代码还是发现有问题,可以向我索取完整的源程序:

//form1.cs
using System;
using System.IO;
using System.Drawing;
using System.Collections;//ArrayList引用到这个命名空间的类
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Net;
using System.Net.Sockets;
using System.Threading;

namespace ChatServer//服务器端命名空间
{
 /// <summary>
 /// Form1 的摘要说明。
 /// </summary>
 public class Form1 : System.Windows.Forms.Form
 {
  private int listenport = 9050;//监听端口
  private TcpListener listener;//监听者
  private ArrayList clients;//所有的client
  private Thread processor;//处理线程
  private Socket clientsocket;//client套接字
  private Thread clientservice;//client的服务
  private System.Windows.Forms.ListBox lbClients;
  private System.Windows.Forms.Label label1;//显示在线人员的List控件

  private TcpClient tclient;

  private NetworkStream ns;
  private System.Windows.Forms.Button button1;

  /// <summary>
  /// 必需的设计器变量。
  /// </summary>
  private System.ComponentModel.Container components = null;

  public Form1()
  {
   //
   // Windows 窗体设计器支持所必需的
   //
   InitializeComponent();
   Thread.CurrentThread.IsBackground = true;
   //
   // TODO: 在 InitializeComponent 调用后添加任何构造函数代码
   //
   clients = new ArrayList();//新建一个ArrayList类型用以存储所有的client
   processor = new Thread(new ThreadStart(StartListening));//新建一个处理线程
   processor.Start();//线程开始
   //

  }


  /// <summary>
  /// 清理所有正在使用的资源。
  /// </summary>
  protected override void Dispose( bool disposing )
  {

  
    int c = clients.Count;
    for(int n=0; n<c; n++)
    {
     Client cl = (Client)clients[n];
     cl.Sock.Close();
     cl.CLThread.Abort();
    }
   


   //client.Close();
   listener.Stop();
   processor.Abort();
   if( disposing )
   {
    if (components != null) 
    {
     components.Dispose();
    }
   }
   base.Dispose( disposing );
  }


  /// <summary>
  /// 开始监听
  /// </summary>
  private void StartListening()
  {

   IPAddress ipAddress = Dns.Resolve(Dns.GetHostName()).AddressList[0];
   //IPAddress ipAddress = IPAddress.Parse("192.168.0.132");

   
   label1.Text=ipAddress.ToString();
   IPEndPoint ipLocalEndPoint = new IPEndPoint(ipAddress, listenport);

   listener = new TcpListener(ipLocalEndPoint);
   listener.Start();
   while (true) 
   {
    try
    {
     Socket s = listener.AcceptSocket();//接收一个套接字
     clientsocket = s;//赋值给clientsocket
     clientservice = new Thread(new ThreadStart(ServiceClient));//为新进client服

务建立线程
     clientservice.Start();//线程开始
    }
    catch(Exception e)//如果出现异常则打控制台打印到屏幕
    {
     Console.WriteLine(e.ToString() );
    }
   }
  }

  /// <summary>
  /// 给一个客户提供服务
  /// </summary>
  private void ServiceClient()
  {
   Socket client = clientsocket;//赋值给client
   bool keepalive = true;
   bool s;
   while (keepalive)
   {

    Byte[] buffer = new Byte[1024];//一个1024bits的缓存区
    try
    {
     client.Receive(buffer);
    } 
    catch(SocketException ex) 
    { 
     //客户端退出  
     //MessageBox.Show(ex.ToString());
     string leaveName="";
     int remove = 0;
     bool found = false;
     int c = clients.Count;
     //从client的ArrayList中查找有没有相符的client
     //有的话就作好删掉的准备
     for(int n=0; n<c; n++)
     {
      Client cl = (Client)clients[n];
      if(cl.Host==client.RemoteEndPoint)
      {
       leaveName = cl.Name;
       remove = n;
       found = true;
       lbClients.Items.Remove(cl);//List控件中删除这个client
       break;
      }
     }

     if(found)
     {
      for(int n=0; n<c; n++)
      {
       Client cl = (Client)clients[n];
       //MessageBox.Show( "GONE|"+leaveName);
       SendToClient(cl, "GONE|"+leaveName);
      }
     
      clients.RemoveAt(remove);//从clients的ArrayList里面删掉要当前要退出

的client
      client.Close();//关闭套接口
      keepalive = false;//keepalive=false则这个线程服务完毕
     }

    }

 

    string clientcommand = System.Text.Encoding.UTF8.GetString(buffer);//把得到的数据用

ASCII的编码形式读出解决中文的显示问题

    label1.Text=clientcommand;

    string[] tokens = clientcommand.Split(new Char[]{’|’});//以|号划分的命令数据
    Console.WriteLine(clientcommand);

    if (tokens[0] == "CONN")//连接命令消息
    {
     //给现有的client发送新进一个client的消息
     for(int n=0; n<clients.Count; n++) 
     {
      Client cl = (Client)clients[n];
      SendToClient(cl, "JOIN|" + tokens[1]);
     }
     
     //新加一个client
     EndPoint ep = client.RemoteEndPoint;
     Client c = new Client(tokens[1], ep, clientservice, client);
     clients.Add(c);
     
     //给每个client发一个当前所有client的列表消息
     //string message = "LIST|" + GetChatterList();

     //new byte(0)
     //byte b = 0;

     string message = "LIST|"+"asdasd";
     //MessageBox.Show(message.Length +"="+message);
     SendToClient(c, message);

     //MessageBox.Show(message);

     //服务器List控件新加这个client
     lbClients.Items.Add(c);
     
    }
    else
     if (tokens[0] == "CHAT")//聊天命令消息
    {
     //给每个client发送聊天消息
     for(int n=0; n<clients.Count; n++)
     {
      Client cl = (Client)clients[n];
      SendToClient(cl, clientcommand);
     }
    }
    else
     if (tokens[0] == "PRIV") //私聊命令消息
    {
     
     string destclient = tokens[2];//目标client
     for(int n=0; n<clients.Count; n++) 
     {
      Client cl = (Client)clients[n];
      if(cl.Name.CompareTo(tokens[2]) == 0)//给目标client发聊天消息
       SendToClient(cl, clientcommand);
      if(cl.Name.CompareTo(tokens[1]) == 0)//给自己发聊天消息
       SendToClient(cl, clientcommand);
     }
    }
    else
     if (tokens[0] == "GONE")//离开命令消息
    {
     int remove = 0;
     bool found = false;
     int c = clients.Count;
     //从client的ArrayList中查找有没有相符的client
     //有的话就作好删掉的准备
     for(int n=0; n<c; n++)
     {
      Client cl = (Client)clients[n];
      SendToClient(cl, clientcommand);
      if(cl.Name.CompareTo(tokens[1]) == 0)
      {
       remove = n;
       found = true;
       lbClients.Items.Remove(cl);//List控件中删除这个client
      }
     }
     if(found)
      clients.RemoveAt(remove);//从clients的ArrayList里面删掉要当前要退出

的client
     client.Close();//关闭套接口
     keepalive = false;//keepalive=false则这个线程服务完毕
    }
    else
    {
     //MessageBox.Show(clientcommand);
     for(int n=0; n<clients.Count; n++)
     {
      Client cl = (Client)clients[n];
      SendToClient(cl, "-");
     }
    }
   } 
  

  }

  /// <summary>
  /// 发送消息到指定的client
  /// </summary>
  /// <param name="cl">client</param>
  /// <param name="message">消息</param>
  private void SendToClient(Client cl, string message)
  {
   try
   {
    //MessageBox.Show(message);
    message += "0";
    byte[] buffer = System.Text.Encoding.UTF8.GetBytes(message.ToCharArray());
    buffer[buffer.Length -2] = 0;
    cl.Sock.Send(buffer,buffer.Length,0);
   }
   catch(Exception)//如果有异常则退出
   {
    //MessageBox.Show(message);
    clients.Remove(cl);
    lbClients.Items.Remove(cl.Name + " : " + cl.Host.ToString());
    for(int n=0; n<clients.Count; n++)
    {
     Client cl1 = (Client)clients[n];
     SendToClient(cl1, "GONE|"+cl.Name);
    }
    cl.Sock.Close();
    cl.CLThread.Abort();
    
   }
  }

  /// <summary>
  /// 获得所有聊天者的列表
  /// 中间以"|"符号间隔
  /// </summary>
  /// <returns></returns>
  private string GetChatterList()
  {
   string chatters = "";
   for(int n=0; n<clients.Count; n++)
   {
    Client cl = (Client)clients[n];
    chatters += cl.Name;
    //MessageBox.Show(cl.Name.Length +"=" +cl.Name);
    //chatters += "welcome";
    chatters += "|";
    //MessageBox.Show(cl.Name);
    
   }
   //chatters += "欢迎你的到来";
   //MessageBox.Show(chatters);
   chatters.Trim(new char[]{’|’});
  
   return chatters;

   
  }

  /// <summary>
  /// 应用程序的主入口点。
  /// </summary>
  [STAThread]
  static void Main() 
  {
   Application.Run(new Form1());
  }

  
  //管理员消息```
  private void button1_Click(object sender, System.EventArgs e)
  {
   //initClient();
   if(clients.Count > 0)
   {
    int c = clients.Count;
    for(int n=0; n<c; n++)
    {
     string message = "CHAT|..";
   
     Client cl = (Client)clients[n];
     SendToClient(cl, message);
    }

   }
  }

 

 }
}

//--------------------------------------------------------------------------------------------------------------

//Client.cs
using System;
using System.Threading;

namespace ChatServer //定义命名空间
{
 using System.Net.Sockets;
 using System.Net;

 /// <summary>
 /// Client 的摘要说明。
 /// </summary>
 public class Client
 {
  private Thread clthread;//client的线程
  private EndPoint endpoint;//终端
  private string name;//client的名称
  private Socket sock;//套接口

  /// <summary>
  /// 构造函数,初始化所有的私有变量
  /// </summary>
  /// <param name="_name">名称</param>
  /// <param name="_endpoint">终端</param>
  /// <param name="_thread">线程</param>
  /// <param name="_sock">套接口</param>
  public Client(string _name, EndPoint _endpoint, Thread _thread, Socket _sock)
  {
   // TODO: 在此处添加构造函数逻辑
   clthread = _thread;
   endpoint = _endpoint;
   name = _name;
   sock = _sock;
  }

  /// <summary>
  /// 重载:转成字串
  /// </summary>
  /// <returns>返回终端加上client名称</returns>
  public override string ToString()
  {
   return endpoint.ToString()+ " : " + name;
  }

  /// <summary>
  /// 获取和设置线程
  /// </summary>
  public Thread CLThread
  {
   get{return clthread;}
   set{clthread = value;}
  }

  /// <summary>
  /// 获取和设置终端
  /// </summary>
  public EndPoint Host
  {
   get{return endpoint;}
   set{endpoint = value;}
  }

  /// <summary>
  /// 获取和设置client名称
  /// </summary>
  public string Name
  {
   get{return name;}
   set{name = value;}
  }

  /// <summary>
  /// 获取和设置套接口
  /// </summary>
  public Socket Sock
  {
   get{return sock;}
   set{sock = value;}
  }
 }

转载自 闪动联盟http://www.85flash.com/Get/jiaoxuewenzhang/flash-tbyy/2006-7-25/155505839.html 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值