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.上传下载文件、聊天表情、私聊、踢人.......都是可以扩展的功能。

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

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

(0)

相关推荐

  • c#多线程网络聊天程序代码分享(服务器端和客户端)

    XuLIeHua类库 复制代码 代码如下: using System;using System.Collections;  using System.Collections.Generic;using System.Threading;  using System.Runtime.Serialization;using System.Runtime.Serialization.Formatters.Binary;using System.Text;using System.IO;using Sy

  • C#实现简单聊天程序的方法

    本文实例讲述了C#简单聊天程序实现方法.分享给大家供大家参考.具体如下: 假如有服务器端程序,ChatServer和客户端程序ChatClient.实现客户端向服务器端发送信息的简单功能. 运行步骤, 1.先是服务器端start listen, 2.然后客户端connect. 3.客户端发送消息   只要服务器端start listen了,然后客户端也connect了.这样建立起连接后.接受发送信息就方便了,只要用writer,reader去操作NetworkStream   服务器ChatSe

  • c#实现多线程局域网聊天系统

    觉得好有点帮助就顶一下啦. socke编程,支持多客户端,多线程操作避免界面卡死. 开启socket private void button1_Click(object sender, EventArgs e) { try { int port = int.Parse(txt_port.Text); string host = txt_ip.Text; //创建终结点 IPAddress ip = IPAddress.Parse(host); IPEndPoint ipe = new IPEnd

  • 分享一个C#编写简单的聊天程序(详细介绍)

    引言 这是一篇基于Socket进行网络编程的入门文章,我对于网络编程的学习并不够深入,这篇文章是对于自己知识的一个巩固,同时希望能为初学的朋友提供一点参考.文章大体分为四个部分:程序的分析与设计.C#网络编程基础(篇外篇).聊天程序的实现模式.程序实现. 程序的分析与设计 1.明确程序功能 如果大家现在已经参加了工作,你的经理或者老板告诉你,"小王,我需要你开发一个聊天程序".那么接下来该怎么做呢?你是不是在脑子里有个雏形,然后就直接打开VS2005开始设计窗体,编写代码了呢?在开始之

  • 基于c#用Socket做一个局域网聊天工具

    程序设计成为简单的服务端和客户端之间的通信, 但通过一些方法可以将这两者进行统一起来, 让服务端也成为客户端, 让客户端也成为服务端, 使它们之间可以互相随时不间断的通信. 考虑到实现最原始的服务端和客户端之间的通信所需要的步骤对于写这样的程序是很有帮助的. 作为服务端, 要声明一个Socket A并绑定(Bind)某一个IP+这个IP指定的通信端口, 比如这个是127.0.0.1:9050, 然后开始监听(Listen), Listen可以监听来自多个IP传过来的连接请求, 具体可以同时连接几

  • C#聊天程序服务端与客户端完整实例代码

    本文所述为基于C#实现的多人聊天程序服务端与客户端完整代码.本实例省略了结构定义部分,服务端主要是逻辑处理部分代码,因此使用时需要完善一些窗体按钮之类的. 先看服务端代码如下: using System; using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms; using System.Data; using System.Net; using

  • C#基于UDP实现的P2P语音聊天工具

    语音获取 要想发送语音信息,首先得获取语音,这里有几种方法,一种是使用DirectX的DirectXsound来录音,我为了简便使用一个开源的插件NAudio来实现语音录取. 在项目中引用NAudio.dll //------------------录音相关----------------------------- private IWaveIn waveIn; private WaveFileWriter writer; private void LoadWasapiDevicesCombo(

  • C#基于Windows服务的聊天程序(1)

    本文将演示怎么通过C#开发部署一个Windows服务,该服务提供各客户端的信息通讯,适用于局域网.采用TCP协议,单一服务器连接模式为一对多:多台服务器的情况下,当客户端连接数超过预设值时可自动进行负载转移,当然也可手动切换服务器,这种场景在实际项目中应用广泛. 简单的消息则通过服务器转发,文件类的消息则让客户端自己建立连接进行传输.后续功能将慢慢完善. 自定义协议: 1.新建Windows服务项目 2.修改配置文件添加 <appSettings> <add key="maxQ

  • C#制作简单的多人在线即时交流聊天室

    实现网页版的在线聊天室的方法有很多,在没有来到HTML5之前,常见的有:定时轮询.长连接+长轮询.基于第三方插件(如FLASH的Socket),而如果是HTML5,则比较简单,可以直接使用WebSocket,当然HTML5目前在PC端并没有被所有浏览器支持,所以我的这个聊天室仍是基于长连接+长轮询+原生的JS及AJAX实现的多人在线即时交流聊天室,这个聊天室其实是我上周周末完成的,功能简单,可能有些不足,但可以满足在线即时聊天需求,分享也是给大家提供一个思路,大家可以基于此来实现更好的在线即时聊

  • 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 Sys

  • java socket实现局域网聊天

    使用socket实现局域网聊天,写这个主要是为了深入理解socket与信息流在网络中的传送过程加深理解. 代码很简单分为两个类,一个服务器类,一个客户端,运行时分别启动两个线程一个负责接受另一个负责发送. 整体流程是 两台机器分别启动程序,一个选择主动连接 另一个选择被动接受,即可实现类似qq的聊天效果两个人可以同时发送消息. 注意的事,不要在同一台电脑上同时启动两个,这样会服务端和客户端的ip都是相同很有可能造成自己发送的消息自己接受到了,可以两台电脑或者虚拟机里面进行. 服务端: packa

  • java+jdbc+mysql+socket搭建局域网聊天室

    本文实现思路:利用UDP协议进行局域网信息传输,建立点对点的聊天网络,每个端用户有自己的一个mysql数据库,所以需要获取其数据库用户名和密码,然后通过该数据库内容发送信息,接收消息则没有限制, 步骤: 建立数据表存储主机ip,接收信息端口port,nickname 向所有用户发送信息 接收信息 小部件(添加好友,删除好友) 一.建立数据表存储主机ip,接收信息端口port,nickname 在mysql数据库里建立chatusr数据表,表的格式为: 检测表是否存在和建立数据表的代码如下: vo

  • C# Socket编程实现简单的局域网聊天器的示例代码

    前言 最近在学习C# Socket相关的知识,学习之余,动手做了一个简单的局域网聊天器.有萌生做这个的想法,主要是由于之前家里两台电脑之间想要传输文件十分麻烦,需要借助QQ,微信或者其他第三方应用,基本都要登录,而且可能传输的文件还有大小限制,压缩问题.所以本聊天器的首要目标就是解决这两个问题,做到使用方便(双击启动即用),传文件无限制. 废话不多说,先上图.S-Chat是服务端,C-Chat是客户端,两者除了客户端首次启动后需要设置一下连接的IP地址外,无其他区别.操作与界面都完全相同,对于用

  • java+socket实现简易局域网聊天室

    本文实例为大家分享了java+socket实现简易局域网聊天室的具体代码,供大家参考,具体内容如下 服务器端 ServerFrame.java package com.eze.chatroom.server; import java.awt.EventQueue; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.border.EmptyBorder; import javax.swing.JLabe

  • socket多人聊天程序C语言版(二)

    socket多人聊天程序C语言版(一)地址: http://www.jb51.net/article/94938.htm 1V1实现了,1V多也就容易了.不过相对于1V1的程序,我经过大改,采用链表来动态管理.这样效率真的提升不少,至少CPU使用率稳稳的在20以下,不会飙到100了.用C语言写这个还是挺费时间的,因为什么功能函数都要自己写,不像C++有STL库可以用,MFC写就更简单了,接下来我还会更新MFC版本的多人聊天程序.好了,废话少说,进入主题. 这个程序要解决的问题如下: 1.CPU使

  • java实现简易局域网聊天功能

    本文实例为大家分享了java使用UDP模式编写聊天程序的具体代码,供大家参考,具体内容如下 Java代码: /* 使用UDP模式,编写一个聊天程序 有发送和接收数据2部分, 一个线程接收,一个线程发送 由于发送和接收动作是不一致的,所以要使用2个run方法 而且这两个方法要封装到不同的类中 本程序忽略了部分异常的处理,也未加入UI组件 这样比较简洁 发送端口9998 接受端口9999 用的是局域网广播地址,所以自己发的消息自己也收到了 [示例]:简易控制台聊天程序 */ import java.

  • java局域网聊天小程序

    本文实例为大家分享了java局域网聊天程序的具体代码,供大家参考,具体内容如下 有服务器端 和客户端两个界面,运行需要加上自己的ip地址,端口可以随意,但是客户端端口,和服务器端口要一样,然后就可以几个人一块聊天了 简单贴几个代码吧 Client.java  客户端代码 package chat; import java.awt.BorderLayout;//布置容器的边框布局 import java.awt.Color; import java.awt.Container; import ja

  • Java多线程局域网聊天室的实现

    局域网聊天室 在学习了一个学期的java以后,觉得java真是博大精深,彻底放弃了因为c++而轻视java的心态,搞了一个多线程的聊天室,熟悉了一下服务器和客户机的操作. 1.TCP 要实现局域网连接,就必须知道信息传输的原理. 在局域网里面传输的信息都是以包的形式,我使用的TCP包传输数据,TCP包里面封装了IP报文. 下面这句话就是通过一个静态IPV4协议的类得到一个服务器的IP地址. address = InetAddress.getByName("192.168.43.86")

  • Java实现简单局域网聊天室

    本文实例为大家分享了Java实现简单局域网聊天室的具体代码,供大家参考,具体内容如下 Java 的Socket编程: 1.TCP协议是面向连接的.可靠的.有序的.以字节流的方式发送数据,通过三次握手方式建立连接,形成传输数据的通道,在连接中进行大量数据的传输,效率会稍低 2.Java中基于TCP协议实现网络通信的类 客户端的Socket类 服务器端的ServerSocket类 3.Socket通信的步骤 ① 创建ServerSocket和Socket ② 打开连接到Socket的输入/输出流 ③

随机推荐