如何用C#实现多线程TCP协议的服务器端程序

如何用C#实现多线程TCP协议的服务器端程序,第1张

用C#实现多线程TCP协议的服务器端程序:

// <summary>

/// Tcp客户线程类(服务端),ThreadServerProcessor 线程产生的客户连接,用该线程读写

/// </summary>

public class ThreadClientProcessor

{

//Tcp连接实例

private TcpClient tcpClient

//消息框,本来想写日志用

private System.Windows.Forms.ListBox MessageList

private string Password//该连接登陆密码

private string Cmd1Echo

private string Cmd2Echo

private bool ClientLogOn//客户是否登陆

private bool TcpClose

public ThreadClientProcessor(){}

//构造函数,参数解释:Tcp客户,消息框,该服务密码(password命令后的参数) ,命令回应串 1,2 ******************

public ThreadClientProcessor(TcpClient client , ListBox listBox,string LogonText ,string cmd1echo,string cmd2echo)

{

ClientList.Add(this) //把当前实例加入一个列表中,方便以后控制

this.tcpClient=client

this.MessageList=listBox

this.Password=LogonText

this.Cmd1Echo=cmd1echo

this.Cmd2Echo=cmd2echo

this.ClientLogOn=false

this.TcpClose=false

}

public static char[] CmdSplit={' '}//读来的串由' ' 进行分离,命名+' '+参数

//public const string[] Cmd=new string[] { "password","cmd1","cmd2","echo","bye"}

//该函数由你自己写,这个只是给一个例子,

//功能:命令处理器,给个命令串,返回该命令处理结果,把命令和处理结果放在一个文本文件里,便于系统升级

public string TcpCmd(string s)

{

string result

try

{

string cmdarg=s.Trim()

string[] args=cmdarg.Split(CmdSplit)

string cmd=args[0].ToLower()

switch (cmd )

{

case "password" :

if (args.Length>1)

{

ClientLogOn= Password.Equals(args[1].Trim())

result=ClientLogOn? "登陆成功":"密码不正确,未登陆"

}

else result= "登陆时候,没有输入密码"

break

case "cmd1":

result=ClientLogOn?this.Cmd1Echo:"该命令无权执行,请先登陆"

break

case "cmd2":

result=ClientLogOn?this.Cmd2Echo:"该命令无权执行,请先登陆"

break

case "echo":

result=string.Format("服务器回应:\n {0}",s)

break

case "bye":

this.TcpClose=true

result="DisConnected"

break

default:

result="不可识别的命令"

break

}

}

catch

{

result="解析命令发生错误,你输入的是狗屁命令,TMD *^* "

}

return result

} //end cmd

//定义一个线程,该线程对应的函数是 void start()(不是Start())********************************

//一下程序主要是操作该线程

public System.Threading.Thread tcpClientThread

//启动客户连接线程 *************************************************************

public void Start()

{

tcpClientThread=new Thread(new ThreadStart(start))

tcpClientThread.Priority=ThreadPriority.BelowNormal

tcpClientThread.Start()

}

//断开该当前实例连接,终止线程 **************************************************************

public void Abort()

{

if (this.tcpClientThread!=null)

{

//tcpClientThread.Interrupt()

tcpClientThread.Abort()

//一定要等一会儿,以为后边tcpClient.Close()时候,会影响NetWorkStream的操作

Thread.Sleep(TimeSpan.FromMilliseconds(100))

tcpClient.Close()

}

}

//静态列表,包含了每个连接实例(在构造实例时候使用了 ArrayList.Add( object))

private static System.Collections.ArrayList ClientList=new ArrayList()

//断开所有的Tcp客户连接,静态方法*************************************************************

public static void AbortAllClient()

{

for(int j=0 j<ClientList.Countj++)

{

//从实例列表中取一个对象,转化为ThreadClientProcessor对象

ThreadClientProcessor o=(ThreadClientProcessor ) ClientList[j]

//调用ThreadClientProcessor 对象的停止方法

o.Abort()

}

//清除连接列表

ClientList.Clear()

}

//读写连接的函数,用于线程//*******************************************************************

private void start()

{

byte[] buf=new byte[1024*1024]//预先定义1MB的缓冲

int Len=0//流的实际长度

NetworkStream networkStream=tcpClient.GetStream()//建立读写Tcp的流

try

{

byte[] p=Encoding.UTF8.GetBytes(" 欢迎光临,请输入密码" )

//向Tcp连接写 欢迎消息

if (!this.ClientLogOn )

networkStream.Write(p,0,p.Length)

//开始循环读写tcp流

while (!TcpClose)

{

//如果当前线程是在其它状态,(等待挂起,等待终止.....)就结束该循环

if (Thread.CurrentThread.ThreadState!=ThreadState.Running)

break

//判断Tcp流是否有可读的东西

if ( networkStream.DataAvailable)

{

//从流中读取缓冲字节数组

Len=networkStream.Read(buf,0,buf.Length)

//转化缓冲数组为串

string cmd=Encoding.UTF8.GetString(buf,0,Len)

this.MessageList.Items.Add("客户机:"+cmd)

//处理该缓冲的串(分析命令),分析结果为res串

string res=TcpCmd(cmd)

//把命令的返回结果res 转化为字节数组

byte[] result=Encoding.UTF8.GetBytes(res)

//发送结果缓冲数组给客户端

networkStream.Write(result,0,result.Length)

this.MessageList.Items.Add("服务器回应:"+res)

}

else

{

//Thread.Sleep(TimeSpan.FromMilliseconds(200d))

//this.MessageList.Items.Add("客户机无命令")

//如果当前Tcp连接空闲,客户端没有写入,则当前线程停止200毫秒

Thread.Sleep(TimeSpan.FromMilliseconds(200d))

}

}

超线程功能在BIOS里是默认开启的,如果你CPU支持超线程,则会自动模拟为物理核心X2。如果超线程没有开启,可以在开机的时候,进入BIOS里,找Hyper-Threading项,改为enabled就是开启超线程。 CPU超线程技术就是在一颗CPU同时执行多个程序而共同分享一颗CPU内的资源,理论上要像两颗CPU一样在同一时间执行两个线程,P4处理器需要多加入一个Logical CPU Pointer(逻辑处理单元)。

2. cpu多线程

多线程就是可以多个任务同时进行的意思吗? 正确

多核心就是让多个任务可以同时进行,比如amd的cpu,在一个核心里只能运行一个任务,intel的没有超线程技术的cpu也是1核心1任务

intel带有超线程技术的cpu可以1核心运行2任务,但也就这样了,要运行4 8 16 个任务就只能增加核心数

有的服务器的cpu有可以1核心运行4任务,比如ibm的power7,8核32线程,还有8线程的power8, 12核心96线程,但家用和常见的商业用cpu最多1核心2任务

3. 如何开启多线程

打开设置,基础设置里面的第三个就是多线程模式,你点到关就好了,但是这个模式可以显著增加团战时的帧率,提高团战质量,如果关掉的话,可能导致团战是手机变卡,影响操作。

这个模式开启后会增加耗电和CPU负荷,所以如果你的手机属于老旧手机或者运存不足或者没有稳定电源,就没有必要打开这个多线程模式,相反如果是新买的旗舰手机就完全可以,因为它会使你操作更加流畅,游戏体验更好!

4. 笔记本多线程怎么开

工具/材料:以惠普暗影精灵5Plus笔记本为例。

1、首先在惠普暗影精灵5Plus笔记本上,按下“开机”按键。

2、然后在惠普暗影精灵5Plus笔记本开机过程中,按下“F10”按键,进入设置BIOS界面。

3、其次在设置BIOS界面中,选中“Hyper-Threading”选项。

4、最后在设置BIOS界面中,可以选择“Disabled”和“Enabled”来打开关闭CPU的HT超线程。

5. cpu多线程有什么好处

多线程是为了使得多个线程并行的工作以完成多项任务,以提高系统的效率。线程是在同一时间需要完成多项任务的时候被实现的。使用线程的好处有以下几点:

·使用线程可以把占据长时间的程序中的任务放到后台去处理·程序的运行速度可能加快·在一些等待的任务实现上如用户输入、文件读写和网络收发数据等,线程就比较游泳了。在这种情况下我们可以释放一些珍贵的资源如内存占用等等。最关键的一点,多线程可以让同一个程序的不同部分并发执行如果你用过网际快车你就能理解了比如文件分成100部分10个线程文件就被分成了10份来同时下载1-10占一个线程11-20占一个线程依次类推线程越多文件就被分的越多同时下载当然速度也就越快

6. 电脑怎么开启多线程

Arduino只有一个CPU,要在一个CPU上实现多线程的话,最终都是通过软件实现的。Arduino是一款便捷灵活、方便上手的开源电子原型平台,包含硬件(各种型号的Arduino板)和软件(ArduinoIDE)。

它构建于开放原始码simpleI/O介面版,并且具有使用类似Java、C语言的Processing/Wiring开发环境。

看实际情况吧,如果只是差一个半个输入I/O,可以选用Nano板代替,比UNO多出两个analoginput。

如果真的不够用,想要调用的库也不少了,也要考虑程式的空间是否足够。

UNO只有32KBflash,Mega2560可是256KB。而SDRAMmega2560亦是UNO的4倍。对比较大的程式,mega是必然的。这些记忆体的限制,单靠扩展I/O是不行的。

如果空间及预算许可的话,mgea2560硬体上也可以给更大的弹性,将来再增加设备也比较容易,而且有多个serialI/O及interrupt,可实现的东西更多。但mgea2560长一半,对细小系统来说会比较大了。所以,如果可以的话,个人觉得mega2560比UNO+扩展I/O更好。

7. 如何开启cpu多线程

开始、运行,输入msconfig后回车,boot.ini,高级选项,把"/numproc(n)="前面的勾打上,后面的数字你自己选,后面的数字就是要启用的cpu数。最后确定确定即可,重启升效。

8. 如何开启cpu超线程

超线程

是英特尔所研发的一种技术,于2002年发

布。超线程的英文是HT

技术,全名为H

yper-T

hreading,中文又名超线程

。超线程技术原先

只应用于Xeon处理器中,当

时称为Super-Threading。之后陆续应用在Pentium4中,将技术主流化。早期代号

为Jackson。

 每个单位时间内,CPU只

能处理一个执行绪,以这样的单位进行,如果想要在单位时间内处理超过一个的执行绪,是不可能的,除非是有两个核心处理单元,英特尔的HT技术便是以

单个核心处理单元,去整合两个逻辑处理单元,也就是一个实体核心,两个逻辑核心,在单位时间内处理两个执行绪,模拟双核心运作。

E4400不支持超线程

9. cpu线程数怎么多开

回答:英特尔酷睿 i9 台式机处理器。

这个内核是英特尔为许多计算机提供的。i9只有18核36线程,远不及这份榜单的AMD处理器。尽管如此,如果您的 CPU 不需要大量功率,这仍然是一个非常好的处理器,可以处理最高级别的渲染,还可以让您轻松执行 3D 建模。

你也可以超频这个 CPU,给自己更快的速度。它最高可解锁 4.8 GHz,桌面处理器专为自由职业者和内容创作者而设计,为您提供录制和编辑所需的一切,而不会出现崩溃或卡顿现象。

10. 电脑如何开启多线程

双路CPU处理器在一定的程度上加快了计算机运行的速度,下面我们一起看怎样设置才能发挥双路的真正的性能。

第1步:添加待管理的程序

从“Program”菜单下选择“Add a Program configuration”,或按下“Ctrl+A”组合键,在弹出对话框中为待管理的应用程序设置一个名称。然后单击下方的“Browse”按钮指定应用程序所在的路径,至于下面的“Select the application priority”使用默认设置就行了。重复此步骤加入所有需要管理的程序。

第2步:参数设置

在“Advanced”标签页中,可以为刚添加的应用程序设置一些参数,这样可以激活某些额外的功能或面板,只需在“Additional parameters passed to the application”下面的文本框中直接输入指定参数就行了,需要注意的是一定要勾选窗口底部的“Automatically launch task when the Launcher start”复选框,这样才能让这些应用程序运行后能够按照WinLauncherXP的设置开始工作。

第3步:指定处理器核心

切换到“SMP”标签页,这里已经提供了八核处理器的支持,我们要做的工作非常简单,对于不具备超线程的双核心处理器来说,只要单独勾选“Processor 1”或“Processor 2”就行了,其余选项可全部去除,这样指定的应用程序将自动在处理器0或处理器1上进行工作,只要是通过WinLauncherXP所创建的快捷方式启动的应用程序,设置后就能生效。

第4步:指定窗口模式

Window options”标签页的“Window mode”可以手工指定默认的窗口模式,这里提供了Normal(正常)、Minimized(最小化)、Maximized(最大化)、Hidden(隐藏到任务栏)等四种模式,可以根据不同的程序进行设置。

完成后单击“Save”按钮保存设置,返回WinLauncherXP主窗口,在“All programs”列表框中就能看到刚添加的应用程序了,在这里选中后直接双击启动程序,也可以从右键菜单中选择“Edit selected program configuration”重新设置。程序运行后再次打开任务管理器的“处理器关系”对话框,你会发现单击此时该进程已经自动运行在指定的处理器核心上

11. 处理器怎么开启多线程

1,最典型的应用比如tomcat,tomcat内部采用的就是多线程,上百个客户端访问同一个web应用,tomcat接入后都是把后续的处理扔给一个新的线程来处理,这个新的线程最后调用到我们的servlet程序,比如doGet或者doPost方法。

2,做登录业务时使用到sms短信网关业务,创建子线程,让子线程去调用sms服务,主线程则返回,这样做可以提高用户的体验度

3.定时向大量(100w以上)的用户发送邮件。


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/578352.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-07-05
下一篇2023-07-05

发表评论

登录后才能评论

评论列表(0条)

    保存