当前位置:文档之家› 1C#多线程SOCKET,文件传输

1C#多线程SOCKET,文件传输

1C#多线程SOCKET,文件传输
1C#多线程SOCKET,文件传输

服务端

1using System;

2using System.Collections.Generic;

3using https://www.doczj.com/doc/f68338810.html,ponentModel;

4using System.Data;

5using System.Drawing;

6using System.Text;

7using System.Windows.Forms;

8

9using https://www.doczj.com/doc/f68338810.html,;

10using https://www.doczj.com/doc/f68338810.html,.Sockets;

11using System.Threading;

12using System.Xml;

13

14namespace Server

15{

16public partial class ServerMain:Form

17{

18public ServerMain()

19{

20InitializeComponent();

21}

22

23private void ServerMain_Load(object sender,EventArgs e)

24{

25this.CmdStar.Enabled=true;

26this.CmdStop.Enabled=false;

27}

28

29private void配置参数ToolStripMenuItem_Click(object sender,EventArgs e) 30{

31Set TSet=new Set();

32TSet.ShowDialog();

33}

34

35private void关于ToolStripMenuItem_Click(object sender,EventArgs e)

36{

37About TAbout=new About();

38TAbout.Show();

39}

40///

41///获得XML文件中的端口号

42///

43///

44private int GetPort()

45{

46try

47{

48XmlDocument TDoc=new XmlDocument();

49TDoc.Load("Settings.xml");

50string TPort=TDoc.GetElementsByTagName("ServerPort")[0].InnerXml; 51return Convert.ToInt32(TPort);

52

53}

54catch{return6600;}//默认是6600

55}

56

57//声明将要用到的类

58private IPEndPoint ServerInfo;//存放服务器的IP和端口信息

59private Socket ServerSocket;//服务端运行的SOCKET

60private Thread ServerThread;//服务端运行的线程

61private Socket[]ClientSocket;//为客户端建立的SOCKET连接

62private int ClientNumb;//存放客户端数量

63private byte[]MsgBuffer;//存放消息数据

64

65private void CmdStar_Click(object sender,EventArgs e)

66{

67ServerSocket=new Socket(AddressFamily.InterNetwork,SocketType.Strea m,

ProtocolType.Tcp);

68ServerInfo=new IPEndPoint(IPAddress.Any,this.GetPort());

69ServerSocket.Bind(ServerInfo);//将SOCKET接口和IP端口绑定

70ServerSocket.Listen(10);//开始监听,并且挂起数为10

71

72ClientSocket=new Socket[65535];//为客户端提供连接个数

73MsgBuffer=new byte[65535];//消息数据大小

74ClientNumb=0;//数量从0开始统计

75

76ServerThread=new Thread(RecieveAccept);//将接受客户端连接的方法委托给线程

77ServerThread.Start();//线程开始运行

78

79CheckForIllegalCrossThreadCalls=false;//不捕获对错误线程的调用

80

81this.CmdStar.Enabled=false;

82this.CmdStop.Enabled=true;

83this.StateMsg.Text="服务正在运行"+"运行端口:"+this.GetPort().ToString(); 84this.ClientList.Items.Add("服务于"+DateTime.Now.ToString()+"开始运行."); 85}

86

87//接受客户端连接的方法

88private void RecieveAccept()

89{

90while(true)

91{

92ClientSocket[ClientNumb]=ServerSocket.Accept();

93ClientSocket[ClientNumb].BeginReceive(MsgBuffer,0,MsgBuffer.Length,0, new

AsyncCallback(RecieveCallBack),ClientSocket[ClientNumb]);

94this.ClientList.Items.Add(ClientSocket[ClientNumb].RemoteEndPoint.ToStrin g()+"

成功连接服务器.");

95ClientNumb++;

96}

97}

98

99//回发数据给客户端

100private void RecieveCallBack(IAsyncResult AR)

101{

102try

103{

104Socket RSocket=(Socket)AR.AsyncState;

105int REnd=RSocket.EndReceive(AR);

106for(int i=0;i

107{

108if(ClientSocket[i].Connected)

109{

110ClientSocket[i].Send(MsgBuffer,0,REnd,0);

111}

112RSocket.BeginReceive(MsgBuffer,0,MsgBuffer.Length,0,new AsyncC allback

(RecieveCallBack),RSocket);

113

114}

115}

116catch{}

117

118}

119

120private void CmdStop_Click(object sender,EventArgs e)

121{

122ServerThread.Abort();//线程终止

123ServerSocket.Close();//关闭SOCKET

124

125this.CmdStar.Enabled=true;

126this.CmdStop.Enabled=false;

127this.StateMsg.Text="等待运行";

128this.ClientList.Items.Add("服务于"+DateTime.Now.ToString()+"停止运行. ");

129}

130}

131}

客户端

1using System;

2using System.Collections.Generic;

3using https://www.doczj.com/doc/f68338810.html,ponentModel;

4using System.Data;

5using System.Drawing;

6using System.Text;

7using System.Windows.Forms;

8

9using https://www.doczj.com/doc/f68338810.html,;

10using https://www.doczj.com/doc/f68338810.html,.Sockets;

11

12namespace Client

13{

14public partial class ClientMain:Form

15{

16public ClientMain()

17{

18InitializeComponent();

19}

20

21private IPEndPoint ServerInfo;

22private Socket ClientSocket;

23private Byte[]MsgBuffer;

24private Byte[]MsgSend;

25

26private void ClientMain_Load(object sender,EventArgs e)

27{

28this.CmdSend.Enabled=false;

29this.CmdExit.Enabled=false;

30

31ClientSocket=new Socket(AddressFamily.InterNetwork,SocketType.Stream, ProtocolType.Tcp);

32MsgBuffer=new Byte[65535];

33MsgSend=new Byte[65535];

34CheckForIllegalCrossThreadCalls=false;

35

36Random TRand=new Random();

https://www.doczj.com/doc/f68338810.html,erName.Text="用户"+TRand.Next(10000).ToString();

38}

39

40private void CmdEnter_Click(object sender,EventArgs e)

41{

42ServerInfo=new IPEndPoint(IPAddress.Parse(this.ServerIP.Text),Convert.To Int32(this.ServerPort.Text));

44try

45{

46ClientSocket.Connect(ServerInfo);

47

48ClientSocket.Send(Encoding.Unicode.GetBytes("用户:"+https://www.doczj.com/doc/f68338810.html,erName.T ext+"进入系统!\n"));

49

50ClientSocket.BeginReceive(MsgBuffer,0,MsgBuffer.Length,0,new AsyncC allback(ReceiveCallBack),null);

51

52this.SysMsg.Text+="登录服务器成功!\n";

53this.CmdSend.Enabled=true;

54this.CmdEnter.Enabled=false;

55this.CmdExit.Enabled=true;

56}

57catch

58{

59MessageBox.Show("登录服务器失败,请确认服务器是否正常工作!");

60}

61}

62

63private void ReceiveCallBack(IAsyncResult AR)

64{

65try

66{

67int REnd=ClientSocket.EndReceive(AR);

68this.RecieveMsg.AppendText(Encoding.Unicode.GetString(MsgBuffer,0,REn d));

69ClientSocket.BeginReceive(MsgBuffer,0,MsgBuffer.Length,0,new AsyncC allback(ReceiveCallBack),null);

70

71}

72catch

73{

74MessageBox.Show("已经与服务器断开连接!");

75this.Close();

76}

78}

79

80private void CmdSend_Click(object sender,EventArgs e)

81{

82MsgSend=Encoding.Unicode.GetBytes(https://www.doczj.com/doc/f68338810.html,erName.Text+"说:\n"+this. SendMsg.Text+"\n");

83if(ClientSocket.Connected)

84{

85ClientSocket.Send(MsgSend);

86this.SendMsg.Text="";

87}

88else

89{

90MessageBox.Show("当前与服务器断开连接,无法发送信息!");

91}

92}

93

94private void CmdExit_Click(object sender,EventArgs e)

95{

96if(ClientSocket.Connected)

97{

98ClientSocket.Send(Encoding.Unicode.GetBytes(https://www.doczj.com/doc/f68338810.html,erName.Text+"离开了房间!\n"));

99ClientSocket.Shutdown(SocketShutdown.Both);

100ClientSocket.Disconnect(false);

101}

102ClientSocket.Close();

103

104this.CmdSend.Enabled=false;

105this.CmdEnter.Enabled=true;

106this.CmdExit.Enabled=false;

107}

108

109private void RecieveMsg_TextChanged(object sender,EventArgs e)

110{

111this.RecieveMsg.ScrollToCaret();

112}

114private void SendMsg_KeyDown(object sender,KeyEventArgs e) 115{

116if(e.Control&&e.KeyValue==13)

117{

118 e.Handled=true;

119this.CmdSend_Click(this,null);

120}

121}

122}

123}

解决多线程中11个常见问题

并发危险 解决多线程代码中的11 个常见的问题 Joe Duffy 本文将介绍以下内容:?基本并发概念 ?并发问题和抑制措施 ?实现安全性的模式?横切概念本文使用了以下技术: 多线程、.NET Framework 目录 数据争用 忘记同步 粒度错误 读写撕裂 无锁定重新排序 重新进入 死锁 锁保护 戳记 两步舞曲 优先级反转 实现安全性的模式 不变性 纯度 隔离 并发现象无处不在。服务器端程序长久以来都必须负责处理基本并发编程模型,而随着多核处理器的日益普及,客户端程序也将需要执行一些任务。随着并发操作的不断增加,有关确保安全的问题也浮现出来。也就是说,在面对大量逻辑并发操作和不断变化的物理硬件并行性程度时,程序必须继续保持同样级别的稳定性和可靠性。 与对应的顺序代码相比,正确设计的并发代码还必须遵循一些额外的规则。对内存的读写以及对共享资源的访问必须使用同步机制进行管制,以防发生冲突。另外,通常有必要对线程进行协调以协同完成某项工作。 这些附加要求所产生的直接结果是,可以从根本上确保线程始终保持一致并且保证其顺利向前推进。同步和协调对时间的依赖性很强,这就导致了它们具有不确定性,难于进行预测和测试。 这些属性之所以让人觉得有些困难,只是因为人们的思路还未转变过来。没有可供学习的专门API,也没有可进行复制和粘贴的代码段。实际上的确有一组基础概念需要您学习和适应。很可能随着时间的推移某些语言和库会隐藏一些概念,但如果您现在就开始执行并发操作,则不会遇到这种情况。本

文将介绍需要注意的一些较为常见的挑战,并针对您在软件中如何运用它们给出一些建议。 首先我将讨论在并发程序中经常会出错的一类问题。我把它们称为“安全隐患”,因为它们很容易发现并且后果通常比较严重。这些危险会导致您的程序因崩溃或内存问题而中断。 当从多个线程并发访问数据时会发生数据争用(或竞争条件)。特别是,在一个或多个线程写入一段数据的同时,如果有一个或多个线程也在读取这段数据,则会发生这种情况。之所以会出现这种问题,是因为Windows 程序(如C++ 和Microsoft .NET Framework 之类的程序)基本上都基于共享内存概念,进程中的所有线程均可访问驻留在同一虚拟地址空间中的数据。静态变量和堆分配可用于共享。请考虑下面这个典型的例子: static class Counter { internal static int s_curr = 0; internal static int GetNext() { return s_curr++; } } Counter 的目标可能是想为GetNext 的每个调用分发一个新的唯一数字。但是,如果程序中的两个线程同时调用GetNext,则这两个线程可能被赋予相同的数字。原因是s_curr++ 编译包括三个独立的步骤: 1.将当前值从共享的s_curr 变量读入处理器寄存器。 2.递增该寄存器。 3.将寄存器值重新写入共享s_curr 变量。 按照这种顺序执行的两个线程可能会在本地从s_curr 读取了相同的值(比如42)并将其递增到某个值(比如43),然后发布相同的结果值。这样一来,GetNext 将为这两个线程返回相同的数字,导致算法中断。虽然简单语句s_curr++ 看似不可分割,但实际却并非如此。 忘记同步 这是最简单的一种数据争用情况:同步被完全遗忘。这种争用很少有良性的情况,也就是说虽然它们是正确的,但大部分都是因为这种正确性的根基存在问题。 这种问题通常不是很明显。例如,某个对象可能是某个大型复杂对象图表的一部分,而该图表恰好可使用静态变量访问,或在创建新线程或将工作排入线程池时通过将某个对象作为闭包的一部分进行传递可变为共享图表。 当对象(图表)从私有变为共享时,一定要多加注意。这称为发布,在后面的隔离上下文中会对此加以讨论。反之称为私有化,即对象(图表)再次从共享变为私有。 对这种问题的解决方案是添加正确的同步。在计数器示例中,我可以使用简单的联锁: static class Counter { internal static volatile int s_curr = 0; internal static int GetNext() { return Interlocked.Increment(ref s_curr);

Linux下基于socket的文件传输程序设计课程报告

Linux高级开发 课程设计报告 课程设计题目:Linux下基于socket的文件传输程序设计 学院:________信息工程学院_____________ 专业班级:________网络工程_____________ 年级:________级_____________________ 姓名:____________________________ 学号:________201______________ 完成时间:___2015___年____12___月_____25__日 成绩:__________________________________ 指导教师:____________________________

项目分 值 优秀 (100>x≥90) 良好 (90>x≥80) 中等 (80>x≥70) 及格 (70>x≥60) 不及格 (x<60) 评 分参考标准参考标准参考标准参考标准参考标准 学习态度15 学习态度认 真,科学作风 严谨,严格保 证设计时间并 按任务书中规 定的进度开展 各项工作 学习态度比较 认真,科学作 风良好,能按 期圆满完成任 务书规定的任 务 学习态度 尚好,遵守 组织纪律, 基本保证 设计时间, 按期完成 各项工作 学习态度尚 可,能遵守组 织纪律,能按 期完成任务 学习马虎, 纪律涣散, 工作作风 不严谨,不 能保证设 计时间和 进度 技术水平 与实际能力25 设计合理、理 论分析与计算 正确,实验数 据准确,有很 强的实际动手 能力、经济分 析能力和计算 机应用能力, 文献查阅能力 强、引用合理、 调查调研非常 合理、可信 设计合理、理 论分析与计算 正确,实验数 据比较准确, 有较强的实际 动手能力、经 济分析能力和 计算机应用能 力,文献引用、 调查调研比较 合理、可信 设计合理, 理论分析 与计算基 本正确,实 验数据比 较准确,有 一定的实 际动手能 力,主要文 献引用、调 查调研比 较可信 设计基本合 理,理论分析 与计算无大 错,实验数据 无大错 设计不合 理,理论分 析与计算 有原则错 误,实验数 据不可靠, 实际动手 能力差,文 献引用、调 查调研有 较大的问 题 创新10 有重大改进或 独特见解,有 一定实用价值 有较大改进或 新颖的见解, 实用性尚可 有一定改 进或新的 见解 有一定见解观念陈旧 论文(计算 书、图纸)撰写质量50 结构严谨,逻 辑性强,层次 清晰,语言准 确,文字流畅, 完全符合规范 化要求,书写 工整或用计算 机打印成文; 图纸非常工 整、清晰 结构合理,符 合逻辑,文章 层次分明,语 言准确,文字 流畅,符合规 范化要求,书 写工整或用计 算机打印成 文;图纸工整、 清晰 结构合理, 层次较为 分明,文理 通顺,基本 达到规范 化要求,书 写比较工 整;图纸比 较工整、清 晰 结构基本合 理,逻辑基本 清楚,文字尚 通顺,勉强达 到规范化要 求;图纸比较 工整 内容空泛, 结构混乱, 文字表达 不清,错别 字较多,达 不到规范 化要求;图 纸不工整 或不清晰 指导教师评定成绩: 指导教师签名:年月日

多线程传输文件.

c++实现文件传输之三:断点续传与多线程传输 继木马编程DIY的上两篇,现在我们开始讨论断点续传与多线程文件传输的实现.其实这两项功能是下载软件所 必不可少的功能了,现在我们把它加到自己的木马中来感受感受.提到多线程下载,首先向网络蚂蚁的作者 洪以容前辈致敬,正是由于网络蚂蚁而使得多线程下载被关注并流行起来.在这本篇文章中我们将简单的实现 支持断点续传和多线程传输的程序.为了更清晰的说明问题,我们将断点续传与多线程传输分别用两个程序来实现 多线程传输实现 实现原理 将源文件按长度为分为N块文件,然后开辟N个线程,每个线程传输一块,最后合并所有线线程文件.比如 一个文件500M我们按长度可以分5个线程传输.第一线程从0-100M,第二线程从 100M-200M......最后合并5个线程文件. 实现流程 1.客户端向服务端请求文件信息(名称,长度) 2.客户端跟据文件长度开辟N个线程连接服务端 3.服务端开辟新的线程与客户端通信并传输文件 4.客户端将每线程数据保存到一个文件 5.合并所有线程文件 编码实现 大体说来就是按以上步骤进行,详细的实现和一些要点,我们跟据以上流程在编码中实现 结构定义 在通信过程中需要传递的信息包括文件名称,文件长度,文件偏移,操作指令等信息,为了方便操作我们定义如下结构 代码: typedef struct { char Name[100]; //文件名称 int FileLen; //文件长度 int CMD; //操作指令 int seek; //线程开始位置 SOCKET sockid; }FILEINFO;

1.请求文件信息 客户端代码如下 代码: FILEINFO fi; memset((char*)&fi,0,sizeof(fi)); fi.CMD=1; //得到文件信息 if(send(client,(char*)&fi,sizeof(fi),0)==SOCKET_ERROR) { cout<<"Send Get FileInfo Error\n"; } 服务端代码如下 while(true) { SOCKET client; if(client=accept(server,(sockaddr *)&clientaddr,&len)) { FILEINFO RecvFileInfo; memset((char*)&RecvFileInfo,0,sizeof(RecvFileInfo)); if(recv(client,(char*)&RecvFileInfo,sizeof(RecvFileInfo),0)==SOCKET_ER ROR) { cout<<"The Clinet Socket is Closed\n"; break; }else { EnterCriticalSection(&CS); //进入临界区 memcpy((char*)&TempFileInfo,(char*)&RecvFileInfo,sizeof(RecvFile Info)); switch(TempFileInfo.CMD) { case 1: GetInfoProc (client); break; case 2: TempFileInfo.sockid=client; CreateThread(NULL,NULL,GetFileProc,NULL,NULL,NUL L); break; } LeaveCriticalSection(&CS); //离开临界区 }

基于多线程的高性能服务器程序的设计

基于多线程的高性能服务器程序的设计 摘要:随着网络应用的迅猛发展,高性能服务器程序越来越凸显出其重要地位。 文中基于多线程设计了高性能服务器程序,从而对处理客户端的并发请求问题提出了很好的解决方案。文中首先介绍了IOCP模型的原理,接着分别运用Select 模型和IOCP模型对高性能服务器程序的设计提出了不同的设计方法,通过比较时间、CPU的利用率和内存的使用率等参数,得出IOCP在设计服务器上提供了最佳的系统性能。最后提出了高性能服务器程序的设计方案。 关键字:Select 模型;IOCP模型;并发控制;事件;流的控制 1引言 目前很多服务器程序都是采用“一对一”处理模式,即一个客户占用一个线程,基于这种模式的服务器程序在框架上设计很简单,但是由于采用的是“一客户/一线程”的模式,所以这种服务器程序对于上千客户的请求连接,其在性能上就显得很低,在系统资源上的开销也很大。由于操作系统必须为大量的线程进行调度,从而会损耗大量的系统资源,另外互斥控制也会显得很困难,死锁发生的频率也会大幅度的增大。 现如今高性能服务器程序的设计显得越来越重要,高性能服务器程序的主要作用是能够高效的处理大量并发客户的请求,并且快速及时的处理客户的数据,同时将部分应答信息回传给客户端。要设计好一个性能优良的服务器程序,要考虑很多方面的因素,如CPU的使用率、Memory的开销等。要想做到高效处理并发用户的请求,服务器程序就需要解决两个主要的问题,一是处理并发客户的连接请求,二是对并发数据的处理。要解决这些问题,可以根据处理器内核的数量,来创建等量的工作线程,并结合IOCP(Input/Output Completion Port,IOCP))模型,以及操作系统的线程调度机制。文中采用多线程并结合IOCP模型对高性能的服务器程序设计进行了深入的探讨。 2 IOCP模型原理 IOCP(I/O Completion Port 输入/输出完成端口)是一种能够合理利用与管理多线程的机制。它是迄今为止Windows平台上最为复杂的一种I/O模型,当应用程序必须一次管理多个套接字时,完成端口模型提供了最好的系统性能,这个模型也提供了最好的伸缩性,非常适合用来处理上百、上千个客户。 IOCP模型提供了一个高效复杂的内核对象,该对象通过指定数量的线程,可

Socket传送文件

Socket传送文件 这是一对实现在两台计算机间传送文件的函数,我没有看到过使用CSocket进行文件传送的代码,希望此代码对你有用.代码中包含两个函数,第一个用于服务器端,第二个用于客户端. 需要说明的是本文提供的方法并不适用于大型文件的传送. 下面给出服务器端代码:void SendFile() { #define PORT 34000 /// Select any free port you wish AfxSocketInit(NULL); CSocket sockSrvr; sockSrvr.Create(PORT); // Creates our server socket sockSrvr.Listen(); // Start listening for the client at PORT CSocket sockRecv; sockSrvr.Accept(sockRecv); // Use another CSocket to accept the connection CFile myFile; myFile.Open("C:\\ANYFILE.EXE", CFile::modeRead | CFile::typeBinary); int myFileLength = myFile.GetLength(); // Going to send the correct File Size sockRecv.Send(&myFileLength, 4); // 4 bytes long byte* data = new byte[myFileLength]; myFile.Read(data, myFileLength); sockRecv.Send(data, myFileLength); //Send the whole thing now myFile.Close(); delete data; sockRecv.Close(); } 以下是客户端代码void GetFile() { #define PORT 34000 /// Select any free port you wish AfxSocketInit(NULL); CSocket sockClient;

使用Socket实现FTP客户端程序

使用Socket 通信实现FTP 客户端程序 FTP 概述 文件传输协议(FTP)作为网络共享文件的传输协议,在网络应用软件中具有广泛的应用。FTP的目标是提高文件的共享性和可靠高效地传送数据。 在传输文件时,FTP 客户端程序先与服务器建立连接,然后向服务器发送命令。服务器收到命令后给予响应,并执行命令。FTP 协议与操作系统无关,任何操作系统上的程序只要符合FTP 协议,就可以相互传输数据。本文主要基于LINUX 平台,对FTP 客户端的实现原理进行详尽的解释并阐述如何使用C 语言编写一个简单的FTP 客户端。 FTP 协议 相比其他协议,如HTTP 协议,FTP 协议要复杂一些。与一般的C/S 应用不同点在于一般的C/S 应用程序一般只会建立一个Socket 连接,这个连接同时处理服务器端和客户端的连接命令和数据传输。而FTP协议中将命令与数据分开传送的方法提高了效率。 FTP 使用2 个端口,一个数据端口和一个命令端口(也叫做控制端口)。这两个端口一般是21 (命令端口)和20 (数据端口)。控制Socket 用来传送命令,数据Socket 是用于传送数据。每一个FTP 命令发送之后,FTP 服务器都会返回一个字符串,其中包括一个响应代码和一些说明信息。其中的返回码主要是用于判断命令是否被成功执行了。 命令端口 一般来说,客户端有一个Socket 用来连接FTP 服务器的相关端口,它负责FTP 命令的发送和接收返回的响应信息。一些操作如“登录”、“改变目录”、“删除文件”,依靠这个连接发送命令就可完成。 数据端口 对于有数据传输的操作,主要是显示目录列表,上传、下载文件,我们需要依靠另一个Socket来完成。 如果使用被动模式,通常服务器端会返回一个端口号。客户端需要用另开一个Socket 来连接这个端口,然后我们可根据操作来发送命令,数据会通过新开的一个端口传输。 如果使用主动模式,通常客户端会发送一个端口号给服务器端,并在这个端口监听。服务器需要连接到客户端开启的这个数据端口,并进行数据的传输。 下面对FTP 的主动模式和被动模式做一个简单的介绍。 主动模式(PORT)

TCP论文文件传输论文

TCP论文文件传输论文 摘要:本文介绍了在linux下基于tcp协议的文件的传输系统的流程与设计。在传输的过程中,服务器(server)上使用了线程池技术实现了多线程的设计,并使用openssl 对所传输文件数据进行加解密,以保证文件传输过程中安全性的需求。 关键词:tcp;文件传输;线程池;openssl tcp-based secure file transmission system design and research liu xianqiang,lin hui,huang chengmao (school of optoelectronic information,university of electronic science&technology,chengdu610054,china) abstract:this article describes the file transmission system processes and design,base on tcp protocol in linux.in the transmission process,the server uses the thread pool technology to achieve the multi-threaded design,and using openssl library to ensure security of the data encryption during file tarnsmission. keywords:tcp;file transmission;thread

java中异步socket类的实现和源代码

java中异步socket类的实现和源代码 作者:dozb 我们知道,java中socket类一般操作都是同步进行,常常在read的时候socket就会阻塞直到有数据可读或socket连接断开的时候才返回,虽然可以设置超时返回,但是这样比较低效,需要做一个循环来不停扫描数据是否可读。看来,在同一个线程中,要是想实现异步读写不太容易。 下面介绍的这个类实现了伪异步socket通讯。基本思想就是在现有socket类的基础上进行封装,当sock et连接建立成功后,立即创建一个socket数据接收线程,专门负责阻塞式的socket读取(read),而当前线程负责数据的发送(send)。另外定义了一个接口,包括了socket的各种事件的回调。我们要实现这个接口,在接口实现类中创建异步socket对象,并且传递接口类到异步socket对象中,目的是有socket事件的时候回调我们的方法。 下面是接口: SocketExHandler.java package https://www.doczj.com/doc/f68338810.html,; import https://www.doczj.com/doc/f68338810.html,.*; /** * Title: * Description: * Copyright: Copyright (c) 2001 * Company: https://www.doczj.com/doc/f68338810.html, * @author dozb * @version 1.0 */ /** * 异步Socket Client Interface * 使用方法: * 1.定义类 MySocketClientEx 实现SocketExHandler接口,实现 OnReceive OnClose OnConnect 事件 * 2.在类中实现start方法 MySocketEx = new SocketEx(this,ip,port)

基于SOCKET的多线程下载工具的开发

2011年8月第8期电子测试 ELECTRONIC TEST Aug.2011 No.8 基于SOCKET的多线程下载工具的开发 周学威,闫鑫,赵榉云,杨薇 (中北大学 仪器科学与动态测试教育部重点实验室,山西 太原 030051)摘要:在Windows编程中,为了提高代码的时、空效率,广泛采取多线程技术。本文以多线程技术的应用为研究背景,实现了多线程的一个应用:多线程文件下载。该下载工具以VC++6.0为开发平台,利用Windows 套接字函数进行网络编程,实现了基于HTTP协议的文件下载过程,并通过创建和编写线程函数实现了文件的多线程下载工具的开发。利用该下载工具可以对网上的文档、图片、歌曲等各种文件实现多线程下载。经测试表明,该下载工具使文件的下载速率得到了有效提高。 关键词:多线程;HTTP协议;Windows套接字函数 中图分类号: TN915.85 文献标识码: A Development of multi-thread downlodeing tool based on socket Zhou Xuewei, Yan Xin, Zhao Juyun, Yang Wei (Key Laboratory of Instrumentation Science & Dynamic Measurement (North University of China), Ministry of Education, Taiyuan 030051, China) Abstract: In order to improve code’s efficiency both in time and space, Multi-thread technology widely used on Windows programs. This thesis’s background was the apply of the multithreading technology, realize an application of multithreading technology: The Multi-Thread download file . This tool used VC++6.0 as the development space and windows socket function to finish the process, realizing the file download based on Hyper Text Transfer Protocal, And by creating and writing thread function realize the file multi-thread downloading tools development.To avail these multithreading download instrument could download the different kinds of file by multithreading in net, such as the documents、pictures、songs and so on .The test shows that the download tools make file download speed effectively improved. Keywords: multi-thread; hyper text transfer protocal; Windows socket function 0 引言 多线程就是允许单个程序创建多个并行执行的线程来 完成各自的任务,它在多任务和实时处理等方面具有重要 意义,特别是在网络应用程序中,可以提高带宽利用率和 程序反应速度[1]。为了达到下载大型网站的目的,在编写离 线浏览软件的过程中,需要下载大量的Web文件,其中一 个技术要点就是多线程下载问题。是否具有“多线程下载” 技术、甚至能支持多少个下载线程都成了人们评测下载软 件的要素[2]。本文以SOCKET技术为依托,基于VC++6.0 环境,采用HTTP协议,通过编写客户端应用程序,对文 件的多线程下载进行了设计与实现。 1 设计思路 多线程下载的前提是网络的连通和通信软件与协议

用多线程同步方法解决生产者-消费者问题(操作系统课设)

. 题目用多线程同步方法解决生产者-消费 者问题(Producer-Consumer Problem) 学院计算机科学与技术学院 专业软件工程 班级 姓名 指导教师 年月日

目录 目录 (1) 课程设计任务书 (2) 正文 (2) 1.设计目的与要求 (2) 1.1设计目的 (2) 1.2设计要求 (2) 2.设计思想及系统平台 (2) 2.1设计思想 (2) 2.2系统平台及使用语言 (2) 3.详细算法描述 (3) 4.源程序清单 (5) 5.运行结果与运行情况 (10) 6.调试过程 (15) 7.总结 (15) 本科生课程设计成绩评定表 (16)

课程设计任务书 学生姓名:专业班级: 指导教师:工作单位:计算机科学与技术学院 题目: 用多线程同步方法解决生产者-消费者问题 (Producer-Consumer Problem) 初始条件: 1.操作系统:Linux 2.程序设计语言:C语言 3.有界缓冲区内设有20个存储单元,其初值为0。放入/取出的数据项按增序设定为1-20这20个整型数。 要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要 求) 1.技术要求: 1)为每个生产者/消费者产生一个线程,设计正确的同步算法 2)每个生产者和消费者对有界缓冲区进行操作后,即时显示有界缓冲区的当前全部内容、当前指针位置和生产者/消费者线程的自定义标识符。 3)生产者和消费者各有两个以上。 4)多个生产者或多个消费者之间须共享对缓冲区进行操作的函数代码。 2.设计说明书内容要求: 1)设计题目与要求 2)总的设计思想及系统平台、语言、工具等。 3)数据结构与模块说明(功能与流程图) 4)给出用户名、源程序名、目标程序名和源程序及其运行结果。(要注明存储各个程序及其运行结果的主机IP地址和目录。) 5)运行结果与运行情况 (提示: (1)有界缓冲区可用数组实现。 (2)编译命令可用:cc -lpthread -o 目标文件名源文件名 (3)多线程编程方法参见附件。) 3. 调试报告: 1)调试记录 2)自我评析和总结 上机时间安排: 18周一~ 五 08:0 - 12:00 指导教师签名:年月日

