æºä»£ç å·²¾lä¸Šä¼ äº†ã€?br />
½W?/span>3ç«?nbsp; 设计文档
3åQ?/span>1 ä»ÕdŠ¡æ¦‚è¿°
本项ä»ÕdŠ¡è¦å¼€å‘一‹Æ?/span>P2Pæ–‡äšgä¼ è¾“è½¯äšgåQŒè¯¥è½¯äšgå¯ä»¥åœ¨å±€åŸŸç½‘和互˜qžä¸Šä½¿ç”¨åQŒå…·æœ‰æ–‡ä»¶ä¼ 输,æ–点¾lä¼ åQŒå¤š¾U¿ç¨‹˜qžæŽ¥½{‰åŠŸèƒ½ã€?/span>
3åQ?/span>1åQ?/span>1 å¼€å‘背æ™?/span>
éšç€¾|‘络的普å?qi¨¢ng),在网¾lœä¸äº¤æ¢ä¿¡æ¯åQŒç‰¹åˆ«æ˜¯æ–‡äšgæˆäØ“(f¨´)使用¾|‘络时ç»å¸¸æ€§å·¥ä½œï¼ŒçŽ°æœ‰çš„æ–‡ä»¶ä¼ è¾“å·¥å…·å¦‚QQã€?/span>MSN½{‰ï¼Œä¸»è¦åŠŸèƒ½æ˜¯ä½œä¸ºå³æ—‰™€šè®¯å·¥å…·ä½¿ç”¨åQŒè€Œä¸”在局域网ä¸ä‹É用时ä»éœ€˜qžæŽ¥åˆîCº’˜qžç½‘。本文开å‘的软äšgåŸÞZºŽP2P¾l“构实现文äšgä¼ è¾“åQŒä¸ä¾é æœåŠ¡å™¨ç»´æŠ¤ç”¨æˆ¯‚µ„料,所以,åªè¦ä¸¤å°æœºå™¨å¯ä»¥˜qžé€šï¼Œž®±å¯ä»¥è¿›è¡Œæ–‡ä»¶ä¼ 输ã€?/span>
3åQ?/span>1åQ?/span>2 定义
P2PåQšå³peer-to-peeråQŒå¯ä»¥ç†è§£äØ“(f¨´)点对点,或对½{‰ä¼ è¾“çš„æ„æ€ã€?/span>
3åQ?/span>1åQ?/span>3 å¼€å‘å·¥å…?/span>
å¼€å‘采ç”?/span>JAVAè¯è¨€åQŒå¼€å‘工具䨓(f¨´)jbuilder 2005
3åQ?/span>2 æ–‡äšgä¼ è¾“ä¸šåŠ¡‹¹ç¨‹
3åQ?/span>2åQ?/span>1 通讯™åºåºå…³ç³»
åœ¨æ–‡ä»¶ä¼ è¾“æ—¶åQŒä¼ 输过½E‹å¯ä»¥ç®€å•çš„åˆ†äØ“(f¨´)4æ¥ï¼Œå¦‚图 åQ?/span>
1ã€?span style="font: 7pt 'Times New Roman'"> 由文件å‘é€è€…å‘èµäh–‡ä»¶ä¼ 输,他首先å‘逿–‡ä»¶ååQŒæ–‡ä»¶å¤§ž®ï¼ŒéªŒè¯æ¶ˆæ¯½{‰ä¿¡æ¯ç»™æ–‡äšg接收者ã€?/span>
2ã€?span style="font: 7pt 'Times New Roman'"> æ–‡äšg接收者收到文件信æ¯å’Œå‘é€è€…ä¿¡æ¯ï¼Œå†›_®šæ˜¯å¦æŽ¥æ”¶åQŒå¦‚䏿ޥæ”Óž¼Œåˆ™å‘逿‹’¾l接收消æ¯ç»™æ–‡äšgå‘é€è€…,文äšgä¼ è¾“¾l“æŸã€‚å¦‚åŒæ„接收åQŒå‘é€åŒæ„接收消æ¯å’Œæ–‡äšgä¼ è¾“èµ·å§‹å—节åQˆç”¨äºŽæ–ç‚¹ç®‹ä¼ ï¼‰¾l™å‘é€è€…ã€?/span>
3ã€?span style="font: 7pt 'Times New Roman'"> å‘é€è€…开始å‘逿–‡ä»¶æ•°æ®åŒ…åQŒç›´åˆ°æœ€åŽä¸€ä¸ªæ–‡ä»¶æ•°æ®åŒ…åQŒå‘é€è€…在最åŽä¸€ä¸ªæ–‡ä»¶æ•°æ®åŒ…ä¸ŠåŠ ä¸Šæ ‡è®°ã€?/span>
4ã€?span style="font: 7pt 'Times New Roman'"> 接收者识别最åŽä¸€ä¸ªæ–‡ä»¶æ•°æ®åŒ…åQŒæ–‡ä»¶ä¼ 输æˆåŠŸã€?/span>
3åQ?/span>2åQ?/span>2 æ–‡äšgå‘é€ç«¯çš„详¾l†ä¸šåŠ¡æµ½E?/span>
图䏿˜„¡¤ºäº†å‘逿–‡ä»¶æ—¶çš„详¾l†ä¸šåŠ¡æµ½E‹ã€?/span>
1ã€é¦–先,è¦é€‰æ‹©è¦å‘é€çš„æ–‡äšgåQŒå¯ä»¥é€‰æ‹©ä¸€ä¸ªæ–‡ä»¶æˆ–åŒä¸€ä¸ªæ–‡ä»¶å¤¹ä¸‹çš„多个文äšgå‘é€ï¼Œå½“选择多个文äšgæ—Óž¼Œè½¯äšgž®†äØ“(f¨´)æ¯ä¸ªæ–‡äšgå»ºç«‹ä¸€ä¸ªä¼ è¾“çº¿½E‹ã€‚选择文äšgåŽï¼Œå‘é€è€…è¦å¡«å†™ç›®æ ‡IP和端å£ï¼Œç”׃ºŽæ˜¯åŸºäº?/span>P2Pçš„æ–‡ä»¶ä¼ è¾“ï¼Œä¸å˜åœ¨æœåС噍¾l´æŠ¤å¥½å‹åˆ—表åQŒæ‰€ä»¥éœ€è¦çŸ¥é“ç›®æ ?/span>IPæ‰èƒ½ä¼ 输文äšgåQŒç”¨æˆ·ä¹Ÿå¯ä»¥å¡«å†™éªŒè¯æ¶ˆæ¯ç”¨äºŽæè¿°è‡ªå·±çš„èín份和文äšg的介¾lã€?/span>
2ã€å‘é€è€…收到确认包åQŒåˆ¤æ–æ˜¯å¦æŽ¥æ”¶æ–‡ä»Óž¼Œå¦‚æžœä¸æŽ¥æ”Óž¼Œåˆ™ä¼ 输结æŸï¼Œå¦‚果接收åQŒåˆ™æ‰“å¼€è¦å‘é€çš„æ–‡äšgåQŒè®¾¾|®è“vå§‹ä¼ è¾“å—节ã€?/span>
3ã€å‘é€è€…读å–一个文件片ŒDµï¼ŒåŠ å…¥æ˜¯å¦æ˜¯æœ€åŽä¸€ä¸ªæ–‡ä»¶ç‰‡ŒD늚„æ ‡å¿—åQŒæ‰“包呾l™æŽ¥æ”¶è€…ã€?/span>
4ã€å‘é€å®Œæœ€åŽä¸€ä¸ªæ–‡ä»¶ç‰‡ŒD‰|—¶åQŒæ–‡ä»¶ä¼ 输结æŸã€?/span>
3åQ?/span>2åQ?/span>3 æ–‡äšg接收者详¾l†ä¸šåŠ¡æµ½E?/span>
1ã€?nbsp;从一打开软äšg开始,监嬾U¿ç¨‹ž®×ƒ¼š(x¨¬)å¯åЍåQŒè¿™æ—¶ç”¨æˆ·å°±æ‰®æ¼”者文件接收者的角色åQŒå½“有文件å‘é€è€…呿¥è¯·æ±‚æ—¶åQŒç›‘å¬çº¿½E‹å¾ç«‹ä¸Žå‘é€è€…çš„˜qžæŽ¥åQŒåƈ创å¾ä¼ 输¾U¿ç¨‹åQŒæŽ¥æ”¶è€…得到å‘é€è€…ä¼ æ¥çš„æ–‡äšgä¿¡æ¯å’ŒéªŒè¯æ¶ˆæ¯ï¼Œç”¨æˆ·˜q˜èƒ½å¾—到å‘é€è€…çš„IP地å€åQŒç”¨æˆäh ¹æ®è¿™äº›ä¿¡æ¯å†³å®šæ˜¯å¦æŽ¥æ”¶æ–‡ä»Óž¼Œòq¶å‘é€ç¡®è®¤åŒ…¾l™å‘é€è€…,¼‹®è®¤åŒ…里包å«äº†æ˜¯å¦æŽ¥æ”¶çš„æ ‡å¿—åQŒå’Œå¼€å§‹ä¼ 输的起始å—节ã€?/span>
2ã€?nbsp;接收者开始接收数æ®åŒ…åQŒè§£åŒ…,写入文äšgä¸ï¼Œç›´åˆ°æœ€åŽä¸€ä¸ªæ–‡ä»¶ç‰‡ŒDµï¼Œå…³é—æ–‡äšgåQŒæ–‡ä»¶ä¼ 输结æŸã€?/span>
3åQ?/span>3 软äšgçš„ä¼ è¾“å议设è®?/span>
ä¸ÞZº†æ›´å¥½çš„æŽ§åˆ¶æ–‡ä»¶ä¼ 输的‹¹ç¨‹åQŒå¼€å‘设计了文äšgä¼ è¾“åè®®åQŒè¯¥å议属于应用层å议,ä¸ÞZº†ä¸ä‹Éä¼ è¾“˜q‡ç¨‹˜q‡äºŽå¤æ‚åQŒå议尽é‡ç®€å•设计。主è¦çš„å†…å®¹æ˜¯ä¼ è¾“åŒ…çš„æ ¼å¼ã€?/span>
3åQ?/span>3åQ?/span>1 ä¼ è¾“åŒ…çš„æ ¼å¼
å…¶ä¸ä¼ 输包的¾cÕdž‹æœ?/span>3¿U:(x¨¬)
PACKAGE_TYPE_FILENAME = 0x01
æ–‡äšgå包åQŒè¯¥åŒ…用于文件å‘é€è€…å‘æŽ¥æ”¶è€…å‘逿–‡ä»¶ä¿¡æ¯å’ŒéªŒè¯æ¶ˆæ¯
PACKAGE_TYPE_CONTEXT = 0x02
æ–‡äšgå†…å®¹åŒ…ï¼Œè¯¥åŒ…ç”¨äºŽä¼ è¾“æ–‡äšg内容
PACKAGE_TYPE_CONFIRMRECEIVE = 0x03
æ–‡äšgä¼ è¾“¼‹®è®¤åŒ…,该包用于文äšg接收者å‘å‘é€è€…确认文件的接收
3åQ?/span>3åQ?/span>2 æ–‡äšgååŒ…æ ¼å¼
3åQ?/span>3åQ?/span>3 æ–‡äšgä¼ è¾“åŒ…æ ¼å¼?br />
å…¶ä¸MORE_DATA用于¼‹®è®¤æ˜¯å¦æ˜¯æ–‡ä»¶ç‰‡ŒD늚„最åŽä¸€ä¸ªåŒ…åQŒä»¥¾l“æŸæ–‡äšgçš„ä¼ è¾“ã€?/span>0表示没有数æ®åQ?/span>1表示˜q˜æœ‰æ•°æ®ã€?/span>
3åQ?nbsp;3åQ?/span>4 æ–‡äšg接嗼‹®è®¤åŒ…æ ¼å¼?/span>
å…¶ä¸CONFIRM_FLAG表示是妼‹®è®¤æ–‡äšg接收åQ?/span>1表示接收åQ?/span>0è¡¨ç¤ºä¸æŽ¥æ”Óž¼Œå½“接收时åQ?/span>OFF表示文äšgä¼ è¾“çš„è“vå§‹å—节,用æ¥å®žçްæ–点¾lä¼ ã€?/span>
3åQ? æ–‡äšgä¼ è¾“çš„çŠ¶æ€æœº
æ–‡äšgä¼ è¾“¾U¿ç¨‹çš„地层其实就是一个状æ€è{æ¢æœºåQŒçº¿½E‹å…·æœ‰å‡ 个状æ€ï¼Œ¾U¿ç¨‹ä»Žæ–‡ä»¶åä¼ è¾“çŠ¶æ€å¼€å§‹ï¼Œæ ÒŽ(gu¨©)®æ–‡äšgä¼ è¾“çš„ä¸åŒæƒ…况,在å„个状æ€é—´è½¬æ¢åQŒç›´åˆîC¼ 输æˆåŠŸæˆ–ä¼ è¾“å¤ÞpÓ|ã€?/span>
FILE_TRANS_STATUS_FILENAME = 0x01
æ–‡äšgåç§°ä¼ è¾“çŠ¶æ€ï¼Œæ–‡äšgä¼ è¾“åˆšå¾ç«‹è¿žæŽ¥æ—¶åQŒä¼ 输状æ€å¤„于文件åä¼ è¾“çŠ¶æ€?/span>
FILE_TRANS_STATUS_CONTEXT = 0x02
æ–‡äšgå†…å®¹ä¼ è¾“è½¬å°åQŒåœ¨ä¼ 输文äšg内容æ—Óž¼Œä¼ 输状æ€å±žäºŽè¯¥çжæ€?/span>
FILE_TRANS_STATUS_WAITFORCONFIRM = 0x03
½{‰å¾…¼‹®è®¤çжæ€ï¼Œæ–‡äšgå‘é€è€…,å‘é€å®Œæ–‡äšgä¿¡æ¯å’ŒéªŒè¯æ¶ˆæ¯åŽåQŒå¤„于该状æ€ï¼Œæ–‡äšg接收者接收到文äšgä¿¡æ¯å’ŒéªŒè¯æ¶ˆæ¯åŽå¤„于该状æ€?/span>
FILE_TRANS_STATUS_SUCCESS = 0x04
æ–‡äšgä¼ è¾“æˆåŠŸçŠ¶æ€ï¼Œè¡¨ç¤ºæ–‡äšgå·²æˆåŠŸä¼ è¾“å®Œæ¯?/span>
FILE_TRANS_STATUS_FAIL = 0x05
æ–‡äšgä¼ è¾“å¤ÞpÓ|状æ€ï¼Œè¡¨ç¤ºæ–‡äšgä¼ è¾“å·²ç»å¤ÞpÓ|åQŒå¤±è´¥åŽŸå› å¯èƒ½æ˜¯å¯ÒŽ(gu¨©)–¹å–æ¶ˆäº†æ–‡ä»¶ä¼ è¾“æˆ–¾|‘络错误
3åQ? ¾l“构设计
软äšg主è¦ç”?/span>MainFrame,TransFileManager,SocketThread,Server,TransFilePanel五个¾cÀLž„æˆå›¾ è¡¨ç¤ºäº†è¿™å‡ ä¸ª¾cÖM¹‹é—´çš„关系ã€?/span>
¾cÕdŠŸèƒ½ä»‹¾l?/span>
MainFrame
MainFrame¾cÀL˜¯è½¯äšg的主界颾c»ï¼Œè´Ÿè´£ä¸Žç”¨æˆïL(f¨¥ng)š„交互ã€?/span>
TransFileManager
TransFileManager¾cÀL˜¯æ–‡äšgä¼ è¾“çš„æŽ§åˆ¶ç±»åQŒè´Ÿè´£ç®¡ç†æ–‡ä»¶çš„ä¼ è¾“åQŒå®ƒ¾l´æŠ¤ä¸€ä¸ªä¼ 输线½E‹ï¼ˆSocketThreadåQ‰çš„列表åQŒæ¯ä¸ªçº¿½E‹éƒ½è¡¨ç¤ºä¸€ä¸ªæ£åœ¨ä¼ 输的ä»ÕdŠ¡ã€?/span>TransFileManager¾cÕd®šæ—¶çš„æ‰«æå„个¾U¿ç¨‹çš„状æ€ï¼Œæ ÒŽ(gu¨©)®ä¸åŒçжæ€åšå‡ÞZ¸åŒå¤„ç†ï¼Œå¦‚计½Ž—ä¼ è¾“é€Ÿåº¦åQŒæ˜¾½CÞZ¼ 输进度ç‰ã€?/span>
SocketThread
SocketThread¾cÀL˜¯æ–‡äšgä¼ è¾“¾U¿ç¨‹¾c»ï¼Œå®ƒè´Ÿè´£åº•å±‚çš„å…·ä½“ä¼ è¾“å·¥ä½œåQŒåŒ…括打包与解包åQŒåƈ且è{æ¢è‡ªå·Þqš„状æ€ï¼Œå®Œæˆæ–‡äšgçš„ä¼ è¾“ã€?/span>
Server
Server¾cÀL˜¯ä¸?/span>TransFileManager¾cÖM‹É用的åQŒå®ƒè´Ÿè´£æœ¬åœ°ç«¯å£çš„监å¬ï¼Œä¸€æ—¦æœ‰ç”¨æˆ·˜qžæŽ¥åQ?/span>TransFileManagerž®±åˆ›å»ÞZ¸€ä¸ªä¼ 输线½E‹ï¼Œæ”‘Ö…¥¾U¿ç¨‹åˆ—表。而它¾l§ç®‹ç›‘å¬ç«¯å£ã€?/span>
TransFilePanel
TransFilePanelæ˜¯ä¸€ä¸ªé¢æ¿ï¼Œå®ƒç”¨æœ‰æŒ‰é’®ã€è¿›åº¦æ¡åQŒæ ‡½{„¡‰ç”¨æ¥æ˜„¡¤ºæ–‡äšgçš„ä¼ è¾“çŠ¶æ€ã€?/span>
3åQ? ¾c»è®¾è®?/span>
3åQ?/span>6åQ?/span>1 MainFrame
该类是视囄¡±»åQŒæ˜¯è½¯äšg的主界é¢ã€?br />
æˆå‘˜å˜é‡åQ?/span>
contentPane
contentPaneæ˜?/span>JPanel¾cÈš„对象åQŒæ˜¯ä¸È•Œé¢çš„颿¿ã€?/span>
jbtnSend
jbtnSendæ˜?/span>JButton¾cÕd¯¹è±¡ï¼Œç‚¹å‡»å®ƒå°†æ‰“开文äšgä¼ è¾“å¯¹è¯æ¡†ã€?/span>
jbtnSetting
jbtnSettingæ˜?/span>JButton¾cÕd¯¹è±¡ï¼Œç‚¹å‡»å®ƒå°†æ‰“开讄¡½®å¯¹è¯æ¡†ã€?/span>
jlblIP
jlblIPæ˜?/span>JLable¾cÕd¯¹è±¡ï¼Œå®ƒæ˜¾½Cºæœ¬æœºçš„IP地å€åQŒæ–¹ä¾¿æ–‡ä»¶çš„ä¼ è¾“ã€?/span>
jtpTransFile
jtpTransFileæ˜?/span>JTabbedPane¾cÕd¯¹è±¡ï¼Œæ˜¯é€‰é¡¹å¡æŽ§ä»Óž¼Œç”¨äºŽæ˜„¡¤ºå¤šä¸ªæ–‡äšgåŒæ—¶ä¼ 输ã€?/span>
tfm
tfmæ˜?/span>TransFileManager¾cÕd¯¹è±¡ï¼Œè´Ÿè´£æŽ§åˆ¶æ–‡äšgçš„ä¼ è¾“ã€?/span>
æˆå‘˜æ–ÒŽ(gu¨©)³•åQ?/span>
jbtnSend_anctionPerformed()
è¯¥æ–¹æ³•äØ“(f¨´)jbtnSend按钮的点å‡ÖMº‹ä»?/span>
jbtnSetting_actionPerformed()
è¯¥æ–¹æ³•äØ“(f¨´)jbtnSetting按钮的点å‡ÖMº‹ä»?/span>
This_windowClosed()
è¯¥æ–¹æ³•äØ“(f¨´)½H—å£å…³é—事äšg
ç•Œé¢æˆªå›¾åQ?/span>
3åQ?/span>6åQ?/span>2 TransFileManager¾c?/span>
è¯¥ç±»è´Ÿè´£ä¼ è¾“˜q‡ç¨‹ä¸å¯¹å„ä¸ªä¼ è¾“¾U¿ç¨‹çš„æ£€‹¹‹ä¸ŽæŽ§åˆ¶ã€?/span>
æˆå‘˜å˜é‡åQ?/span>
jtp
jtpæ˜¯é€‰é¡¹å¡æŽ§ä»¶å¯¹è±¡ï¼Œæ˜?/span>MainFrame¾cÖM¸jtpTransFile对象的一个引用ã€?/span>
panelist
paneListæ˜?/span>ArrayList¾cÕd¯¹è±¡ï¼Œå®ƒæ˜¯ä¸€ä¸ªé“¾è¡¨ç»“构,å˜å‚¨ä½¿ç”¨çš„选项å¡ã€?/span>
running
running是一ä¸?/span>boolean型的对象åQŒç”¨æ¥è¡¨½Cºçº¿½E‹æ˜¯å¦åœ¨æ‰§è¡Œã€?/span>
s
sæ˜?/span>Server¾cÈš„对象åQŒç”¨æ¥åšå¬æœ¬åœ°ç«¯å£ï¼Œ½{‰å¾…用户的连接ã€?/span>
threadList
threadListæ˜?/span>ArrayList¾cÕd¯¹è±¡ï¼Œå®ƒæ˜¯ä¸€ä¸ªé“¾è¡¨ç»“构,å˜å‚¨ä½¿ç”¨çš„ä¼ è¾“çº¿½E‹ã€?/span>
maxThreadNum
maxTreadNum是整型å˜é‡ï¼Œè¡¨ç¤ºæœ€å¤§å…许的¾U¿ç¨‹æ•°ã€?/span>
port
port是整型å˜é‡ï¼Œè¡¨ç¤ºä½¿ç”¨çš„端å£å·ã€?/span>
æˆå‘˜æ–ÒŽ(gu¨©)³•åQ?/span>
close()
è¯¥æ–¹æ³•ç”¨äºŽå…³é—æ–‡ä»¶ä¼ 输的控制ã€?/span>
sendFile()
该方法用于å¾ç«‹ä¸€ä¸ªæ–‡ä»¶å‘é€ï¼Œè¦æ±‚è¾“å…¥å‚æ•°ä¸ºï¼Œç›®æ ‡IPåQŒç«¯å£å·åQŒè¦å‘é€çš„æ–‡äšgå’ŒéªŒè¯æ¶ˆæ¯ã€?/span>
3åQ?åQ? SocketThread¾c?/span>
SocketThread¾cÀL˜¯æ–‡äšgä¼ è¾“çš„åº•å±‚æ”¯æŒç±»åQŒå®ƒæä¾›æ–‡äšgä¼ è¾“çš„æœåŠ¡ã€?/span>
æˆå‘˜å˜é‡åQ?/span>
sendBuf
sendBuf是一个å—节型数æ®åQŒå®ƒæ˜¯æ–‡ä»¶å‘é€å’ŒæŽ¥æ”¶æ—¶çš„¾~“冲区ã€?/span>
dis
disæ˜?/span>DataInputStream型对象,它是ç”?/span>Socket对象得到的输入æµã€?/span>
dos
dosæ˜?/span>DataOutputStream型对象,它是ç”?/span>Socket对象得到的输出æµã€?/span>
fDis
fDisæ˜?/span>DataInputStream型对象,它是è¦å‘é€çš„æ–‡äšg的输入æµã€?/span>
raf
rafæ˜?/span>RandomAccessFile型对象,该对象å…许设¾|®è¾“出æµçš„ä½¾|®ï¼Œä»¥æ”¯æŒæ–ç‚¹ç®‹ä¼ ã€?/span>
running
running是一ä¸?/span>boolean型对象,用æ¥è¡¨ç¤º¾U¿ç¨‹æ˜¯å¦åœ¨æ‰§è¡Œã€?/span>
serverName
serverName是嗽W¦ä¸²åž‹å¯¹è±¡ï¼Œè¡¨ç¤ºæœåŠ¡å™¨çš„åœ°å€åQŒè¯¥å¯¹è±¡åªæœ‰åœ¨çº¿½E‹ä½œä¸ºå‘é€è€…时使用ã€?/span>
errorMessage
errorMessage是嗽W¦ä¸²åž‹å¯¹è±¡ï¼Œè¡¨ç¤ºå‡ºé”™çš„ä¿¡æ¯ã€?/span>
fileName
fileName是嗽W¦ä¸²åž‹å¯¹è±¡ï¼Œè¡¨ç¤ºæ–‡äšgåã€?/span>
fileSender
fileSender是一ä¸?/span>boolean型对象,表示是文件å‘é€è€…还是文件接收者ã€?/span>
IP
IP是嗽W¦ä¸²åž‹å¯¹è±¡ï¼Œç”¨æ¥å˜æ”¾ç›®çš„æœºçš„IP地å€ã€?/span>
message
message是嗽W¦ä¸²åž‹å¯¹è±¡ï¼Œç”¨æ¥è¡¨ç¤ºéªŒè¯ä¿¡æ¯ã€?/span>
port
port是整型å˜é‡ï¼Œè¡¨ç¤º˜qžæŽ¥çš„端å£å·ã€?/span>
transFileLength
transFileLength是长整型å˜é‡åQŒè¡¨½Cºå·²¾lä¼ è¾“çš„æ–‡äšg长度åQ?/span>TransFileManagerå¯ä»¥ç”¨å®ƒæ¥è®¡½Ž—ä¼ è¾“è¿›åº¦å’Œä¼ è¾“é€Ÿåº¦
æˆå‘˜æ–ÒŽ(gu¨©)³•åQ?/span>
cancelTrans()
è¯¥æ–¹æ³•ç”¨äºŽå–æ¶ˆä¼ è¾?/span>
confirmReceiveFile()
è¯¥æ–¹æ³•ç”¨äºŽç¡®è®¤ä¼ è¾“æ–‡ä»?/span>
傿•°flag用æ¥è¡¨ç¤ºæ˜¯å¦åŒæ„ä¼ è¾“
傿•°fileName用æ¥è¡¨ç¤ºä¿å˜çš„æ–‡ä»?/span>
傿•°off用æ¥è¡¨ç¤ºèµ·å§‹ä¼ 输å—节
getFileTransMessage()
è¯¥æ–¹æ³•ç”¨äºŽå¾—åˆ°æ–‡ä»¶ä¼ è¾“çš„åŸºæœ¬ä¿¡æ¯ã€‚如åQ𿖇件å‘é€çš„ç›®æ ‡åQŒç«¯å£å·½{‰ã€?/span>
getStatus()
该方法返回一个整型å˜é‡ï¼Œè¡¨ç¤ºå½“剾U¿ç¨‹çš„ä¼ è¾“çŠ¶æ€ã€?/span>
run()
¾U¿ç¨‹çš„æ‰§è¡Œæ–¹æ³•,该方法ä¸å¾ªçŽ¯æ‰§è¡Œå‘逿ˆ–接收æ–ÒŽ(gu¨©)³•åQŒå®Œæˆæ–‡ä»¶çš„å‘逿ˆ–接收ã€?/span>
setError()
该方法通过一个嗽W¦ä¸²åž‹çš„傿•°è®„¡½®é”™è¯¯ä¿¡æ¯ã€?/span>
stopThread()
è¯¥æ–¹æ³•ç”¨äºŽåœæ¢çº¿½E‹çš„æ‰§è¡Œã€?/span>
doPackage()
打包æ–ÒŽ(gu¨©)³•åQŒè¯¥æ–ÒŽ(gu¨©)³•ä¸ï¼Œæ ÒŽ(gu¨©)®¾U¿ç¨‹æ‰€å¤„çš„ä¸åŒçжæ€ï¼Œå¯ÒŽ(gu¨©)•°æ®åŠ å…¥ä¸åŒçš„包头和其他信æ¯ï¼Œ˜q›è¡Œæ‰“包ã€?/span>
readFromFile()
该方法从è¦å‘é€çš„æ–‡äšgä¸è¯»å–一个整型数ã€?/span>
readFromSocket()
该方法从Socket输入‹¹è¯»å–一个整型数åQŒå®ƒæœ‰ä¸€ä¸ªé‡è½½ç‰ˆæœ¬è¯»å–一个å—节数¾l„的数æ®ã€?/span>
receiveFile()
è¯¥æ–¹æ³•äØ“(f¨´)接收文äšg的方法,是线½E‹åó@环ä¸åQŒæ–‡ä»¶æŽ¥æ”¶è€…执行的æ–ÒŽ(gu¨©)³•ã€?/span>
sendFile()
è¯¥æ–¹æ³•äØ“(f¨´)å‘逿–‡ä»¶æ–¹æ³•,是线½E‹åó@环ä¸åQŒæ–‡ä»¶å‘é€è€…执行的æ–ÒŽ(gu¨©)³•ã€?/span>
writeToFile()
该方法写一个å—节数æ®çš„æ•°æ®åˆîC¿å˜çš„æ–‡äšgä¸ã€?/span>
writeToSocket()
该方法写数æ®åˆ?/span>Socket输出‹¹ä¸åQŒå®ƒæœ‰ä¸‰ä¸ªé‡è½½ç‰ˆæœ¬ï¼Œåˆ†åˆ«æ˜¯å†™å…¥æ•´åž‹æ•°åQŒå†™å…¥é•¿æ•´åž‹æ•°å’Œå†™å…¥å—节数组数æ®ã€?/span>
3åQ?åQ? TransFilePanel¾c?/span>
˜q™ä¸ª¾cÕd±žäºŽè§†å›„¡±»åQŒå®ƒä½œäØ“(f¨´)ä¸È•Œé¢ä¸Šçš„一个对象ä‹Éç”¨ï¼Œå«æœ‰˜q›åº¦æ¡ï¼ŒæŒ‰é’®åQŒæ ‡½{„¡š„对象åQŒç”¨äºŽæ˜¾½Cºæ–‡ä»¶ä¼ 输状æ€ï¼Œæ¯ä¸€ä¸ªä¼ 输线½E‹éƒ½æ‹¥æœ‰è‡ªå·±çš?/span>TransFilePanel¾cÕd¯¹è±¡ã€?/span>
æˆå‘˜å˜é‡åQ?/span>
fileName
fileName是一个嗽W¦ä¸²åQŒè¡¨½CÞZ¼ 输文件的文äšgåã€?/span>
fileSender
fileSenderæ˜?/span>boolean型对象,表示是文件å‘é€è€…还是接收者ã€?/span>
isCanneled
isCanneledæ˜?/span>booleanåž‹å¯¹è±¡ï¼Œä¼ è¾“˜q‡ç¨‹ä¸ï¼Œç”¨æˆ·ç‚¹äº†å–消按钮åŽï¼Œè¯¥æ ‡å¿—ä½¾|?/span>trueåQ?/span>TransFileManagerä¼?x¨¬)åó@环检‹¹?/span>isCanneledæ ‡å¿—åQŒå½“å‘çŽ°å…¶äØ“(f¨´)trueåŽï¼Œå®ƒä¼š(x¨¬)å…³é—å¯¹åº”çš„ä¼ è¾“çº¿½E‹ï¼Œè€Œå¯¹æ–¹ä¼š(x¨¬)‹‚€‹¹‹åˆ°ä¼ 输错误åQŒæ–‡ä»¶ä¼ è¾“å°±åœæ¢äº†ã€?/span>
isClosed
isClosedæ˜?/span>boolean型对象,它表½Cºå½“ä¼ è¾“˜q‡ç¨‹å·²ç»åœæ¢æ—Óž¼Œç”¨æˆ·ç‚¹å‡»äº†å…³é—按钮,TransFileManager‹‚€‹¹‹åˆ°isClosedä¸?/span>trueæ—Óž¼Œä¼?x¨¬)在列表ä¸åŽ»æŽ‰å¯¹åº”çš„ä¼ è¾“¾U¿ç¨‹å’?/span>TransFilePanelã€?/span>
isConfirm
isConfirmæ˜?/span>boolean型对象,它表½Cºæ–‡ä»¶æŽ¥æ”¶è€…是å¦ç¡®è®¤äº†æ–‡äšg接收åŽï¼ˆåŒ…æ‹¬åŒæ„和拒¾l)åQ?/span>TransFileManager‹‚€‹¹‹åˆ°isConfirmä¸?/span>trueæ—Óž¼Œä¼?x¨¬)å°†¼‹®è®¤çжæ€å‘¾l™æ–‡ä»¶å‘é€è€…ã€?/span>
jbtnCannel
jbtnCannelæ˜¯å–æ¶ˆæŒ‰é’®ã€?/span>
jbtnOK
jbtnOK是确定按钮�/span>
jpgbFileTrans
jpgbFileTransæ˜¯æ–‡ä»¶ä¼ è¾“çš„˜q›åº¦æ¡ã€?/span>
jtaFileTransStatus
jtaFileTransStatus是一个文本框åQŒç”¨æ¥æ˜¾½Cºæ–‡ä»¶ä¼ 输的状æ€ã€?/span>
transFileLength
transFileLength是一个长整型å˜é‡åQŒç”¨æ¥è¡¨½Cºå·²¾lä¼ è¾“çš„æ–‡äšg长度ã€?/span>
status
status是一个整行å˜é‡ï¼Œè¡¨ç¤ºæ–‡äšgä¼ è¾“çš„çŠ¶æ€ï¼Œæ‰€è¡¨ç¤ºçš„状æ€ä¸ŽSocketThreadä¸çš„对应ã€?/span>
ç•Œé¢æˆªå›¾
3åQ? ½Ž—法介ç»
3åQ?/span>7åQ?/span>1 TransFileManagerçš„åó@环监å?/span>
TransFileManger¾cÈ‘ô承了Thread¾c»ï¼Œå®žçŽ°å¤šçº¿½E‹ï¼Œé¿å…å¾ªçŽ¯ç›‘å¬æ—¶äñ”生阻塞ã€?/span>
ä»¥ä¸‹æ˜¯åœ¨æ¯æ¬¡å¾ªçޝä¸åšçš„å·¥ä½?/span>
1ã€?nbsp;å¾—åˆ°ä¼ è¾“¾U¿ç¨‹(SocketThread)的数é‡å’Œä¼ è¾“çŠ¶æ€æ˜¾½Cºé¢æ?/span>(TransFilePanel)的数é‡ã€?/span>
2ã€?nbsp;ä»Žä¼ è¾“çº¿½E‹åˆ—表ä¸ä¾æ¬¡å–å‡ºä¸€ä¸ªä¼ è¾“çº¿½E‹ã€?/span>
3ã€?nbsp;判æ–当å‰å–出的线½E‹æ˜¯å¦æœ‰å¯¹åº”çš„ä¼ è¾“çŠ¶æ€æ˜¾½Cºé¢æ¿ï¼Œå¦‚果有执è¡?/span>5åQŒå¦‚果没有执è¡?/span>4ã€?/span>
4ã€?nbsp;å¢žåŠ ä¼ è¾“çŠ¶æ€æ˜¾½Cºé¢æ¿ï¼Œòq¶ä¸”在主界é¢ä¸Šå¢žåР选项å¡ã€?/span>
5ã€?nbsp;判æ–ä¼ è¾“¾U¿ç¨‹çš„状æ€ï¼Œæ ÒŽ(gu¨©)®ä¸åŒçš„状æ€åšä¸åŒçš„处ç†ã€?/span>
6ã€?nbsp;如果列表ä¸çš„¾U¿ç¨‹å–完åQŒæ‰§è¡?/span>1åQŒæ²¡æœ‰å–完执è¡?/span>2ã€?/span>
½E‹åº‹¹ç¨‹å›¾ï¼š(x¨¬)
3åQ?/span>7åQ?/span>2 æ–点¾lä¼
软äšgæ”¯æŒæ–点¾lä¼ çš„åŠŸèƒ½ï¼Œè¯¥åŠŸèƒ½ä¸»è¦ç®—法如下:(x¨¬)
1ã€?nbsp;å½“æ–‡ä»¶ä¼ è¾“ä¸é€”åœæ¢æ—¶åQŒæ–‡ä»¶æŽ¥æ”¶è€…程åºäØ“(f¨´)接收的文件创å»ÞZ¸€ä¸ªä»¥è¯¥æ–‡ä»¶å+.tmp为文件åçš„äÍ(f¨´)æ—¶æ–‡ä»Óž¼Œä¸´æ—¶æ–‡äšg与该文äšgä¿å˜åœ¨åŒä¸€ä¸ªèµ\径下。äÍ(f¨´)时文件ä¸ä¿å˜æ–‡äšgä»¥ä¼ è¾“çš„å—节数和文äšg的大ž®ã€?/span>
2ã€?nbsp;当文件接收者接收该文äšgæ—Óž¼Œå¦‚果有对应的临时文äšgåQŒç¨‹åºä¼š(x¨¬)‹‚€‹¹‹åˆ°è¯¥æ–‡ä»¶çš„临时文äšgåQŒè¯»å–ä»¥ä¼ è¾“çš„å—节数和文件大ž®ï¼Œòq¶ä¸”æ¯”è¾ƒä¼ è¾“çš„å—节数与未完æˆä¼ 输的文件大ž®æ˜¯å¦ç›¸½{‰ï¼Œæ–‡äšg大å°å’Œå‘逿¥çš„æ–‡ä»¶å¤§ž®æ˜¯å¦ç›¸½{‰ï¼Œå¦‚果都相½{‰ï¼Œæ‰§è¡Œ3åQŒå¦åˆ™æ‰§è¡?/span>4ã€?/span>
3ã€?nbsp;ž®†æ–‡ä»¶çš„输出‹¹è®¾¾|®åˆ°åº”该¾l§ç®‹ä¼ 输的佾|®ï¼Œòq¶å°†èµ·å§‹ä¼ 输å—节数呾l™å‘é€è€…,执行5ã€?/span>
4ã€?nbsp;如果有未完æˆçš„ä¼ è¾“æ–‡ä»Óž¼Œž®†å…¶åˆ 除åQŒæ‰§è¡?/span>5ã€?/span>
5ã€?nbsp;˜q›è¡Œæ–‡äšgä¼ è¾“ã€?/span>
½E‹åº‹¹ç¨‹å›¾ï¼š(x¨¬)
3åQ?åQ? 本地端å£çš„多˜qžæŽ¥ç›‘å¬
Server¾cÕd¯¹è±¡è´Ÿè´£æœ¬åœ°ç«¯å£çš„监å¬åQŒå¯ä»¥æ”¯æŒå¤šäº†è¿žæŽ¥ï¼Œå…·ä½“æ•°é‡ç”Þq”¨æˆ¯‚®¾¾|®ã€?/span>
1ã€?span style="font: 7pt 'Times New Roman'"> 用用戯‚®¾¾|®çš„端å£åˆ›å¾ç›‘å¬åQŒç‰å¾…连接ã€?/span>
2ã€?span style="font: 7pt 'Times New Roman'"> 当有用户˜qžæŽ¥ä¸ŠåŽåQŒç”¨è¯¥è¿žæŽ¥åˆ›å»ÞZ¸€ä¸?/span>SocketThreadä¼ è¾“¾U¿ç¨‹åQŒåŠ å…¥åˆ°¾U¿ç¨‹åˆ—表ã€?/span>
3ã€?span style="font: 7pt 'Times New Roman'"> å¦‚æžœåœæ¢ç›‘å¬åˆ™é€€å‡ºï¼Œå¦åˆ™æ‰§è¡Œ1ã€?/span>
½E‹åº‹¹ç¨‹å›¾ï¼š(x¨¬)
å„个¾cÈš„功能介ç»
Nodeã€?/span>Elementã€?/span>Documentã€?/span>Atträ¸?/span>W3Cçš?/span>DOMè§„èŒƒè¦æ±‚实现的接å£ã€‚è¿˜æœ‰å…¶å®ƒæŽ¥å£æœªåˆ—出ã€?/span>
SimpleNode ¾l§æ‰¿Node接å£åQŒå®žçŽ?/span>Node接å£çš„基本功能ã€?/span>
SimpleElement¾l§æ‰¿Nodeå’?/span>Element接å£åQŒå¯¹åº?/span>DOMæ ?w¨¨i)ä¸çš„æ ‡å‡†èŠ‚ç‚¹ï¼Œä¹Ÿå°±æ?/span>XMLæ–‡äšgä¸çš„ä¸€ä¸ªæ ‡½{¾ã€?/span>
SimpleDocument ¾l§æ‰¿Nodeå’?/span>Document接å£åQŒå¯¹åº”æ•´ä¸?/span>DOMæ ?w¨¨i),它是解æžå™¨è§£æžå®ŒæˆåŽåQŒè¿”回的对象。用户å¯ä»¥ä‹É用该对象讉K—®æ•´ä¸ªDOMæ ?w¨¨i)ã€?/span>
SimpleAttr ¾l§æ‰¿Nodeå’?/span>Attr接å£åQŒå¯¹åº?/span>DOMæ ?w¨¨i)ä¸çš„å±žæ€§èŠ‚ç‚¹ï¼Œç”¨äºŽå˜æ”¾å±žæ€§å¿U°å’Œå±žæ€§å€¹{€?/span>
CharCollector å—符攉™›†å™¨ç±»åQŒå®ƒç›´æŽ¥ä¸?/span>XMLæ–‡äšg接触åQŒæ ¹æ®éœ€è¦å‘调用者æä¾›ä¸‹ä¸€ä¸ªæ ‡½{¾æˆ–文本½{‰æ•°æ®ã€?/span>
SimpleDOMParser è§£æžå™¨çš„æ ¸å¿ƒ¾c»ï¼Œå®ƒä‹Éç”?/span>CharCollector¾c»ï¼Œå¾—åˆ°æ ‡ç¾ã€æ–‡æœ¬ç‰æ•°æ®ã€‚ä‹Éç”?/span>SimpleElementã€?/span>SimpleAttr½{‰ç±»å˜æ”¾æ•°æ®åQŒç”Ÿæˆ?/span>SimpleDocumnet对象˜q”回¾l™è°ƒç”¨è€…ã€?/span>
MainFrame 用户界颾c»ï¼Œå®ƒå°†è§£æž¾l“果展示¾l™ç”¨æˆøP¼Œòq¶ä¸”æ ÒŽ(gu¨©)®ç”¨æˆ·çš„æ“ä½œï¼Œä¸Žç”¨æˆ¯‚¿›è¡Œäº¤äº’ã€?/span>
Manager ä¸é—´å±‚管ç†ç±»åQŒå®ƒå调用户界é¢åQ?/span>MainFrameåQ‰ä¸Žè§£æžå™¨å†…æ ?/span>(SimpleDOMParser)之间的关¾p»ï¼Œå®žçŽ°è§£æžå™¨çš„æŽ§åˆ¶ã€?/span>
内部接å£è®¾è®¡
¾cÕd¿U?/span> |
调用¾c?/span> |
调用功能 |
SimpleDOMParser |
SimpleElement |
节点的å˜å‚¨ï¼ŒæŸ¥æ‰¾åQŒåˆ 除ã€?/span> |
SimpleDOMParser |
SimpleAttr |
属性节点的å˜å‚¨åQŒæŸ¥æ‰¾ï¼Œåˆ 除ã€?/span> |
SimpleDOMParser |
SimpleDocument |
生æˆDOMæ ?/span> |
SimpleDomParser |
CharCollector |
å—符攉™›†åQŒå¾—åˆ°æ ‡½{¾ä¸Žæ–‡æœ¬½{‰ã€?/span> |
Manager |
SimpleDOMParser |
è§£æžXML文档 |
Manager |
MainFrame |
用户界é¢çš„相å…Ïx“ä½?/span> |
用例关系设计
用例介ç»
用户åQ?/span> å‚与者, 匙ÊY件的使用者ã€?/span>
XMLæ–‡äšgåQ?/span> å‚与者,XMLæ–‡äšgã€?/span>
链接的文ä»Óž¼š(x¨¬) å‚与者,XMLæ–‡äšgä¸é“¾æŽ¥çš„外部文äšgã€?/span>
选择XMLæ–‡äšgåQ?/span> 用户通过文äšg选择框选择一个本地的XMLæ–‡äšgã€?/span>
选择URL地å€åQ?/span> 用户输入一个有效的URLåQŒæŒ‡å‘网¾lœä¸Šçš?/span>XMLæ ¼å¼çš„网™åüc(di¨£n)€?/span>
è§£æžXMLæ–‡äšgåQ?/span> 用户¼‹®å®šå¯?/span>XMLæ–‡äšg˜q›è¡Œè§£æžåQŒè¯¥™åÒŽ(gu¨©)“作è¦å‘生在选择XMLæ–‡äšg或选择URL地å€ä¹‹åŽã€?/span>
修改文äšgåQ?/span> 用户å¯?/span>XMLæ–‡äšg˜q›è¡Œä¿®æ”¹
ä¿å˜æ–‡äšgåQ?/span> 用户通过文äšg选择框,选择ä½ç½®ä¿å˜XMLæ–‡äšgã€?/span>
选择DOMæ ?w¨¨i)节点ï¼?x¨¬)用户选择解æžåŽçš„DOMæ ?w¨¨i)åž‹¾l“构上的节点ã€?/span>
è§£æžå™¨è§£æžï¼š(x¨¬) è§£æžå™¨å¯¹XML˜q›è¡Œè§£æž
攉™›†å—符åQ?/span> å—符攉™›†å™¨è´Ÿè´£å¤„ç?/span>XML的嗽W¦æ•°æ?/span>
界é¢å±•示åQ?/span> 通过æ ?w¨¨i)åž‹¾l“构和图表å‘用户展示数æ®ã€?/span>
å—符攉™›†å™¨æœ‰é™çŠ¶æ€æœº
DFA M=åQ?/span>{S,Ts,Tp,Tq,Cp,Ep,Er,Q},{LT,RT,A,C,EC,,EOF,NL,NLRA},f,S,{Q}åQ?/span>
å…¶ä¸ å—符集:(x¨¬)
LT={<}
RT={/>}
A={&,<,>,&apos,&qout}
C={<!CDATA[[}
EC={]]>}
EOF代表文äšg¾l“æŸ
NLä»£è¡¨ä¸æ˜¯<的嗽W?/span>
NLRA 代表除去LT,RT,LTL,A,C的所有嗽W?/span>
状æ€ï¼š(x¨¬)
SåQ?/span> 开始状æ€?/span>
TsåQšæ ‡½{‘Ö¤„ç†å¼€å§‹çжæ€?/span>
TpåQšæ ‡½{‘Ö¤„ç†çжæ€?/span>
TqåQšæ ‡½{‘Ö¤„ç†ç»“æŸçжæ€?/span>
CpåQ?/span>CDATA节点处ç†çжæ€?/span>
EpåQšå†…建实体处ç†çжæ€?/span>
EråQšé”™è¯¯çжæ€?/span>
QåQšç»“æŸçжæ€?/span>
状æ€è{æ¢å‡½æ•ŽÍ¼š(x¨¬)
f(S,LT)=Ts
f(S,NL)=Er
f(Tp,RT)=Tq
f(Tp,A)=Cp
f(Tp,C)=Ep
f(Ep,EC)=Tp
f(Ep,EOF)=Er
f(Tq,LT)=Ts
f(Tq,EOF)=Q
f(Tq,NLRA)=Tq
bã€?/font> 得到åŽå°çš?/span>Graphics实例
Graphics2D offScreenG;
offScreenG = offScreenImg.createGraphics();
cã€?/font> 覆盖paintComponentæ–ÒŽ(gu¨©)³•
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(offScreenImg, 0, 0, this.maxX, this.maxY, this);
}
¾l˜åˆ¶æ—¶ç”¨åŽå°GraphicsåQŒç»˜åˆ¶å¥½åŽï¼Œè°ƒç”¨repaint()åQŒå°†offScreenImg¾l˜åˆ°é¢æ¿ä¸Šã€?/span>