.NET Framework-多线程网络编程
多线程&网络编程
1、多线程:
或
Thread t1 = new Thread(new ParameterizedThreadStart(tt1.WriteColor));
static void Main(string[] args)
{
Thread th1 = new Thread(st);//多线程的两种声明方法之一
th1.Start();
object[] obj = new object[] { "1",33,1,8,2.5,1};
object o = obj;//将object的数组赋值给object类型的变量o
th2.Start(o);//多线程有两种参数,一种是无参,一种是object类型的参数
}
static void F1()
{
Console.WriteLine("387447647646");
}
static void F2(object o)
{
foreach (object obj in (object[])o)
{
Console.WriteLine(obj);
}//将object类型的参数转换成object数组并遍历输出数组元素
}
1)ThreadStart st = new ThreadStart(F1);//F1方法
Thread th1 = new Thread(st);//多线程的两种声明方法之一
class Program
{
static Thread ThrTest1, ThrTest2;
static void Main(string[] args)
{
ThreadStart TS1 = new ThreadStart(WriteLine1);
ThrTest1 = new Thread(TS1);
ThreadStart TS2 = new ThreadStart(WriteLine2);
ThrTest2 = new Thread(TS2);
ThrTest1.Start();
ThrTest2.Start();
}
public static void WriteLine1()
{
for (int i = 0; i < 20; i++)
{
if (i == 10)
{
ThrTest2.Join();
}
Console.ForegroundColor = ConsoleColor.Blue;
Console.WriteLine(i.ToString() + "WriteLine1");
Thread.Sleep(500);
}
}
{
for (int i = 0; i < 20; i++)
{
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine(i.ToString() + "WriteLine2");
Thread.Sleep(500);
}
}
}
class Program
{
static void Main(string[] args)
{
BookShop a = new BookShop();
Thread t1 = new Thread(new ThreadStart(a.Sale));
Thread t2 = new Thread(new ThreadStart(a.Sale));
t1.Start();
t2.Start();
}
}
{
int num = 1;//共享资源
public void Sale()
{
lock (this)//同步控制
{
if (num > 0)
{ //卖书过程
Thread.Sleep(1000);
num = num - 1;
Console.WriteLine("售出一本");
}
else
{
Console.WriteLine("没有了");
}
}
}
}
Monitor 类通过向单个线程授予对象锁来控制对对象的访问,对象锁提供限制访问代码块(通常称为临界区)的能力。
思路总结:1)要想实现一个服务器与多个客户端通信可以用一个泛型的哈希表来保存服务器监听到得客户端的信息,包括客户端的代号(用键保存代号)和客户端的流,每次服务器端可以选择要通信的客户端,利用检索保存客户端信息的哈希表来选择。
2)在服务器端有一个可以接收所有客户端的方法,分别将接收到得信息保存在哈希表中。
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.IO;
using System.Threading;
using System.Collections ;
{
class Program
{
static Dictionary<string, NetworkStream> clients = new Dictionary<string, NetworkStream>();
static void Main(string[] args)
{
Console.WriteLine("server");
TcpListener server = new TcpListener(IPAddress.Parse("192.168.0.105"), 9999);//定义一个服务器 监听网络的客户端
server.Start();
Thread th = new Thread(Accept );//定义一个线程,执行Accept方法,传递一个参数是接收到得网络流,不断接收所挂起的链接请求
th.Start(server);//将当前定义的服务器发送给Accept方法接收所有的客户端
Console.WriteLine("开始发送请按任意键!");
Console.ReadLine();
{
foreach (string key in clients.Keys)
{
Console.WriteLine("{0}", key);
}//将哈希表中已保存的客户端信息打印出来供用户选择
Console.WriteLine("请输入编号选择您要对话的客户端:");
string index = Console.ReadLine();
NetworkStream netstream = clients[index];//根据用户输入信息转换为哈希表的键,然后根据键取出哈希表中存放的制定客户端的流信息,以便进行写操作
StreamWriter sw = new StreamWriter(netstream);//定义一个写文件流执行写操作
while (true)
{
Console.WriteLine("请输入发送内容:");
string con = Console.ReadLine();
sw.WriteLine(con);//将要发送的内容写入流中供客户端读取
sw.Flush();//清理当前编写器的缓冲区
Console.WriteLine("退出请按E,继续请按任意键!");
if (Console.ReadLine().ToUpper() == "E")
{
break;
}
}//定义一个死循环像客户端发送消息
}
}
/// <summary>
/// 读取客户端发过来的消息
/// </summary>
/// <param name="o"></param>
static void ReadText(object o)
{
NetworkStream netstream = o as NetworkStream;
StreamReader sr = new StreamReader(netstream);
while (true)
{
Console.WriteLine("--------------------");
string con = sr.ReadLine();
//string [] a=con.Split('|');
//foreach(string key in clients.Keys )
//{
// if (a[0] == key)
// {
// NetworkStream netstream1 = clients[key];
// }
//}
Console.WriteLine("客户端:"+DateTime.Now );
Console.WriteLine("--------------------");
}
}
/// <summary>
/// 获取所有登入服务器的客户端,并将其代号和流信息保存在泛型哈希表中
/// </summary>
/// <param name="o"></param>
static void Accept(object o)
{
TcpListener server = o as TcpListener;
while (true)
{
TcpClient client = server.AcceptTcpClient();//接收挂起的连接请求,服务端每接收一个客户端消息都会生成
NetworkStream netstream = client.GetStream();//获取客户端的流
string con=sr.ReadLine();//获取客户端流输入的一行数据,即唯一标识某个客户端的数据,将其保存为泛型哈希表的键
clients.Add(con,netstream );//将唯一标识客户端的数据和该客户端的流保存在哈希表中
th.Start(netstream);//调用线程利用流读取客户端发来的数据内容
}//循环让服务器不断地接收客户端
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.IO;
using System.Threading;
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("client");
TcpClient client = new TcpClient("192.168.0.105", 9999);//客户端链接,存放的是服务器端的IP地址
NetworkStream netstream = client.GetStream();//客户端接收到的网络流
StreamWriter sw = new StreamWriter(netstream);
Console.WriteLine("请输入客户端信息:");
Thread th = new Thread(ReadText);//定义一个线程,执行ReadText方法,读网络流发送过来的消息,如果有发送来的消息就触发该线程,如果没有则跳过接着往下执行
th.Start(netstream);
while (true)
{
string con = Console.ReadLine();
sw.WriteLine(con);//将用户要发送的内容写进流供服务器端读取
sw.Flush();//将客户端信息发送给服务器
Console.WriteLine("客户端:" + DateTime.Now);
Console.WriteLine("--------------------");
}
}
/// <summary>
/// 读取客户端发送(即要发送给服务器)的消息
/// </summary>
/// <param name="o"></param>
static void ReadText(object o)
{
NetworkStream netstream = o as NetworkStream;
StreamReader sr = new StreamReader(netstream);
while (true)
{
string con = sr.ReadLine();
Console.WriteLine(con);
Console.WriteLine("服务端:" + DateTime.Now);
Console.WriteLine("--------------------");
}
}
}
转载于:https://blog.51cto.com/fayling/624810
.NET Framework-多线程网络编程相关推荐
- day16多线程网络编程日志枚举
多线程&网络编程 一.实现多线程 1.1 相关概念 线程是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的一条执行路径.实际运作单位.简单理解:应用软件中互相独立,可以同时运 ...
- Linux多线程网络编程要义丨epoll与reactor原理
linux多线程网络编程要义 1. epoll原理剖析 2. 单reactor原理以及应用 3. 多reactor原理以及应用 [Linux服务器系列]Linux多线程网络编程要义丨epoll与rea ...
- 【Linux服务器开发系列】详解多线程网络编程丨百分百干货分享丨学到就是赚到
90分钟搞懂多线程网络编程模型 1. 网络编程关注的问题 2. 网络编程的几种模型reactor,one loop per thread及其变种 3. skynet,redis,nginx,memca ...
- HSHA多线程网络编程模型介绍
我在上一篇的分享<Leader/Follower多线程网络模型介绍>中详细介绍了LF多线程网络模型的原理和代码分析.它的思路是减少线程上下文切换和数据拷贝时间,通过角色转换,来提高处 ...
- Java高并发与多线程网络编程
目录 一. 基础 1. 线程介绍 2. 创建并启动线程 3. 函数式接口编程 4. Thread 构造器 5. 守护线程 线程关系 6. join 7. interrupt 8. 优雅的结束线程 9. ...
- python多线程网络编程_python网络编程之线程
一 .背景知识 1.进程 之前我们已经了解了操作系统中进程的概念,程序并不能单独运行,只有将程序装载到内存中,系统为它分配资源才能运行,而这种执行的程序就称之为进程.程序和进程的区别就在于:程序是指令 ...
- python多线程网络编程_python之网络编程-多线程
死锁现象,递归锁 所谓死锁:是指两个或两个以上的进程或线程在执行过程中,因为争夺资源而造成的一种互相等待的现象,若无外力作用,他们将无法推进下去,此时称系统处于死锁状态或系统产生了死锁,这些永远在相互 ...
- QT多线程网络编程程序崩溃问题与解决
环境:Ubuntu14.04,Qt5.5 平台:QtCreator 场景:有以下三个线程:1.gstreamer循环取摄像头视频帧,25fps:2.HTTP循环请求消息并显示在QDoubleSpinB ...
- 多线程+SOCKET编程实现qq群聊的服务端和客户端
多线程+SOCKET编程实现qq群聊的服务端和客户端 标签(空格分隔): 多线程 网络编程 线程同步 一.设计思路 1.服务端 每来一个客户端连接,服务端起一个线程维护: 将收到的消息转发给所有的客户 ...
- 索骥馆-编程语言之《网络编程实用教程(第2版)》扫描版[PDF]
内容介绍: 本书主要介绍基于tcp/ip协议栈的套接字网络编程技术.全书分为10章,第1章介绍网络编程基础,第2章介绍套接字网络编程接口,第3章介绍windows环境的网络编程,第4章介绍mfc编程, ...
最新文章
- android studio安装在其他盘,Android Studio配置移动到D盘(亲测)
- 挂隐藏链接的4种代码
- 深度剖析WinPcap之(七)——获得与释放网络适配器设备列表(5)
- WindowsService 安装后报错: 无法启动计算机“.”上的服务 解决方案
- 技术交流论坛_研发部第四次技术交流论坛
- P1303 A*B Problem(python3实现)
- git版本回退:error: Your local changes to the following files would be overwritten by merge
- cxfreeze打包pyqt5程序_基于PyQt5的简单RMSE计算小工具研究
- 1203.1——条件语句 之 if语句
- 2.1.6 用ProtectX实现扫描的反击与追踪
- VirtualBox虚拟机安装教程
- 20172301 2017-2018-2 《程序设计与数据结构》第十周学习总结
- 第二重要极限公式推导过程_土木考研 土力学第八章公式推导
- word文档解密方法
- Mybatis的代码
- 盛唐气象:李白的诗与酒
- 小程序 wepy+MinUI
- form表单提交时传递额外的参数
- 麒麟820鸿蒙,华为最强千元机:绝版麒麟820+首升鸿蒙2.0+完美全屏!
- 日语学习的在线资料,朋友推荐,拿来分享