p2p实现多线程文件传输

p2p实现多线程文件传输 2007年09月17日星期一 11:21 什么是P2P技术呢?P2P是peer-to-peer的缩写,peer在英语里有“(地位、能力等)同等者”、“同事”和“伙伴”等意义。因此,P2P也就可以理解为“伙伴对伙伴”的意思,或称为对等联网。P2P技术自面市以来一直受到广泛的关注。最近几年,P2P技术更是发展迅速。目前,业界对P2P的定义还没有一个标准的说法,Intel将P2P技术定义为“通过系统间的直接交换达成计算机资源与信息的共享”,这些资源与服务包括信息交换、处理器时钟、缓存和磁盘空间等。IBM则对P2P赋予了更广阔的定义,把它看成是由若干互联协作的计算机构成的系统并具备如下若干特性之一:系统依存于边缘化(非中央式服务器)设备的主动协作,每个成员直接从其他成员而不是从服务器的参与中受益;系统中成员同时扮演服务器与客户端的角色;系统应用的用户能够意识到彼此的存在而构成一个虚拟或实际的群体。 简单地说,P2P技术是一种用于不同PC用户之间、不经过中继设备直接交换数据或服务的技术,其网络通信方式如图一所示。它打破了传统的Client/Server模式,在对等网络中,每个节点的地位都是相同的,具备客户端和服务器双重特性,可以同时作为服务使用者和服务提供者。由于P2P技术的飞速发展,互联网的存储模式将由目前的“内容位于中心”模式转变为“内容位于边缘”模式,改变Internet现在的以大网站为中心的状态,重返“非中心化”,将权力交还给用户。 目前,在网络电视、文件共享、分布式计算、网络安全、在线交流甚至是企业计算与电子商务等应用领域P2P都显露出很强的技术优势。简单的说,P2P直接将人们联系起来,让人们通过互联网直接交互。P2P使得网络上的沟通变得容易、更直接共享和交互。P2P就是人可以直接连接到其他用户的计算机、交换文件,而不是像过去那样连接到服务器去浏览与下载。P2P看起来似乎很新,但是正如B2C、B2B是将现实世界中很平常的东西移植到互联网上一样,在现实生活中我们每天都按照P2P模式面对面地或者通过电话交流和沟通。 P2P的本质思想是,整个网络中不存在中心节点(或中心服务器)。在P2P结构中,每一个节点(Peer)大都同时具有信息消费者、信息提供者和信息通讯者等三方面的功能,在P2P 网络中每一个节点所拥有的权利和义务都是对等的。在P2P工作方式中,每一个客户终端既是客户机,又是服务器。它弱化了服务器的作用,将信息数量、成本资源都向互联网各点均匀分布,也就是所谓的“边缘化”的趋势,消除了单个资源带来的瓶颈,可以控制和实现网络上各节点的负荷平衡。P2P技术不仅能利用服务器的资源,同时能合理地使用用户计算机的空闲资源。用户在享受媒体节目的同时,也在利用自身计算机所空闲的资源为其他用户提供着服务。所以,使用P2P技术提供高质量和大容量的流媒体服务系统成为可能。 P2P技术在网络电视中的应用 IPTV即交互式网络电视,是一种利用宽带有线电视网,集互联网、多媒体、通讯等多种技术于一体,向家庭用户提供包括数字电视在内的多种交互式服务的崭新技术。它能够很好地适应当今网络飞速发展的趋势,充分有效地利用网络资源。IPTV既不同于传统的模拟式有线电视,也不同于经典的数字电视。传统的和经典的数字电视都具有频分制、定时、单向广播等特点;尽管经典的数字电视相对于模拟电视有许多技术革新,但只是信号形式的改变,而没有触及媒体内容的传播方式。

