首页 > 编程语言 >C# tcp 多线程服务端和客户端

C# tcp 多线程服务端和客户端

时间:2022-10-28 17:09:40浏览次数:56  
标签:service C# System 线程 new using 多线程 服务端 客户端


主要是服务端

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

namespace TcpServerTest
{
class Threadtcpserver
{

/* 本程序中采用了多线程技术,可以应付多客户的需求。首先,程序的主线程也就是程序的入口即Main()函数,
* 当执行到Accept方法时,线程变会阻塞;当有新连接时,就创建相应的消息服务线程。而主程序则继续进行监听,
* 检查有没有新的连接进入。如果客户端有向服务器连接的请求,那么就把连接句柄传递给接收的套接字。由于线程
* 的调度和切换是非常快的,快得足以让我们分辨不出程序的运行顺序,所以从宏观上来讲,可以说程序是并行执行
* 的。但事实上,从微观的角度上说,只是cpu飞快地调度线程,让我们感觉好像可以同时接收连接和处理消息一样,
* 但在一个时刻,只有一个线程是处于运行状态的。
*/


/// <summary>
/// 下面这段代码的业务逻辑是:
/// (1)创建套接字server,并将其与本地终结点iep进行绑定。然后,在13000端口上监听是否
// 有新的客户端进行连接
/// (2)在无限循环中有一个阻塞的方法Accept,该方法直到有新客户端连接到服务器上时,把
// 客户端的套接字信息传递给client对象。否则,将阻塞 直到有客户机进行连接。
/// (3)ClientThread类负责客户端与服务器端之间的通信。先把客户端的套接字句柄传递给
/// 负责消息服务的ClientThread类。然后,把ClientThread类 的ClientService方
//法委托给线程,并启动线程。
/// </summary>
private Socket server;
public Threadtcpserver()
{
//初始化IP地址
IPAddress local = IPAddress.Any; //.Parse("127.0.0.1");
IPEndPoint iep = new IPEndPoint(local, 8081);
server = new Socket(AddressFamily.InterNetwork, SocketType.Stream,
ProtocolType.Tcp);
//将套接字与本地终结点绑定
server.Bind(iep);
//在本地13000端口号上进行监听
server.Listen(20);
Console.WriteLine("等待客户机进行连接......");
while (true)
{
//得到包含客户端信息的套接字
Socket client = server.Accept();
//创建消息服务线程对象
ClientThread newclient = new ClientThread(client);
//把ClientThread类的ClientService方法委托给线程
Thread newthread = new Thread(new ThreadStart(newclient.ClientService));
//启动消息服务线程
newthread.Start();

}


}


/// <summary>
/// (1)在构造函数中得到接收到的客户套接字client,以后就通过service句柄处理消息的接收
/// 和发送。
/// (2)ClientService方法是委托给线程的,此方法进行消息的处理工作。在这里实现的功能是,
/// 先从客户端接收一条消息,然后把这条消息转换为大写字母,并立即发送一条应答的消息,
/// 也就是所谓的echo技术,通常用来进行消息之间的传递。
/// (3)还有就是通过connections变量来记录活动的连接数。当有新增连接或断开连接的情况发
/// 生时,都会体现出connections的变化。
/// </summary>
public class ClientThread
{
//connections变量表示连接数
public static int connections = 0;
public Socket service;
int i;
//构造函数
public ClientThread(Socket clientsocket)
{
//service对象接管对消息的控制
this.service = clientsocket;
}
public void ClientService()
{
String data = null;
byte[] bytes = new byte[1024];
//如果Socket不是空,则连接数加1
if (service != null)
{
connections++;
}
Console.WriteLine("新客户连接建立:{0}个连接数", connections);
while ((i = service.Receive(bytes)) != 0)
{
data = System.Text.Encoding.ASCII.GetString(bytes, 0, i);
Console.WriteLine("收到的数据:{0}"+ ((System.Net.IPEndPoint)service.RemoteEndPoint).Address, data);
//处理客户端发来的消息,这是转化为大写字母
data = data.ToUpper();
byte[] msg = System.Text.Encoding.ASCII.GetBytes(data);
//发送一条应答消息
service.Send(msg);
Console.WriteLine("发送的数据:{0}", data);
}
//关闭套接字
service.Close();
connections--;
Console.WriteLine("客户关闭连接:{0}个连接数", connections);
}


/// <summary>
/// Main函数十分简单,生成和一个Threadtcpserver实例,然后构造函数就会一步一步地
/// 展开,开始执行具体的业务逻辑。
/// </summary>
/// <param name="args"></param>
//static void Main(string[] args)
//{
// Threadtcpserver instance = new Threadtcpserver();
//}


}
}

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

namespace TcpServerTest
{
class Program
{
static void Main(string[] args)
{
Threadtcpserver instance = new Threadtcpserver();
}
}
}

这个tcp服务端是真正的多线程哦。

标签:service,C#,System,线程,new,using,多线程,服务端,客户端
From: https://blog.51cto.com/51souta/5805136

相关文章

  • C# .264 265 视频录像转Avi mp4 等等
    来吧直接看效果哈哈:这是转码后的文件: 支持多种多样的视频文件格式输出,有需要的找我,哈哈  ......
  • 解决轻量级服务器 HttpProcessor TcpClient 跨域问题
    添加:processor.httpHeaders.Add("Access-Control-Allow-Origin:*");//(正确)processor.httpHeaders.Add("Access-Control-Allow-Method......
  • python cmake 下载失败?   No CMAKE_C_COMPILER could be found.
    1.pipinstallcmake--default-timeout=100-ihttps://pypi.tuna.tsinghua.edu.cn/simple 2.第二个错误: --Buildingfor:VisualStudio162019  --Selectin......
  • echart 设置折线红色警戒线
    目录 ​​一、效果图​​​​二、实现过程​​​​三、最终效果​​一、效果图 二、实现过程   主要是用到了echat中的markline标志线、警戒线 letMarkLint_CO=......
  • C# socket 短连接
    直接上代码吧。这个短连接客户端只能发一次消息哦:usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Net;usingSystem.Net.Sockets;usingSy......
  • C#判断集合中的数据中字段的值是否都等于true
    若集合中的数据有多个字段,判断某个字段的数据的值是否都等于true。加一个数值计算列表中的个数,每判断完一项,其数值加一,当数值达到列表中数据的个数时,就判断完成了。例如:......
  • C# 从死磕到精通系列 string 类型
    首先看下string类型支持的常见方法:像:1.ToString将其他类型转换为string类型。null不可转。(据说现在最新版可以支持了)    2.Split  根据指定字符切换字符串返......
  • C# webAPI +access+xadmin+layui 前端
    1.首先创建webAPI项目: 2.创建DAL类库,用户访问数据库。添加AccessHelper封装一个数据库访问类:usingSystem;usingSystem.Collections.Generic;usingSystem.Data;using......
  • 通过抹黑java等其他语言提升C# 存在感?NO NO
    今天在写业务的时候突然看到了以前封装的java库里关于java时间格式化的代码。感觉到了深深的恶意感。来一起看下java的: 还有一个合并后后的再来看一个golang的 Golang格......
  • C# UpdClient 发送16进制
    C#如何发送已知"77852563821574"这样的16进制?publicstaticbyte[]HexStringToBytes(stringhs){string[]strArr=hs.Trim(......