nft文件传输_利用remoting实现文件传输-.NET教程,远程及网络应用

因为工作需要写了一个文件传输的东东

使用了system.runtime.remoting

客户端接口类:

namespace nail.net.remoting.trans

public interface itransfile

function sendfile(byval filename as string, byval bytes() as byte, byval clientcrc as integer) as integer

function comparefile(byval filename as string, byval clientcrc as integer) as boolean

function getfiledet(byval filename as string) as integer

function getfileinfo(byval filename as string) as byte()

function getfileinfo(byval filename as string, byval length as integer) as byte()

function getfileinfo(byval filename as string, byval point as integer, byval length as integer) as byte()

property servertranssavefilepath() as string

property servertempfilepath() as string

end interface

end namespace

客户端类:(文件传输的实现在此)(包含1个窗体 后面窗体代码我会贴出来)(请添加引用system.runtime.remoting .net默认是不引用的 服务器端类同样)

imports system.runtime

imports system.runtime.remoting

imports system.runtime.remoting.channels

imports system.runtime.remoting.channels.tcp

imports system.io

imports system.threading

namespace nail.net.remoting.client

public class filetransclient

private transtempsize as integer

private transtype as trtype

private transport as integer

private transserverclassname as string

private transserveripadr as string

private transcrc32 as integer

private tsc as nail.net.remoting.trans.itransfile

private senconds as integer = 10

private withevents timer1 as new system.windows.forms.timer

private newtransform as frmtransfersui

private transfilename as string

文件全路径

public property fullfilename() as string

get

return transfilename

end get

set(byval value as string)

transfilename = value

end set

end property

缓存属性

public property tempsize() as integer

get

return tempsize

end get

set(byval value as integer)

me.transtempsize = value

end set

end property

端口属性

public property port() as integer

get

return port

end get

set(byval value as integer)

me.transport = value

end set

end property

服务器端服务名属性

public property serverclassname() as string

get

return serverclassname

end get

set(byval value as string)

me.transserverclassname = value

end set

end property

服务器端ip地址属性

public property serveripadr() as string

get

return serveripadr()

end get

set(byval value as string)

me.transserveripadr = value

end set

end property

枚举传输类型

enum trtype

tcp = 1

http = 2

end enum

传输类别属性

public property type() as trtype

get

return transtype

end get

set(byval value as trtype)

me.transtype = value

end set

end property

连接服务器

public sub connetserver()

try

select case transtype

case trtype.tcp