在Linux下基于TCP协议的文件传输程序

Linux下基于TCP/IP协议的文件传输程序 【设计目的】 通过Linux C编程,设计一个基于TCP/IP的文件传输系统,实现网络文件的收发 【设计环境】 Ubuntu 12.04 【设计方案】 (1)文件读写 任意文件都可以二进制的方式进行读写,为了实现任意文件类型的传输,在读写文件的过程中,必须采用二进制的读写方式。 (2)传输协议 为了保证数据的正确性,文件传输需要采用一种可靠的传输协议。UDP协议实现比较简单,但UDP面向无连接,传输过程中,会出现丢包的情况,导致数据发送失败。故采用面向连接的TCP/IP协议,防止传输过程中的数据丢失的情况。 (3)大文件的传输 对于比较大的文件,应该进行分包操作,以防止占用过多的内存,导致文件发送失败。【设计流程】 如图1所示,服务器程序作为文件的发送方。首先,服务器端输入要发送的文件。然后,创建一个流式套接字(SOCK_STREAM),进行绑定。绑定成功后,执行监听,当有客户发送连接请求,执行Accept(),接收来自客户端的请求。 连接建立后,首先服务器向客服端发送的文件的文件名及扩展名等信息。信息发送完毕,服务器方将待发送的数据读入缓冲区,通过套接字将数据发送出去。发送完成后退出,并显示发送完成的信息。

