好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

C#使用Socket实现局域网聊天

本文实例为大家分享了c#使用socket实现局域网聊天的具体代码,供大家参考,具体内容如下

先运行一个java写的局域网聊天,效果图如下

后使用c#图形修改如下:

c#代码:

servlet服务端

 

?

using system;

using system.collections.generic;

using system.drawing;

using system.windows.forms;

using system.net;

using system.net.sockets;

using system.threading;

using system.io;

using system.text;

using system.text.regularexpressions;

 

namespace server

{

   public partial class mainform : form

   {

     private tcplistener listener;

     

     private dictionary< string ,tcpclient> socketlist;

     private bool tag = true ;

     private stringbuilder charlist;

     

     public mainform()

     {

       initializecomponent();

       control.checkforillegalcrossthreadcalls = false ;

     }

     

     void bu_startclick( object sender, eventargs e)

     {

       cb_chatlist.items.clear();

       selectchat.text= "" ;

       int port = 8888;

       //创建服务端,并且启动

       try {

         listener = new tcplistener(ipaddress.parse(ipaddress()),port);

         listener.start();  

         

         bu_start.enabled = false ;

         bu_stop.enabled = true ;

       } catch (exception ex)

       {

         messagebox.show( "服务器启动失败, 原因:" +ex.message);

         bu_start.enabled = true ;

         bu_stop.enabled = false ;

         return ;

       }

       selectchat.text = "服务器启动成功,访问ip:" +ipaddress()+ " 端口号:" +port;

       

       //记录住连接的客户端

       socketlist = new dictionary< string ,tcpclient>();

       charlist = new stringbuilder();

       

       //使用多线程,用于多个客户端接入

       thread th = new thread( new threadstart(executetask));

       th.start();

     }

     public void executetask()

     {

       while (tag)

       {

         //等待用户连接

         tcpclient client = null ;

         try {

           client = listener.accepttcpclient();

         } catch (exception)

         {

         }

         thread th = new thread(executeread);

         th.start(( object )client);

       }

     }

     public void executeread( object pamars)

     {

       //永久监听读取客户端

       tcpclient client = pamars as tcpclient;

       while (tag)

       {

         networkstream ns = client.getstream();

         streamreader sr = new streamreader(ns);

         string msg = string .empty;

         string people = string .empty;

         try {

           msg = sr.readline();

           if (msg.indexof( "<clientname>" )!=-1)

           {

             msg = regex.split(msg, "=" )[1];

             cb_chatlist.items.add(msg);       

             charlist.append(msg).append( "<@>" );

             socketlist.add(msg,client);

             msg = "<br>欢迎【" +msg+ "】光临<br>" ;

           }

           selectchat.appendtext(msg.replace( "<br>" , "\r\n" ));

           sendmsg( string .empty,msg);

         } catch (exception) {

           //messagebox.show(ex.message.tostring());

           break ;

         }

       }

     }

     public void sendmsg( string target, string msg)

     {

       if ( string .empty!=target)

       {

         tcpclient client = socketlist[target];

         streamwriter sw = new streamwriter(client.getstream());

         sw.writeline(msg);

         sw.flush(); 

       } else {

         dictionary< string ,tcpclient>.keycollection keycoll = socketlist.keys;

         foreach ( string name in keycoll) 

         {

           streamwriter sw = new streamwriter(socketlist[name].getstream());

           sw.writeline(msg+ "<@=@>" +charlist.tostring());

           sw.flush();       

         }

       }

     }

     /*根据计算名获取ip地址*/

     public string ipaddress()

     {

       ipaddress[] address = dns.gethostaddresses(dns.gethostname());

       return address[2].tostring();

     }

     

     void serverfromformclosing( object sender, formclosingeventargs e)

     {

       e.cancel = false ;

       if (tag)

         tag = false ;

       if (listener!= null )

         listener.stop();

     }

     

     void bu_stopclick( object sender, eventargs e)

     {

       bu_start.enabled = true ;

       bu_stop.enabled = false ;

       if (tag)

         tag = false ;

       if (listener!= null )

         listener.stop();

     }

   }

}

client客户端

?

using system;

using system.drawing;

using system.windows.forms;

using system.threading;

using system.net;

using system.net.sockets;

using system.io;

using system.text;

using system.text.regularexpressions;

 

namespace client

{

   public partial class mainform : form

   {

     private system.windows.forms.timer closewindowtimer;

     

     private streamreader sr;

     private streamwriter sw;

     private tcpclient tc;

     private clientlong cl;

     private bool tag = true ;

       

     public mainform(tcpclient tcp,clientlong clo)

     {

       cl = clo;

       tc = tcp;

       initializecomponent();

       control.checkforillegalcrossthreadcalls = false ;

       bu_simple.hide();

     }

     void clientfromload( object sender, eventargs e)

     {

       piaycheckedchanged();

     }

     

     /*事件方法*/

     public void piaycheckedchanged()

     {

       closewindowtimer = new system.windows.forms.timer();

       closewindowtimer.interval = 1000;

       closewindowtimer.tick += new eventhandler(theout);

       closewindowtimer.start();

     }

     

     /*执行的事件*/

     public void theout( object source, eventargs e)

     {

       //这里单独开一个线程用来显示信息

       try {

         thread t1 = new thread( new threadstart(readmsg));

         t1.start();

       } catch (exception)

       {

       }

     }

     void readmsg()

     {

       if (tag && tc!= null ){

         sr = new streamreader(tc.getstream());

         string msg = sr.readline();

         string [] address = regex.split(msg, "<@=@>" );

         chattext.appendtext(address[0].replace( "<br>" , "\r\n" ));

         address = regex.split(address[1], "<@>" );

         cb_chatlist.items.clear();

         foreach ( string s in address)

         {

           if (! string .isnullorempty(s) && s != cl.clientname)

             cb_chatlist.items.add(s);        

         }

       }

     }

     void button1click( object sender, eventargs e)

     {

       if ( string .isnullorempty(textbox2.text)){

         messagebox.show( "请输入消息" ); return ;

       }

       sw = new streamwriter(tc.getstream());

       sw.writeline( "<br>" +cl.clientname+ "  " +datetime.now.tostring( "yyyy-mm-dd hh:mm:ss" )+ "<br> " +textbox2.text);

       textbox2.text = "" ;

       sw.flush();

     }

     void bu_exitclick( object sender, eventargs e)

     {

       mainformformclosing( null , null );

     }

     void button2click( object sender, eventargs e)

     {

       chattext.text = "" ; 

     }

     void mainformformclosing( object sender, formclosingeventargs e)

     {

       closewindowtimer.stop();

       cl.close();

       tag = false ;

       if (sr!= null )

         sr.close();

       if (sw!= null )

         sw.close();

     }

     void bu_simpleclick( object sender, eventargs e)

     {

       string selected = cb_chatlist.text;

       if (selected== null )

       {

         messagebox.show( "请选择单聊对象" );

         return ;

       }

     }

   }

}

补充:

1.上传下载文件、聊天表情、私聊、踢人.......都是可以扩展的功能。

只是目前还没有可执行的思路,希望有相同爱好者多多提出宝贵意见,我会继续关注。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:https://blog.csdn.net/hubiao_0618/article/details/35796919

dy("nrwz");

查看更多关于C#使用Socket实现局域网聊天的详细内容...

  阅读:46次