软件编程
位置:首页>> 软件编程>> C#编程>> C#使用Socket实现局域网聊天

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

作者:田埂上的梦想  发布时间:2021-07-20 02:13:20 

标签:C#,Socket,聊天

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

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

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

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

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

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

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com