图1 服务器流程图 如图2所示,客户端程序完成文件的接收操作。首先,创建一个流式套接字。套接字创建成功后,对该套接字进行绑定。绑定成功后,向服务器方发送连接请求。连接成功后,首先,接收服务器发送的文件信息。接收成功后,开始数据的接收。文件接收完毕,显示文件已接收完成。

图2 客户端流程图 【设计测试】 了验证设计的正确性,在Ubuntu 12.04系统上对可执行文件进行了回环测试。步骤如下: (1)测试文件a.txt及服务器端文件源fileserver.c和可执行文件fileserver

linux文件传输项目文档

局域网文件传输系统项目说明 需求说明: 1,开发平台 1.1linux x86 64 1.2支持Debian Ubuntu 1.3支持rhel,centos,Fedora 2,功能说明 1.1文件上传与下载,讲指定文件上传到服务器,或从服务器下载文件到指定位置 1.2文件浏览,浏览本地文件以及服务器端文件 1.3概要 功能说明 1.3.1客户端 主要任务: 1)分析用户输入的命令 2)根据命令向服务器端发出请求 3)等待服务器返回的结果 表1_1 命令含义与请求码 用户输入的命令命令含义对应的请求码 get 从服务器得到文件GET put 向服务器传输文件PUT cd 进入客户端的目录不需要与服务端通信,因此无请求 !cd 进入服务器端目录CD ls 列出客户端当前的内 不需要与服务端通信因此无请求 容 !ls 列出服务器端当前的 LS 内容 connect 连接服务器发出连接请求,不需要服务器额外处理 bye 退出程序BYE 表1_2 命令的格式 命令的名称格式说明 get get arg1 arg2。arg1:源文件arg2:本地路径。arg1,arg2都是绝对路径put put arg1 arg1。arg1:本地文件arg1:目标路径。arg1 arg2都是绝对路径!cd !cd arg1。arg1:指定的服务器目录。绝对路径 !ls !ls arg1。arg1:指定的目录。绝对路径 connect connect arg1。arg1:点分十进制IP地址 cd cd arg1。arg1:客户端的指定目录,绝对路径 ls ls arg1。arg1:客户端指定目录,绝对路径 bye bye。

