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

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

本文实例为大家分享了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

标签:C#,Socket,聊天
0
投稿

猜你喜欢

  • springboot 同时启用http/https的配置方法

    2023-06-22 12:04:12
  • 浅谈java中String StringBuffer StringBuilder的区别

    2023-11-29 13:34:40
  • java实现仿射密码加密解密

    2022-10-09 04:04:49
  • Unity实现汽车前后轮倒车轨迹计算

    2022-12-18 17:49:47
  • java实现Dijkstra算法

    2021-09-02 23:14:15
  • springboot vue完成发送接口请求显示响应头信息

    2023-06-05 02:45:34
  • Triple协议支持Java异常回传设计实现详解

    2021-08-16 17:16:09
  • Android Filterable实现Recyclerview筛选功能的示例代码

    2023-08-30 16:52:47
  • Java 改造ayui表格组件实现多重排序

    2022-05-15 07:34:15
  • C# CSV文件读写的实现

    2023-05-24 10:39:07
  • Java函数式编程(八):字符串及方法引用

    2022-05-02 22:28:23
  • SpringBoot手动使用EhCache的方法示例

    2023-04-24 03:50:30
  • java中的String定义的字面量最大长度是多少

    2023-09-01 08:35:31
  • springboot整合shiro实现记住我功能

    2023-07-29 20:21:34
  • IDEA 2020.1 搜索不到Chinese ​(Simplified)​ Language Pack EAP,无法安装的问题

    2023-11-10 23:54:01
  • C# 使用Fiddler捕获本地HttpClient发出的请求操作

    2022-06-28 04:10:34
  • C# 在PDF中创建和填充域

    2022-05-14 05:49:23
  • C# DateTime.ToString根据不同语言生成相应的时间格式

    2022-04-16 12:34:51
  • 使用springboot跳转到指定页面和(重定向,请求转发的实例)

    2021-10-21 11:09:24
  • Android:Field can be converted to a local varible.的解决办法

    2022-01-23 16:53:14
  • asp之家 软件编程 m.aspxhome.com