此篇文章为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;} } } } |
Word教程网 | Excel教程网 | Dreamweaver教程网 | Fireworks教程网 | PPT教程网 | FLASH教程网 | PS教程网 |
HTML教程网 | DIV CSS教程网 | FLASH AS教程网 | ACCESS教程网 | SQL SERVER教程网 | C语言教程网 | JAVASCRIPT教程网 |
ASP教程网 | ASP.NET教程网 | CorelDraw教程网 |