基類
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它被阻止。收到傳送端傳送的全部內容,直到傳送端連線關閉。接收端退出接收迴圈。迴圈...