多執行緒傳輸檔案輔助類

2021-04-08 16:35:19 字數 4437 閱讀 5952

基類

using

system;

using

system.collections.generic;

using

system.text;

using

system.io;

namespace

socketserver

...//

set 

}/**/

//////

下一包///

public

intnextbag

...}

/**/

//////

總包數///

public

intallbagnums

...}

/**/

//////

接收時是否進行檢查

///public

bool

checkout

...}

/**/

//////

包大小///

public

intbagsize

...}

#endregion

public

filebase()

...~

filebase()

..._fileinfo 

=null

;_filename 

=null;}

public

virtual

void

close()

...}

/**/

//////

得到每一包的前8個位元組

///第一位元組為包標識,後三位元組為包序號.最後四個位元組為檔案標識

//////

包序號///

byte[4]

protected

byte

getbaghead(

intbagsequence)

...array.copy(_filemark, 

0, baghead, 4, 

4);

return

baghead;

}/**/

//////

檔案的附加資訊(第一包)

//////

byte

protected

byte

getbaseinfo()

.../**/

//////

得到檔案資訊

//////

第一包資料(包頭加+附加資訊,最少512位元組)

///無錯誤,返回4(等於bagmark)

virtual

protected

intsetbaseinfo(

byte

firstbag)

...sourceindex +=1

;array.copy(firstbag, sourceindex, binfileinfo, 0, 

196);

sourceindex 

+=196

;_filesize 

=bin2int(binfilesize);

_allbagnums =(

int)bin2int(binallbagnums);

_bagsize =(

int)bin2int(binbagsize);

_readlen =(

int)bin2int(binreadlen);

_filename 

=encoding.default.getstring(binfilename).trim('空

');

_fileinfo 

=encoding.default.getstring(binfileinfo).trim('空

');

return

readbagsequence(baghead) 

+firstbag[0];

//+bin2int(_filemark));

}/**/

//////

得到包序號

//////

包頭(最少4位元組)

///包序號

public

static

intreadbagsequence(

byte

baghead)

...return

bagsequence;

}/**/

//////

將int轉換為byte[4]

///public

static

byte

int2bin(

long

intnum, 

intlength)

...return

bytenew;

}/**/

//////

將byte轉換為int

//////

///public

static

long

bin2int(

byte

bin)

...return

values;}}

}

傳送檔案類

using

system;

using

system.collections.generic;

using

system.text;

using

system.io;

namespace

socketserver

...else

...}

public

filesend(

intbagsize)

:this

(bagsize,

true

)...

public

filesend(

intbagsize, 

string

filepath)

: this

(bagsize,

true

)...

#endregion

/**/

//////

讀取包資料

//////

public

byte

read()

...else

...;}}

/**/

//////

讀取檔案資訊

//////

public

byte

readbase()

.../**/

//////

根據包序號讀取包資料

//////

包序號(從第1包資料開始)

///byte

public

byte

getbags(

intbagsequence)

...else

if(bagsequence 

<

_allbagnums)

...readlen 

=_stream.read(bag, 

8, _readlen);

_stream.position 

=sp;

}return

bag;

}return

newbyte

...;}

}}

接收檔案類

using

system;

using

system.collections.generic;

using

system.text;

using

system.io;

namespace

socketserver

...}

public

filerece()

: this

(environment.currentdirectory +@"

temp")

...#endregion

/**/

//////

建立檔案流

///private

void

creatfile()

..._stream 

=file.create(filefullpaht);

}/**/

//////

初始化///

///接收到的第一包資料

///public

intinitialize(

byte

firstbag)

.../**/

//////

寫資料///

///public

void

write(

byte

bin)

...else

...}}}

多執行緒同步輔助類

同步輔助類之訊號量 允許指定共享資源數量,可以允許指定數量的執行緒同時訪問資源 與同步的區別在於,同步時,一次只能一個執行緒訪問資源 author administrator public class semaphoredemo catch interruptedexception e start ...

JUC包下的常用多執行緒輔助類

允許一個或多個執行緒等待直到在其他執行緒中執行的一組操作完成的同步輔助。countdownlatch用給定的計數初始化。await方法阻塞,直到由於呼叫countdown 方法,當前計數達到零,此後所有等待執行緒被釋放,並且任何後續的呼叫await立即返回。這是一個一次性的現象 計數無法重置。場景舉...

多執行緒 等待 通知模式輔助類Condition

在j a中,對於任意一個j a物件,它都擁有一組定義在j a.lang.object上監視器方法,包括wait wait long timeout notify notifyall 這些方法配合synchronized關鍵字一起使用可以實現等待 通知模式。同樣,condition介面也提供了類似ob...

多執行緒檔案傳輸改進(1)

上次寫的檔案傳輸程式在傳輸大檔案時會看人品崩潰,問題出在send 和buffersize上,在cilent.c的程式上改寫如下地方 define buffer size 1024 sender 函式中改寫如下兩處 send sockfd,head buf,strlen head buf 0 slee...

Socket方法LAN多執行緒檔案傳輸

1.思維 為了實現各種檔案的大小可以被髮送和接收的,它可以被設定為傳送和接收緩衝器環。並記錄檔案的位置讀取,假設讀入緩衝區的位元組的特定數目大於緩衝區的大小較小。然後該檔案被髮送,退出傳送週期,關閉連線。和csocket它被阻止。收到傳送端傳送的全部內容,直到傳送端連線關閉。接收端退出接收迴圈。迴圈...