`

C#+flash socket 聊天程序

    博客分类:
  • 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;}
  }
}
}


文章来自: 闪客居(www.flashas.net) 详文参考:http://www.flashas.net/asbc/20060615/1237.html
分享到:
评论

相关推荐

    C#+Flex 在线聊天

    1. 使用C#创建服务端程序,初始化Socket服务器,监听指定端口。 2. 设计Flex客户端界面,包括聊天窗口、输入框、发送按钮等元素。 3. 在Flex中使用Socket类建立与C#服务端的连接,并加载策略文件。 4. 实现客户端...

    flash + c# 聊天程序

    在网上找一个flash聊天的例子,不过运行不通,调试好之后,将c#服务端做了改进:把监听端口、接收、发送数据的程序分开来;方便不同项目使用。测试通过登陆和发消息。注意server.cs 46行serverIpAddress = Dns....

    FlashSocket与C#通讯

    "FlashSocket与C#通讯"是一个关键的主题,涉及到客户端与服务器之间的低延迟、双向通信。以下是关于这个主题的详细解释: FlashSocket,全称Adobe Flash Socket,是Adobe Flash Player支持的一种高级网络功能,它...

    Flash的Socket应用(Server用C#)

    本文将深入探讨如何使用C#语言构建一个基于Flash Socket的服务器,以及AS3.0(ActionScript 3.0)在客户端的应用。 Flash Socket,也被称为“高级Socket”,是Flash Player提供的一个特性,允许Flash应用程序直接与...

    flash +asp.net Socket 简单聊天室实现

    利用socket开发的简单flash聊天室,后台使用c#开发socket服务器,例子比较简单,只是实现了socket与flash通信,相信大家会有启发。 资源内容: c#源程序和已经发布了的服务器: as3.0 测试源程序,

    Flex Socket与C#通信

    Flex Socket与C#通信是网络编程中的一个常见应用场景,尤其在构建实时交互系统时,如聊天、游戏等。本文将深入探讨如何使用Flex Socket技术在客户端实现与C#服务器端的高效通信,以及相关的实现细节。 Flex是Adobe...

    c#socket网络编程C/S源代码

    Socket编程在IT行业中是网络通信的基础,特别是在C#这样的面向对象编程语言中,它提供了强大的工具来实现客户端/服务器(C/S)架构的应用程序。本文将深入探讨C#中的Socket网络编程,以及如何利用它来构建C/S源代码...

    c#聊天室软件实用工具

    【C#聊天室软件实用工具】是一款基于C#编程语言开发的实时通讯应用程序,它旨在为用户提供便捷的在线聊天功能。C#是一种由微软公司推出的面向对象的编程语言,广泛应用于Windows平台上的软件开发,其丰富的类库和...

    商业编程-源码-FLASH 聊天条.zip

    2. **实时通信技术**:Flash聊天应用可能利用Socket或SharedObject技术实现实时数据交换。Socket允许双向通信,而SharedObject则用于在客户端之间共享小量数据。 3. **用户界面设计**:聊天条需要一个用户友好的...

    Flex+,net 实现聊天室的功能

    在.NET中,可以使用System.Net.WebSockets库来实现WebSocket服务器,而在Flex客户端,可以使用Flash的Socket类或WebSocket类来连接到服务器。 6. **服务器端实现**: 在.NET中,开发者可能使用ASP.NET MVC或ASP...

    C#示例(配套光盘源码)第四部分

    实例089 点对点聊天程序设计 311 实例090 网络电台 314 第9章 数据库及LINQ技术 实例091 通用数据库连接 319 实例092 读取数据库中的数据表结构 324 实例093 对数据库进行分离、附加、备份及还原操作 ...

    c#基础实例

    实例6 在SQL Server中存储显示图片 实例7 在ACESS 2000中存储显示图片 第六章 网络应用 实例1 Socket建立服务器程序 实例2 Socket建立客户端程序 实例3 P2P技术实现点对点聊天 实例4 C/S...

    asp.net_Flash

    3. **XMLSocket**:通过建立Socket连接,Flash可以直接与ASP.NET服务器进行实时通信。这在需要频繁双向数据交换的场景中很有用,如聊天应用。 4. **HTTPService**:Flash ActionScript 3.0提供了一个HTTPService类...

    vc++ 应用源码包_1

    FlashPlayer播放器4.0的VC++源代码 FreeBird2011最初版(模仿飞鸽,可聊天+传文件) 该实例可进行局域网的聊天、一对多、多对一、和多对多的传送和续传,理论上这是我本人的实现目的,而且目前经测试已基本实现了...

    WebQQ WebIM WebSocket

    开发者需要提供回退方案,例如使用Flash Socket或Long Polling等技术,以确保老版本浏览器也能正常通信。 总结起来,"WebQQ WebIM WebSocket"项目展示了如何利用WebSocket协议和c# TCP服务器构建实时的Web即时通讯...

    vc++ 应用源码包_5

    FlashPlayer播放器4.0的VC++源代码 FreeBird2011最初版(模仿飞鸽,可聊天+传文件) 该实例可进行局域网的聊天、一对多、多对一、和多对多的传送和续传,理论上这是我本人的实现目的,而且目前经测试已基本实现了...

    vc++ 应用源码包_2

    FlashPlayer播放器4.0的VC++源代码 FreeBird2011最初版(模仿飞鸽,可聊天+传文件) 该实例可进行局域网的聊天、一对多、多对一、和多对多的传送和续传,理论上这是我本人的实现目的,而且目前经测试已基本实现了...

    vc++ 应用源码包_6

    FlashPlayer播放器4.0的VC++源代码 FreeBird2011最初版(模仿飞鸽,可聊天+传文件) 该实例可进行局域网的聊天、一对多、多对一、和多对多的传送和续传,理论上这是我本人的实现目的,而且目前经测试已基本实现了...

    vc++ 应用源码包_3

    FlashPlayer播放器4.0的VC++源代码 FreeBird2011最初版(模仿飞鸽,可聊天+传文件) 该实例可进行局域网的聊天、一对多、多对一、和多对多的传送和续传,理论上这是我本人的实现目的,而且目前经测试已基本实现了...

    vc++ 开发实例源码包

    FlashPlayer播放器4.0的VC++源代码 如题。 FreeBird2011最初版(模仿飞鸽,可聊天+传文件) 该实例可进行局域网的聊天、一对多、多对一、和多对多的传送和续传,理论上这是我本人的实现目的,而且目前经测试已基本...

Global site tag (gtag.js) - Google Analytics