当前位置:首页 » 云服务器 » 服务器怎么能使软件用多线程跑

服务器怎么能使软件用多线程跑

发布时间: 2023-09-13 07:44:56

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

用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.Count;j++)
{
//从实例列表中取一个对象,转化为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));
}
}

java程序完成服务器和客户端的SOCKET通讯,要求服务器使用多线程接收和处理多个客户端访问请求

1. 客户端程序
import java.io.*;
import java.net.*;
public class TalkClient {
public static void main(String args[]) {
try{
Socket socket=new Socket("127.0.0.1",4700);
//向本机的4700端口发出客户请求
BufferedReader sin=new BufferedReader(new InputStreamReader(System.in));
//由系统标准输入设备构造BufferedReader对象
PrintWriter os=new PrintWriter(socket.getOutputStream());
//由Socket对象得到输出流,并构造PrintWriter对象
BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream()));
//由Socket对象得到输入流,并构造相应的BufferedReader对象
String readline;
readline=sin.readLine(); //从系统标准输入读入一字符串
while(!readline.equals("bye")){
//若从标准输入读入的字符串为 "bye"则停止循环
os.println(readline);
//将从系统标准输入读入的字符串输出到Server
os.flush();
//刷新输出流,使Server马上收到该字符串
System.out.println("Client:"+readline);
//在系统标准输出上打印读入的字符串
System.out.println("Server:"+is.readLine());
//从Server读入一字符串,并打印到标准输出上
readline=sin.readLine(); //从系统标准输入读入一字符串
} //继续循环
os.close(); //关闭Socket输出流
is.close(); //关闭Socket输入流
socket.close(); //关闭Socket
}catch(Exception e) {
System.out.println("Error"+e); //出错,则打印出错信息
}
}
}
2. 服务器端程序
import java.io.*;
import java.net.*;
import java.applet.Applet;
public class TalkServer{
public static void main(String args[]) {
try{
ServerSocket server=null;
try{
server=new ServerSocket(4700);
//创建一个ServerSocket在端口4700监听客户请求
}catch(Exception e) {
System.out.println("can not listen to:"+e);
//出错,打印出错信息
}
Socket socket=null;
try{
socket=server.accept();
//使用accept()阻塞等待客户请求,有客户
//请求到来则产生一个Socket对象,并继续执行
}catch(Exception e) {
System.out.println("Error."+e);
//出错,打印出错信息
}
String line;
BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream()));
//由Socket对象得到输入流,并构造相应的BufferedReader对象
PrintWriter os=newPrintWriter(socket.getOutputStream());
//由Socket对象得到输出流,并构造PrintWriter对象
BufferedReader sin=new BufferedReader(new InputStreamReader(System.in));
//由系统标准输入设备构造BufferedReader对象
System.out.println("Client:"+is.readLine());
//在标准输出上打印从客户端读入的字符串
line=sin.readLine();
//从标准输入读入一字符串
while(!line.equals("bye")){
//如果该字符串为 "bye",则停止循环
os.println(line);
//向客户端输出该字符串
os.flush();
//刷新输出流,使Client马上收到该字符串
System.out.println("Server:"+line);
//在系统标准输出上打印读入的字符串
System.out.println("Client:"+is.readLine());
//从Client读入一字符串,并打印到标准输出上
line=sin.readLine();
//从系统标准输入读入一字符串
} //继续循环
os.close(); //关闭Socket输出流
is.close(); //关闭Socket输入流
socket.close(); //关闭Socket
server.close(); //关闭ServerSocket
}catch(Exception e){
System.out.println("Error:"+e);
//出错,打印出错信息
}
}}

❸ 关于多线程服务器

你说你绑定和监听都好了吧
那么服务就可以这样写
while(bWorking)
{
SOCKET sAccept = accept(sListen, NULL, NULL);
if(sAccept != SOCKET_ERROR)
CreateThread(NULL, 0, ThreadProc, (LPVOID)&sAccept, 0, NULL);
}
相应的线程函数可以这样:
DWORD WINAPI ThreadProc(LPVOID lpPara)
{
SOCKET sComm = *((SOCKET*)lpPara);
//从这里开始读写这个socket就可以了
}
这样就实现了accept一个连接就创建一个线程。

❹ 网络出现连接超时怎么解决

网络连接超时就是在程序默认的等待时间内没有得到服务器的响应。

可能原因及解决办法如下:

1、网络断开,不过经常显示无法连接或是网络阻塞,导致你不能在程序默认等待时间内得到回复数据包 ;

2、网络不稳定,网络无法完整传送服务器信息 ;

3、系统:系统资源过低,无法为程序提供足够的资源处理服务器信息;

4、查看网络连接是否正常,可以给网络运营商打电话,要求查询线路,也可以将同网络内的其他人的网速限制一下;

5、路由器、猫、网卡等设备故障,也会引起网络卡,建议先重启,如果不能解决,建议更换;

6、电脑网卡驱动程序需要重新安装一下,再重新联网;

7、全盘查杀病毒后重新联网。

(4)服务器怎么能使软件用多线程跑扩展阅读

网络连接超时常见解决办法:

1、检查网线,更换接口;

2、在早上上网人数少的时候注册;

3、使用加速软件,如果要下载东西尽量在没有网络使用需求情况下载;

4、杀毒;

5、如果使用网卡,可以更换一下网卡。

热点内容
android获取应用版本 发布:2025-02-02 05:54:19 浏览:744
pythonif比较 发布:2025-02-02 05:24:03 浏览:259
已连接的无线网如何知道密码 发布:2025-02-02 04:53:51 浏览:634
android编程入门经典pdf 发布:2025-02-02 04:46:19 浏览:57
安卓什么软件测试手机电池 发布:2025-02-02 04:28:52 浏览:996
手机上传快 发布:2025-02-02 04:27:46 浏览:308
电脑配置详解图解都有哪些 发布:2025-02-02 04:26:27 浏览:716
景区应该有什么配置 发布:2025-02-02 04:09:08 浏览:120
c语言与java工作 发布:2025-02-02 03:59:57 浏览:283
qq买什么不要支付密码 发布:2025-02-02 03:50:29 浏览:497