tsc = activator.getobject(gettype(nail.net.remoting.trans.itransfile), “tcp://” & transserveripadr & “:” & transport & “/” & transserverclassname)

case trtype.http

tsc = activator.getobject(gettype(nail.net.remoting.trans.itransfile), “http://” & transserveripadr & “:” & transport & “/” & transserverclassname)

end select

catch ex as exception

msgbox(ex.tostring)

end try

end sub

public function checkfileinfo(byval filename as string) as integer

dim crc as new nail.filetools.clscrc32

return crc.calcuatefile(filename)

end function

public sub sendfile()

showui()

timer1.interval = 10

timer1.start()

dim sendthead as new thread(addressof sendfiletoserver)

sendthead.start()

end sub

发送文件方法

private sub sendfiletoserver()

dim crc as integer = checkfileinfo(transfilename)

dim fif as new fileinfo(transfilename)

dim filesm as new filestream(transfilename, filemode.open, fileaccess.read, fileshare.read)

if filesm.length = 0 then

msgbox(“这是个空文件 请选择一个有效文件!”)

exit sub

end if

dim bty(transtempsize – 1) as byte

dim star as integer = 0

dim i as long

newtransform.maxofprogress = filesm.length 进度条总量

newtransform.filesize = fif.length / 1000 & “kbyte” 文件大小

newtransform.transfersfilename = fif.name 文件名

try

if (fif.length / transtempsize).tostring.indexof(“.”) > 0 then

if (fif.length / transtempsize).tostring.substring(0, 1) = “0” then

redim bty(fif.length – 1)

filesm.read(bty, 0, bty.length)

tsc.sendfile(fif.name, bty, crc)

with newtransform

.rateofprogress = bty.length 进度条当前值

.percentofprogress = “100%”  已完成的百分比

.leavetime = “完成”          剩余时间

.transed = bty.length & “byte”  已传输文件量

.rateoftransfers = math.floor(bty.length / senconds) & “kbyte/秒”  传输速度

end with

else

for i = math.floor(fif.length / transtempsize) to 1 step -1

filesm.read(bty, 0, bty.length)

tsc.sendfile(fif.name, bty, crc)

with newtransform

.rateofprogress = star

.percentofprogress = math.floor(newtransform.pgbtransfers.value / newtransform.pgbtransfers.maximum * 100) & “%”

if star > 0 then

.leavetime = timespan.fromseconds(math.floor((fif.length – star) / 1000 / math.floor(star / senconds))).tostring

end if

.transed = star / 1000 & “kbyte”

.rateoftransfers = math.floor(star / senconds) & “kbyte/秒”

end with

star += transtempsize

filesm.seek(star, seekorigin.begin)

next

redim bty((fif.length – (math.floor(fif.length / transtempsize)) * transtempsize) – 1)

filesm.read(bty, 0, bty.length)

tsc.sendfile(fif.name, bty, crc)

with newtransform

.rateofprogress = .pgbtransfers.maximum  进度条当前值

.percentofprogress = “100%”

.leavetime = “完成”

.transed = filesm.length / 1000 & “kbyte”

.rateoftransfers = math.floor(star / senconds) & “kbyte/秒”  传输速度

end with

end if

else

for i = math.floor(fif.length / transtempsize) to 1 step -1

filesm.read(bty, 0, bty.length)

tsc.sendfile(fif.name, bty, crc)

with newtransform

.rateofprogress = star

.percentofprogress = math.floor(newtransform.pgbtransfers.value / newtransform.pgbtransfers.maximum * 100) & “%”

.transed = star / 1000 & “kbyte”

if star > 0 then

.leavetime = timespan.fromseconds(math.floor((fif.length – star) / 1000 / math.floor(star / senconds))).tostring

end if

.rateoftransfers = math.floor(star / senconds) & “kbyte/秒”  传输速度

end with

star += transtempsize

filesm.seek(star, seekorigin.begin)

next

newtransform.leavetime = “完成”

end if

newtransform.btncancle.text = “确  定”

me.timer1.stop()

senconds = 10

newtransform.close()

msgbox(“传输完成”)

catch ex as exception

msgbox(ex.tostring)

end try

filesm.close()

end sub

接受文件方法

public function getfile(byval _filename as string) as integer

end function

记时

private sub timer1_tick(byval sender as object, byval e as system.eventargs) handles timer1.tick

senconds += 10

end sub

public function showui() as integer

newtransform = new frmtransfersui

newtransform.show()

return 0

end function

end class

end namespace

客户端窗体(显示文件传输的进度 时间 大小 。。。。。)

public class frmtransfersui

inherits system.windows.forms.form

#region ” windows 窗体设计器生成的代码 “

public sub new()

mybase.new()

该调用是 windows 窗体设计器所必需的。

initializecomponent()

在 initializecomponent() 调用之后添加任何初始化

end sub

窗体重写 dispose 以清理组件列表。

protected overloads overrides sub dispose(byval disposing as boolean)

if disposing then

if not (components is nothing) then

components.dispose()

end if

end if

mybase.dispose(disposing)

end sub

windows 窗体设计器所必需的

private components as system.componentmodel.icontainer

注意: 以下过程是 windows 窗体设计器所必需的

可以使用 windows 窗体设计器修改此过程。

不要使用代码编辑器修改它。

friend withevents button1 as system.windows.forms.button

friend withevents pgbtransfers as system.windows.forms.progressbar

friend withevents button2 as system.windows.forms.button

friend withevents lblrateoftransfers as system.windows.forms.label

friend withevents lbltransfersfilename as system.windows.forms.label

friend withevents btncancle as system.windows.forms.button

friend withevents lblfilesize as system.windows.forms.label

friend withevents lblleavetime as system.windows.forms.label

friend withevents lblpercentofprogress as system.windows.forms.label

friend withevents lbltransed as system.windows.forms.label

private sub initializecomponent()

me.button1 = new system.windows.forms.button

me.pgbtransfers = new system.windows.forms.progressbar

me.button2 = new system.windows.forms.button

me.lblrateoftransfers = new system.windows.forms.label

me.lbltransed = new system.windows.forms.label

me.lbltransfersfilename = new system.windows.forms.label

me.btncancle = new system.windows.forms.button

me.lblfilesize = new system.windows.forms.label

me.lblleavetime = new system.windows.forms.label

me.lblpercentofprogress = new system.windows.forms.label

me.suspendlayout()

button1

me.button1.dock = system.windows.forms.dockstyle.fill

me.button1.enabled = false

me.button1.flatstyle = system.windows.forms.flatstyle.system

me.button1.location = new system.drawing.point(0, 0)

me.button1.name = “button1”

me.button1.size = new system.drawing.size(448, 136)

me.button1.tabindex = 0

pgbtransfers

me.pgbtransfers.location = new system.drawing.point(10, 16)

me.pgbtransfers.name = “pgbtransfers”

me.pgbtransfers.size = new system.drawing.size(430, 12)

me.pgbtransfers.tabindex = 1

button2

me.button2.enabled = false

me.button2.flatstyle = system.windows.forms.flatstyle.system

me.button2.location = new system.drawing.point(4, 4)

me.button2.name = “button2”

me.button2.size = new system.drawing.size(442, 130)

me.button2.tabindex = 2

lblrateoftransfers

me.lblrateoftransfers.flatstyle = system.windows.forms.flatstyle.system

me.lblrateoftransfers.location = new system.drawing.point(10, 36)

me.lblrateoftransfers.name = “lblrateoftransfers”

me.lblrateoftransfers.size = new system.drawing.size(220, 14)

me.lblrateoftransfers.tabindex = 3

me.lblrateoftransfers.text = “传输速度:”

lbltransed

me.lbltransed.flatstyle = system.windows.forms.flatstyle.system

me.lbltransed.location = new system.drawing.point(10, 58)

me.lbltransed.name = “lbltransed”

me.lbltransed.size = new system.drawing.size(220, 14)

me.lbltransed.tabindex = 4

me.lbltransed.text = “已 传 送:”

lbltransfersfilename

me.lbltransfersfilename.flatstyle = system.windows.forms.flatstyle.system

me.lbltransfersfilename.location = new system.drawing.point(10, 80)

me.lbltransfersfilename.name = “lbltransfersfilename”

me.lbltransfersfilename.size = new system.drawing.size(220, 14)

me.lbltransfersfilename.tabindex = 5

me.lbltransfersfilename.text = “传输文件:”

btncancle

me.btncancle.flatstyle = system.windows.forms.flatstyle.system

me.btncancle.location = new system.drawing.point(192, 104)

me.btncancle.name = “btncancle”

me.btncancle.tabindex = 6

me.btncancle.text = “取  消”

lblfilesize

me.lblfilesize.flatstyle = system.windows.forms.flatstyle.system

me.lblfilesize.location = new system.drawing.point(246, 80)

me.lblfilesize.name = “lblfilesize”

me.lblfilesize.size = new system.drawing.size(192, 14)

me.lblfilesize.tabindex = 9

me.lblfilesize.text = “文件大小:”

lblleavetime

me.lblleavetime.flatstyle = system.windows.forms.flatstyle.system

me.lblleavetime.location = new system.drawing.point(246, 58)

me.lblleavetime.name = “lblleavetime”

me.lblleavetime.size = new system.drawing.size(192, 14)

me.lblleavetime.tabindex = 8

me.lblleavetime.text = “剩余时间:”

lblpercentofprogress

me.lblpercentofprogress.flatstyle = system.windows.forms.flatstyle.system

me.lblpercentofprogress.location = new system.drawing.point(246, 36)

me.lblpercentofprogress.name = “lblpercentofprogress”

me.lblpercentofprogress.size = new system.drawing.size(192, 14)

me.lblpercentofprogress.tabindex = 7

me.lblpercentofprogress.text = “传输进度:”

frmtransfersui

me.autoscalebasesize = new system.drawing.size(6, 14)

me.clientsize = new system.drawing.size(448, 136)

me.controls.add(me.lblfilesize)

me.controls.add(me.lblleavetime)

me.controls.add(me.lblpercentofprogress)

me.controls.add(me.btncancle)

me.controls.add(me.lbltransfersfilename)

me.controls.add(me.lbltransed)

me.controls.add(me.lblrateoftransfers)

me.controls.add(me.pgbtransfers)

me.controls.add(me.button2)

me.controls.add(me.button1)

me.formborderstyle = system.windows.forms.formborderstyle.none

me.name = “frmtransfersui”

me.showintaskbar = false

me.startposition = system.windows.forms.formstartposition.centerscreen

me.text = “frmtransfersui”

me.topmost = true

me.resumelayout(false)

end sub

#end region

public event usercancle()

public writeonly property maxofprogress()

set(byval value)

me.pgbtransfers.maximum = value

end set

end property

public writeonly property rateofprogress()

set(byval value)

me.pgbtransfers.value = value

end set

end property

public writeonly property rateoftransfers() as string

set(byval value as string)

me.lblrateoftransfers.text = “传输速度:” & value

end set

end property

public writeonly property transed() as string

set(byval value as string)

me.lbltransed.text = “已 传 送:” & value

end set

end property

public writeonly property transfersfilename() as string

set(byval value as string)

me.lbltransfersfilename.text = “传输文件:” & value

end set

end property

public writeonly property percentofprogress() as string

set(byval value as string)

me.lblpercentofprogress.text = “传输进度:” & value

end set

end property

public writeonly property leavetime() as string

set(byval value as string)

me.lblleavetime.text = “剩余时间:” & value

end set

end property

public writeonly property filesize() as string

set(byval value as string)

me.lblfilesize.text = “文件大小:” & value

end set

end property

private sub btncancle_click(byval sender as system.object, byval e as system.eventargs) handles btncancle.click

if me.btncancle.text = “确  定” then

me.close()

else

raiseevent usercancle()

end if

end sub

end class

服务器端类   下面还有个模块

imports system.runtime

imports system.runtime.remoting

imports system.runtime.remoting.channels

imports system.runtime.remoting.channels.tcp

imports system.io

namespace nail.net.remoting.server

public class filetransserver

private transserverclassname as string

private transtype as trtype

private transport as integer

private transcrc32 as integer

enum trtype

tcp = 1

http = 2

end enum

public property type() as trtype

get

return transtype

end get

set(byval value as trtype)

me.transtype = value

end set

end property

public property servertranssavefilepath() as string

get

return transsavefilepath

end get

set(byval value as string)

transsavefilepath = value

end set

end property

public property servertempfilepath() as string

get

return tempfilepath

end get

set(byval value as string)

tempfilepath = value

end set

end property

public property serverclassname() as string

get

return serverclassname

end get

set(byval value as string)

me.transserverclassname = value

end set

end property

public property port() as integer

get

return port

end get

set(byval value as integer)

me.transport = value

end set

end property

public sub starserver()

select case transtype

case trtype.tcp

dim a as new system.runtime.remoting.channels.tcp.tcpchannel(transport)

channelservices.registerchannel(a)

case trtype.http

dim a as new system.runtime.remoting.channels.http.httpchannel(transport)

channelservices.registerchannel(a)

end select

system.runtime.remoting.remotingconfiguration.applicationname = transserverclassname

remotingconfiguration.registerwellknownservicetype(gettype(transfile), transserverclassname, wellknownobjectmode.singlecall)

end sub

end class

public class transfile

inherits marshalbyrefobject

implements nail.net.remoting.trans.itransfile

public function comparefile(byval filename as string, byval clientcrc as integer) as boolean implements nail.net.remoting.trans.itransfile.comparefile

dim crc as new nail.filetools.clscrc32

if crc.calcuatefile(filename) = clientcrc then

return true

else

return false

end if

end function

public function getfiledet(byval filename as string) as integer implements nail.net.remoting.trans.itransfile.getfiledet

dim c as new fileinfo(filename)

return c.length

end function

public function getfileinfo(byval filename as string) as byte() implements nail.net.remoting.trans.itransfile.getfileinfo

dim fullname as string = filename

dim c as new fileinfo(fullname)

return getfileinfo(filename, 0, c.length)

end function

public function getfileinfo(byval filename as string, byval length as integer) as byte() implements nail.net.remoting.trans.itransfile.getfileinfo

return getfileinfo(filename, 0, length)

end function

public function getfileinfo(byval filename as string, byval point as integer, byval length as integer) as byte() implements nail.net.remoting.trans.itransfile.getfileinfo

dim fullname as string = filename

dim c as new fileinfo(fullname)

dim x as new filestream(fullname, filemode.open, fileaccess.read, fileshare.read)

dim bty(length – 1) as byte

x.seek(point, seekorigin.begin)

x.read(bty, 0, length)

return bty

end function

public function sendfile(byval filename as string, byval bytes() as byte, byval clientcrc as integer) as integer implements nail.net.remoting.trans.itransfile.sendfile

try

dim a as new filestream(tempfilepath & filename, filemode.openorcreate)

a.seek(a.length, seekorigin.begin)

a.write(bytes, 0, bytes.length)

a.close()

return 0

catch ex as exception

msgbox(ex.tostring)

return 1

finally

dim finf as new fileinfo(tempfilepath & filename)

if comparefile(tempfilepath & filename, clientcrc) = true then

拷贝临时文件()

file.copy(tempfilepath & filename, transsavefilepath & filename, true)

else

删除临时文件()

finf.delete()

end if

end try

end function

public property servertempfilepath() as string implements nail.net.remoting.trans.itransfile.servertempfilepath

get

return tempfilepath

end get

set(byval value as string)

tempfilepath = value

end set

end property

public property servertranssavefilepath() as string implements nail.net.remoting.trans.itransfile.servertranssavefilepath

get

return transsavefilepath

end get

set(byval value as string)

transsavefilepath = value

end set

end property

end class

end namespace

模块:

module server

public transsavefilepath as string

public tempfilepath as string

end module

使用方法:

服务器端

示例:

dim server as new nail.net.remoting.server.filetransserver

server.serverclassname = “aaa”

server.port = 10001

server.type = nail.net.remoting.server.filetransserver.trtype.http

server.servertempfilepath = “f:\”

server.servertranssavefilepath = “e:\”

server.starserver()

客户端

cl.port = 10001

cl.serverclassname = “aaa”

cl.tempsize = 102400

cl.serveripadr = “localhost”

cl.fullfilename = “c:\111.rar”

cl.type = nail.net.remoting.client.filetransclient.trtype.http

cl.connetserver()

发送文件:

cl.sendfile()

最后忘记贴文件校对了 照书上搞的crc32

imports system.io

namespace nail.filetools

public class clscrc32

private const tablesize as integer = 256

private const defaultpolynomial as integer = &hedb88320

private const defaultialvalue as integer = &hffffffff

private lookup(tablesize – 1) as integer

private crcpolynomial as integer = 0

public sub new()

me.new(defaultpolynomial)

end sub

public sub new(byval crcpolynomial as integer)

me.crcpolynomial = crcpolynomial

initlookuptable()

end sub

public property polynomial() as integer

get

return crcpolynomial

end get

set(byval value as integer)

me.crcpolynomial = value

initlookuptable()

end set

end property

public overloads function calculateblock(byval bytes() as byte) as integer

return calculateblock(bytes, 0, bytes.length)

end function

public overloads function calculateblock(byval bytes() as byte, byval index as integer, byval length as integer) as integer

return calculateblock(bytes, index, length, defaultialvalue)

end function

public overloads function calculateblock(byval bytes() as byte, byval index as integer, byval length as integer, byval initialvalue as integer) as integer

if bytes is nothing then

elseif index < 0 or length <= 0 or index + length > bytes.length then

end if

return not internalcalculateblock(bytes, index, length, initialvalue)

end function

private function internalcalculateblock(byval bytes() as byte, byval index as integer, byval length as integer, byval initialvalue as integer) as integer

dim crc as integer = initialvalue

dim shiftcrc as integer

dim position as integer

for position = index to length – 1

shiftcrc = crc and &hffffff00

shiftcrc = shiftcrc / &h100

shiftcrc = shiftcrc and &hffffff

crc = shiftcrc xor lookup(bytes(position)) xor (crc and &hff)

next

return crc

end function

public overloads function calcuatefile(byval path as string) as integer

return calcuatefile(path, defaultialvalue)

end function

public overloads function calcuatefile(byval path as string, byval initialvalue as integer) as integer

if path is nothing then

elseif path.length = 0 then

end if

return not internalcalculatefile(path, initialvalue)

end function

private function internalcalculatefile(byval path as string, byval initialvalue as integer) as integer

const blocksize as integer = 4096

dim count as integer

dim instream as system.io.filestream

dim bytes(blocksize – 1) as byte

dim crc as integer = initialvalue

try

instream = system.io.file.open(path, filemode.open, fileaccess.read)

while instream.position < instream.length

count = instream.read(bytes, 0, blocksize)

crc = internalcalculateblock(bytes, 0, count, crc)

end while

finally

if not instream is nothing then

instream.close()

end if

end try

return crc

end function

private sub initlookuptable()

dim bytecount, bitcount as integer

dim crc, shiftcrc as integer

for bytecount = 0 to tablesize – 1

crc = bytecount

for bitcount = 0 to 7

shiftcrc = crc and &hfffffffe

shiftcrc = shiftcrc \ &h2

shiftcrc = shiftcrc and &h7fffffff

if (crc and &h1) then

crc = shiftcrc xor crcpolynomial

else

crc = shiftcrc

end if

next

lookup(bytecount) = crc

next

end sub

end class

end namespace

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值