程序分别为服务端与客户端,服务端创建套接字使用多线程侦听多客户端请求

代码需要引用System.Net;和System.Net.Socket;这两个类

分享源码demo:https://pan.baidu.com/s/10RuE9Vk0cIoxY91uzx4Gig     提取码:4eds

运行图:

服务端

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace ConsoleServer
{
class Program
{
static void Main(string[] args)
{
ServerControl Server = new ServerControl();//初始化Socket
Server.Start();//启动侦听连接
//Console.WriteLine("123");
Console.Read();
}
}
}

展开查看代码

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Sockets;
using System.Net;
using System.Threading; namespace ConsoleServer
{
public class ServerControl
{
public Socket ServerSocket;
public List<Socket> ClientList=null;//客户端集合 /// <summary>
/// 构造函数
/// </summary>
public ServerControl()
{
//创建套接字,ipv4寻址方式,套接字类型,传输协议
ServerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
ClientList=new List<Socket>();//实例化客户端接入集合介入
} public void Start()
{
ServerSocket.Bind(new IPEndPoint(IPAddress.Parse("127.0.0.1"),));//绑定IP和端口
ServerSocket.Listen();//支持最多连接数
Console.WriteLine("start server succeed"); //当有客户接入时当前线程会被挂起,每次新接入客户端创建独立线处理
Thread ThreadAccept = new Thread(Accept);
ThreadAccept.IsBackground = true;//设置为后台线程
ThreadAccept.Start();//启动线程 } private void Accept()
{
Socket Client = ServerSocket.Accept();//客户端接入当前线程挂起
IPEndPoint point=Client.RemoteEndPoint as IPEndPoint;//将远端节点转为ip和端口
Console.WriteLine("IP {0}:{1} connect succeed",point.Address,point.Port);//显示接入信息
ClientList.Add(Client);//将此连接添加到客户集合 //接收消息只处理一次,线程被挂起,创建新线程处理其新消息
Thread ThreadReceive = new Thread(Receive);
ThreadReceive.IsBackground = true;//设置为后台线程
ThreadReceive.Start(Client);//启动线程
Accept();//回掉处理新接入客户端
} /// <summary>
/// 处理收到的消息
/// </summary>
/// <param name="obj"></param>
private void Receive(object obj)
{
Socket Client = obj as Socket;
IPEndPoint point = Client.RemoteEndPoint as IPEndPoint;//将远端节点转为ip和端口
try
{
byte[] ByteReceive = new byte[];//消息数组
int ReceiveLenght = Client.Receive(ByteReceive);//只处理一次消息,此处会被挂起
string msg = point.Address + "[" + point.Port + "]:" + Encoding.UTF8.GetString(ByteReceive, , ReceiveLenght);
Console.WriteLine(msg);//打印收到的消息
Broadcast(Client, msg);//广播消息 Client.Send(Encoding.UTF8.GetBytes(DateTime.Now.ToString()));//回发当前时间给消息源
Receive(Client);//回调处理新消息
}
catch
{
ClientList.Remove(Client);//当客户端断开,从客户端集合移除该客户端
Console.WriteLine("{0}[{1}]:断开连接", point.Address, point);//打印提示信息
} } /// <summary>
/// 广播消息
/// </summary>
/// <param name="cli"></param>
/// <param name="msg"></param>
public void Broadcast(Socket cli,string msg)
{
foreach (var item in ClientList )//遍历所有客户端
{
if (item != cli)
item.Send(Encoding.UTF8.GetBytes(msg));//给除数据源以外客户端发送广播消息
}
}
}
}

展开查看代码

客户端

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace ConsoleClient
{
class Program
{
static void Main(string[] args)
{
ClientControl Client = new ClientControl();//初始化Socket
Client.Connect("127.0.0.1",);//连接到服务器
Console.WriteLine("Please enter the content to send,Enter exit to exit!");//提示信息
string msg=Console.ReadLine();//输入
while (msg!="exit")//判断是否退出
{
Client.Send(msg);//发送消息
msg = Console.ReadLine();//输入消息 } }
}
}

展开查看代码

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Sockets;
using System.Threading; namespace ConsoleClient
{
public class ClientControl
{
private Socket ClientSocket; public ClientControl()
{
//创建套接字,ipv4寻址方式,套接字类型,传输协议
ClientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
} /// <summary>
/// 连接到服务器
/// </summary>
/// <param name="IP"></param>
/// <param name="Port"></param>
public void Connect(string IP, Int32 Port)
{
try
{
ClientSocket.Connect(IP, Port);//连接到指定服务器
Console.WriteLine("connect server succeed ok!");//提示信息
//收到消息是线程会被挂起,创建新线程处理收到的消息
Thread ThreadReceive = new Thread(Receive);
ThreadReceive.IsBackground = true;
ThreadReceive.Start();
}
catch(SocketException e)
{
Console.WriteLine("无法连接到{0}:{1}{2}",IP,Port,e);
}
} /// <summary>
/// 发送消息
/// </summary>
/// <param name="msg"></param>
public void Send(string msg)
{
ClientSocket.Send(Encoding.UTF8.GetBytes(msg));
} /// <summary>
/// 接收消息
/// </summary>
private void Receive()
{
try
{
byte[] ByteReceive = new byte[];
int ReceiveLenght = ClientSocket.Receive(ByteReceive);//此处线程会被挂起
Console.WriteLine("{0}", Encoding.UTF8.GetString(ByteReceive, , ReceiveLenght));
Receive();
}
catch
{
Console.WriteLine("服务器已断开");
}
}
}
}

展开查看代码

C#实现局域网聊天 通讯 Socket TCP 多人的更多相关文章

  1. 用Socket做一个局域网聊天工具(转)

    原文:http://www.cnblogs.com/technology/archive/2010/08/15/1799858.html 程序设计成为简单的服务端和客户端之间的通信, 但通过一些方法可 ...

  2. C# Socket编程实现简单的局域网聊天器

    目录 前言 编码 服务端监听接口 客户端连接接口 文字发送接口 文件发送接口 信息接收接口(文字与文件) 使用 注意事项 源码 前言 最近在学习C# Socket相关的知识,学习之余,动手做了一个简单 ...

  3. 与众不同 windows phone (30) - Communication(通信)之基于 Socket TCP 开发一个多人聊天室

    原文:与众不同 windows phone (30) - Communication(通信)之基于 Socket TCP 开发一个多人聊天室 [索引页][源码下载] 与众不同 windows phon ...

  4. 用python实现一个简单的socket网络聊天通讯 (Linux --py2.7平台与windows--py3.6平台)

    windows   --> windows 写法均在py3.6 客户端写法 import socket client = socket.socket() client.connect(('192 ...

  5. nc 局域网聊天+文件传输(netcat)

    nc 局域网聊天+文件传输 nc的全程是netcat,这个工具非常好用. 有时候我们需要在局域网内传送一些文本消息或者文件的时候,通常的做法是安装一些局域网通讯软件,然后来做.其实不必要这样,使用nc ...

  6. 用c#写的一个局域网聊天客户端 类似小飞鸽

    用c#写的一个局域网聊天客户端 类似小飞鸽 摘自: http://www.cnblogs.com/yyl8781697/archive/2012/12/07/csharp-socket-udp.htm ...

  7. 局域网聊天软件(winsocket)

    LANChat工作整理 2013/8/22 程序实现功能: 局域网聊天软件,启动即可找到在线设备,并能够进行简单的文字聊天. 其实下面这个框图已经说明了程序的绝大部分功能原理. 核心类的程序框图 我觉 ...

  8. 基于Qt的P2P局域网聊天及文件传送软件设计

    基于Qt的P2P局域网聊天及文件传送软件设计 zouxy09@qq.com http://blog.csdn.net/zouxy09         这是我的<通信网络>的课程设计作业,之 ...

  9. 使用Beetle简单构建高性能Socket tcp应用

    beetle是基于c#编写的高性能Socket tcp组件,它基于SocketAsyncEventArgs的实现并提供了发送队列和接收队列的支持,可以根据情况灵活地设置1-N个发送队列和接收队列.除了 ...

随机推荐

  1. 【题解】P4570 [BJWC2011]元素 - 线性基 - 贪心

    P4570 [BJWC2011]元素 声明:本博客所有题解都参照了网络资料或其他博客,仅为博主想加深理解而写,如有疑问欢迎与博主讨论✧。٩(ˊᗜˋ)و✧*。 题目描述 给你 \(n\) 个二元组 \( ...

  2. Linux学习笔记(九)Vim文本编辑器的使用

    Vim文本编辑器的使用 Vim的工作模式 1.命令模式 2.输入模式 3.编辑模式 进入Vim 1.使用Vim打开文件 2.直接进入指定位置 Vim基本命令 1.插入命令 2.光标移动命令 3.使用V ...

  3. SpringCloud-Hystrix 服务降级、熔断

    Hystrix 是什么? Hystrix 是一个用于处理分布式系统的延迟和容错的开源库,在分布式系统里,许多依赖不可避免的会调用失败,比如超时.异常等,Hystrix 能够保证在一个依赖出问题的情况下 ...

  4. DEV gridview 合并单元格

    private void gv_docargo_CellMerge(object sender, DevExpress.XtraGrid.Views.Grid.CellMergeEventArgs e ...

  5. 如何用Github钩子做自动部署

    最近机缘巧合的购置了域名和服务器,不用实在是浪费,再加上一直没有属于自己的个人网站,所以打算用hexo在服务器上玩一下,这样也就不用再纠结用Github pages还是Gitee pages了.当然, ...

  6. vnpy源码阅读学习(9)回到OptionMaster

    回到OptionMaster 根据我们对APP调用的代码阅读,我们基本上知道了一个APP是如何被调用,那么我们回到OptionMaster学习下这个APP的实现. 看看结构 class OptionM ...

  7. Zookeepe的安装和集群的配置

    Zookeepe的安装和集群的配置 一.Zookeeper的简介 Zookeeper是个框架 二.Zookeeper在Linux上安装 官方提供的下载服务器 地址1:http://mirror.bit ...

  8. 【Linux常见命令】split命令

    split - split a file into pieces 按照指定的行数或大小分割文件 语法: split [OPTION]... [INPUT [PREFIX]] Output fixed- ...

  9. Django入门3:视图views

    1.获取用户请求数据 1.1 request.GET 获取request.method='GET'的数据 request.GET.get('name',None) 1.2 request.POST 获 ...

  10. layui模块化加载Echarts图表v4.2.1

    layui.use(['jquery','echarts'], function () { var $ = layui.$; //记得这是dom对象不是JQ对象,需要转换 echarts = layu ...