当前位置: 移动技术网 > IT编程>开发语言>c# > C#使用Socket实现局域网聊天

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

2019年07月18日  | 移动技术网IT编程  | 我要评论

本文实例为大家分享了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.上传下载文件、聊天表情、私聊、踢人.......都是可以扩展的功能。

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持移动技术网。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网