C#基于Socket实现多人聊天功能

本文实例为大家分享了C#基于Socket实现多人聊天功能的具体代码,供大家参考,具体内容如下

服务器

服务器负责接受所有客户端发来的消息,和将接受到的问题群发到其他用户。

代码:

using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
namespace ChatRoomService
{
    class Service
    {
        Socket socketSevice ;
        List<Socket> userList;//用户组
        public Service()
        {
           socketSevice = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
           userList = new List<Socket>();
        }

        public void  Start()
        {
            socketSevice.Bind(new IPEndPoint(IPAddress.Any,5566));
            socketSevice.Listen(10);
            Console.WriteLine("服务器启动成功");

            //开启接受连接,用多线程
            Thread accThread = new Thread(Accept);
            accThread.IsBackground = true;
            accThread.Start();
        }

        private void Accept()
        {
            //接受连接
            Socket clientSocket = socketSevice.Accept();
            userList.Add(clientSocket);
            //打印已经连接IP地址
            Console.WriteLine(IPToAddress(clientSocket)+"连接进来了");

            //
            Thread RecvThread = new Thread(ReceMessage);
            RecvThread.IsBackground = true;
            RecvThread.Start(clientSocket);

            Accept();//递归
        }
        //接收客户端信息
        private void ReceMessage(Object obj)
        {
            Socket client = obj as Socket;
            byte[] strByte = new byte[1024 * 1024];//设定接受字符的长度
            string str = "";
            try
            {
              int len = client.Receive(strByte);//接受用户发送的内容
              str = Encoding.Default.GetString(strByte, 0, len);
              Broadcast(str,client);//广播给用户
              Console.WriteLine(str);
             }
             catch (Exception e)
             {
                Console.WriteLine(IPToAddress(client)+"退出");
                userList.Remove(client);
                Thread.CurrentThread.Abort();//退出时掐死线程,不然递归反弹
            }
           ReceMessage(client); //使用递归
        }

        /// <summary>
        /// 广播信息
        /// </summary>
        /// <param name="useStr">传入收到的传输的内容</param>
        /// <param name="obj">传送信息的客户</param>
        private void Broadcast(string userStr,object obj)
        {
            Socket clientSend = obj as Socket; //当前发送信息的客户
            foreach (Socket client in userList)
            {
                if (client != clientSend)//将信息广播给其他用户
                {
                    client.Send(Encoding.Default.GetBytes(IPToAddress(clientSend)+":"+userStr));
                }
            }
        }        //转换出连来客户的IP地址
        private string IPToAddress(Socket soket)
        {
            return (soket.RemoteEndPoint as IPEndPoint).Address.ToString();
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ChatRoomService
{
    class Program
    {
        static void Main(string[] args)
        {
            Service ss = new Service();
            ss.Start();
            Console.ReadLine();
        }
    }
}

客户端

客户端的功能开始十分简单,可以发送信息给服务器。也可以接收服务器转发过来其他客户端的信息。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace ChatRoom
{
    class ClientRoom
    {
        Socket clientSocket;

        public ClientRoom()
        {
            clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//初始化服务器
        }
        /// <summary>
        /// 连接服务器
        /// </summary>
        /// <param name="Ip"></param>
        /// <param name="port"></param>
        public void Connected(string Ip,int port)
        {
            clientSocket.Connect(Ip,port);
            Console.WriteLine("连接成功");
            // ClientSocket.Bind(new IPEndPoint());

            Thread RecvThread = new Thread(RecvMessage);
            RecvThread.IsBackground = true;
            RecvThread.Start();
        }

       public void Send(String str)
        {
            clientSocket.Send(Encoding.Default.GetBytes(str));
        }

        /// <summary>
        /// 接受信息
        /// </summary>
        private void RecvMessage()
        {
            try
            {
                byte[] strByte = new byte[500 * 1024];
                int len = clientSocket.Receive(strByte);
                Console.WriteLine(Encoding.Default.GetString(strByte, 0, len));
            }
            catch (Exception e) //服务器关闭
            {
                Console.WriteLine("服务器关闭");
                Thread.CurrentThread.Abort();//关闭时切断进程
            }
            RecvMessage();
        }        
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ChatRoom
{
    class Program
    {
        static void Main(string[] args)
        {
            ClientRoom client = new ClientRoom();
            client.Connected("127.0.0.1", 5566);
            string str = Console.ReadLine();
            while (!str.Equals("q"))
            {
                client.Send(str);
                str = Console.ReadLine();
            }
            Console.ReadLine();
        }
    }
}

可以正常对话,测试一下。假装和自己对话

目前还没有解决沾包问题

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

(0)

相关推荐

  • 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

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

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

  • c#基于WinForm的Socket实现简单的聊天室 IM

    1:什么是Socket 所谓套接字(Socket),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象. 一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制. 从所处的地位来讲,套接字上联应用进程,下联网络协议栈,是应用程序通过网络协议进行通信的接口,是应用程序与网络协议根进行交互的接口. 2:客服端和服务端的通信简单流程 3:服务端Code: using System; using System.Collections.Generic; using Sys

  • 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# Socket编程实现简单的局域网聊天器的示例代码

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

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

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

  • 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#用Socket做一个局域网聊天工具

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

  • C#使用Socket实现本地多人聊天室

    本文实例为大家分享了C#使用Socket实现本地多人聊天室的具体代码,供大家参考,具体内容如下 [脚本一:Server端] 使用本机地址:127.0.0.1 完整代码 using System; using System.Collections.Generic; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading;   namespace ConsoleApp1 {     p

  • C#使用Socket实现服务器与多个客户端通信(简单的聊天系统)

    扩展: 由于server端是存储了所有server与client的连接对象,因此我们是可以基于此demo的基础上实现聊天系统: * 每当一个与用户发言时,是由server接收到的某个用户的发言信息的,此时服务器端可以通过循环发送该用户发送的信息给每个已经连接连接的用户(排除发送者). Server端代码: class Program { //创建一个和客户端通信的套接字 static Socket SocketWatch = null; //定义一个集合,存储客户端信息 static Dicti

随机推荐