【Java基于Socket文件传输示例】网络编程

Java基于Socket文件传输示例 最近需要进行网络传输大文件,于是对基于socket的文件传输作了一个初步的了解。在一位网友提供的程序基础上,俺进行了一些加工,采用了缓冲输入/输出流来包装输出流,再采用数据输入/输出输出流进行包装,加快传输的速度。废话少说,先来看服务器端的程序。 1.服务器端 package sterning; import java.io.BufferedInputStream; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream; import https://www.doczj.com/doc/f68338810.html,.ServerSocket; import https://www.doczj.com/doc/f68338810.html,.Socket; public class ServerTest { int port = 8821; void start() { Socket s = null; try { ServerSocket ss = new ServerSocket(port); while (true) { // 选择进行传输的文件 String filePath = "D:\\lib.rar"; File fi = new File(filePath);

System.out.println("文件长度:" + (int) fi.length()); // public Socket accept() throws // IOException侦听并接受到此套接字的连接。此方法在进行连接之前一直阻塞。 s = ss.accept(); System.out.println("建立socket链接"); DataInputStream dis = new DataInputStream(new BufferedIn putStream(s.getInputStream())); dis.readByte(); DataInputStream fis = new DataInputStream(new BufferedIn putStream(new FileInputStream(filePath))); DataOutputStream ps = new DataOutputStream(s.getOutput Stream()); //将文件名及长度传给客户端。这里要真正适用所有平台,例如中文名的处理,还需要加工,具体可以参见Think In Java 4th里有现成的代码。 ps.writeUTF(fi.getName()); ps.flush(); ps.writeLong((long) fi.length()); ps.flush(); int bufferSize = 8192; byte[] buf = new byte[bufferSize]; while (true) { int read = 0; if (fis != null) { read = fis.read(buf);

文件传输程序设计讲解

Internet网络程序设计实验报告基于Socket的文件传输程序设计 姓名:莫敌 班级:软件 0904 学号:U200917895 指导老师:陆永忠 2012.03.31

目录 1 实验目的及要求 (3) 1.1 实验目的 (3) 1.2 实验要求 (3) 2 实验环境 (3) 3 实验程序设计 (3) 3.1 设计思想 (3) 3.2 程序设计流程框图 (4) 3.3 详细设计 (5) 3.3.1 界面设计 (5) 3.3.2 主要功能实现 (6) 3.4 运行结果 (9) 4 实验感想 (11)

1实验目的及要求 1.1实验目的 熟悉Socket的通讯机制,了解网络程序的设计方法。重点掌握基于TCP协议的Socket 网络编程。 1.2实验要求 设计界面,在服务器端和客户端传输图片和文件。如果是图片请显示该图片,如果是其他文件,则保存。 2实验环境 编译环境:Windows 7 + Visual Studio 2010 使用MFC编写。 运行环境:Windows 7操作系统。 3实验程序设计 3.1设计思想 根据实验的要求:在服务器和客户端之间传输文件和图片,则需要程序提供一种可靠的网络传输服务来保证文件在传输过程中无丢失、损坏。在分析了传输层协议TCP协议和UDP 协议后,了解到TCP协议提供的是一种面向连接的、可靠的字节流服务,而UDP协议提供的是一种无连接的、不可靠的数据报服务。由于程序的需求,即必须保证文件传输的可靠性,于是,我采用基于TCP协议的Windows sockets来设计实现本实验。

3.2程序设计流程框图 图1程序设计流程框图

用多线程同步方法解决生产者-消费者问题(操作系统课设)

用多线程同步方法解决生产者-消费者问题(操作系统课设)

题目 用多线程同步方法解决生产者-消费 者问题(Producer-Consume r Problem) 学院 物理学与电子信息工程学院 专业电子信息工程班级08电信本一班姓名 指导教师 2010 年12 月日

目录 目录 0 课程设计任务书 (1) 正文 (3) 1.设计目的与要求 (3) 1.1设计目的 (3) 1.2设计要求 (3) 2.设计思想及系统平台 (3) 2.1设计思想 (3) 2.2系统平台及使用语言 (3) 3.详细算法描述 (4) 4.源程序清单 (7) 5.运行结果与运行情况 (12) 6.调试过程 (16) 7.总结 (16)

课程设计任务书 题目: 用多线程同步方法解决生产者-消费者问题 (Producer-Consumer Problem) 初始条件: 1.操作系统:Linux 2.程序设计语言:C语言 3.有界缓冲区内设有20个存储单元,其初 值为0。放入/取出的数据项按增序设定为 1-20这20个整型数。 要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求) 1.技术要求: 1)为每个生产者/消费者产生一个线程,设计正确的同步算法 2)每个生产者和消费者对有界缓冲区进行操作后,即时显示有界缓冲区的当前全部 内容、当前指针位置和生产者/消费者

线程的自定义标识符。 3)生产者和消费者各有两个以上。 4)多个生产者或多个消费者之间须共享对缓冲区进行操作的函数代码。 2.设计说明书内容要求: 1)设计题目与要求 2)总的设计思想及系统平台、语言、工具 等。 3)数据结构与模块说明(功能与流程图) 4)给出用户名、源程序名、目标程序名和源程序及其运行结果。(要注明存储各个 程序及其运行结果的主机IP地址和目 录。) 5)运行结果与运行情况 (提示: (1)有界缓冲区可用数组实现。 (2)编译命令可用:cc -lpthread -o 目标文件名源文件名 (3)多线程编程方法参见附件。) 3. 调试报告: 1)调试记录 2)自我评析和总结

java多线程写入同一文件

[代码][Java]代码 多个线程将数据写入队列当中,然后单线程再去处理写入到文件。觉得很巧妙,于是自己动手实现它。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 package com.thread; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.util.concurrent.ConcurrentLinkedQueue; /** * 多线程下写文件 * @author owen.huang * */ /** * 将要写入文件的数据存入队列中 */ class Creater implements Runnable{ private ConcurrentLinkedQueue queue; private String contents; public Creater(){} public Creater(ConcurrentLinkedQueue queue, String contents){ this.queue = queue; this.contents = contents; } public void run() { try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } queue.add(contents); } } /**

相关主题
文本预览
相关文档 最新文档