西农java实习八网络编程.docx
- 文档编号:27114042
- 上传时间:2023-06-27
- 格式:DOCX
- 页数:29
- 大小:325.43KB
西农java实习八网络编程.docx
《西农java实习八网络编程.docx》由会员分享,可在线阅读,更多相关《西农java实习八网络编程.docx(29页珍藏版)》请在冰豆网上搜索。
西农java实习八网络编程
信息工程学院1
《Java语言程序设计》实验报告
学院:
信息学院班级:
**********姓名:
pprp学号:
**********3成绩:
一、实习目标
(1)描述掌握Socket通信
(2)掌握UDP数据报通信
(3)掌握多线程网络编程
二、实验过程
任务一:
掌握Socket类的使用
在两台机器上分别运行以下服务器端程序和客户端程序,观察程序的多次运
行结果,回答问题
SpublicclassServer{
publicstaticvoidmsintString[]mrgs){
实验报告的内容与格式按任课教师的要求书写。
^127.0.0.1
59368
/127.0.0.1:
2018
2018
publicstaticvoidmain(5trinx[]args){Socketsocket=newSocket();//cl
ImetSocketAddressisa■■newInetSocketAddress(2918);try{
socket,connect(isa);//c2
System.out.printIn(socket.getInstAddress()))/c5
System-out.printIn(socketgetPort())\Hc4
System.outHprintln(socket■getLocalSocketAddr'essf)};■-■'r5Systemroot►printIn(socket.getLocalPort(});//c6
socket*elose();
}cdtch(lOExceptione)(
System.out.println(");
}
观察服务器端和客户端的输出,说明添加注释的每行代码作用。
截图:
两次服务器与客户端的输出,可以发现两次所用到的端口是随机生成的是不一致的。
/127.0.9,1
2018
/127.0,0,1:
59368
59368
/127.0.0*1
2018
/127,0.9.1:
59898
59898
|/127,0.0,1
59898
/127.0.0.1:
2018
2918
代码如下:
packageworkl;
importjava.io.10Exception;!
I
publicclassServer{
public百t冃ticvoidrnain(S七厂in^[]args){
ServersocketsSocket=null;
Sacketsocket=null;
try{
sSocket=newServerSock^t(2018;;
}catch(IOExceptionel){
System.out.printing"JI□已龍占用!
M);
)
try(
socket=^Socket,accept{)j
System・十・p「jj】L]ji(5 System・pr*int].ri(5CKl System*out»println(socket.getLocalSocketAddress());System.out.printIn(sockEt・gatL(X21P°rt()); }catch(IOExceptione){ System.out.printin(",PJ; } } } packageworkl; innportjava.io.IOExwptiorc」 publicclasstlient{ publicstaticvoidniaini(St_ring[]dr^s)throwsIOException{ SocketEgkPt=newSocketf)j//cl InetSocketAddressisa=newInetSocketAddre5s("127.0.e.l',2€lS};try( socket,connect(isa);//c2 System.out.println(socket,^etInetAdcire5s());//cJ System»out,printin(socket.getPort());"S System*out+println(socket•gctLocalSocketAddrcs&Q);//cs System”out”printin(sock^t.getLoeaIPort());//c6 }catch(IOExcept±on电){ System.out.printl器丘常、”); LrULket.cluse[); I} } 问题回答: S1: 实例化ServerSocket对象,并指定服务器中的端口为2018 S2ServerSocket对象的accept()方法示例化Socket对象,并阻塞进程,等待用户端的连接 S3: 打印服务器端套接字连接的IP地址 S4: 打印服务器端套接字连接的远程端口 S5: 得到服务器端套接字绑定的本地IP地址及端口 S6: 打印服务器端套接字绑定的本地端口 C1: 实例化Socket对象 C2: 将InetSocketAddress类实例化的对象中所包含的服务器主机IP及端口, 调用connect()方法,传入至Socket类中,与服务器进行连接 C3: 打印用户端套接字连接的IP地址 C4: 打印用户端套接字连接的远程端口 C5: 获取用户端套接字绑定的本地IP地址及端口 C6: 打印用户端套接字绑定的本地端口 任务二: 使用TCP协议实现文件传送 在当前项目的根目录新建两个文件夹: “source”和“destination”,在source中放置两个文件: “cartoon.jpg”以及“file.docx”。 这两个文件见实习附件。 实现一个服务器端程序Server,服务器端可以通过文件流直接读取文件内容。 实现一个客户端程序Client,客户端程序运行后,提示用户输入文件名。 如,用户在客户端输入“file.docx”并回车,则程序通过TCP协议读取服务器端的数据,将该文件传送一个副本保存在“destination”目录中。 fillName: 卡il巳■do匸x 服务器: 传送內容 文件发送亮毕! fileName: cartacn,jpg 服务器: 传送内容 文件发送完毕! ■.Zz-Practice8th 丿ISsrc ▲fflwork! i(T)Client.java P[7|ServerJava JJgwork2 D[7|Client.java >J]Server.java 0Jgwork3 t>®work4 t>呱JRE浆统库: JavaSE-1.7] ・Qydestination 二cartoonjpg创file.docx •Gsource 匚cartoonjpg 回]file.docx 代码截图: Server.java packagework2; importjava.io*DataInputStream;_ publicclassServer{ SprverSockptss=null; Socketsocket三null; FilelnputStreamfis=null; DataOutputStreamdos=null; DataTnput^tromnidi<;=null; publicSer'^er'O{ try{ss=newServerSocket(5036); socket=ss.accept(}; dos-newDataOutputs七厂皂日口(50匚比£七・呂亡〉;dis=newDataInputStream(socket•呂etlnputytFe日rn()); }catch(IOExceptione){ System,out.printing"服务器: 琏接失败");| e,printStackTrace(); } } publicvoidinteract()-( while{t「x){try{byte['b=newbyte[10? 4];intl^ns=dis*rpa(1(b); String-FileNaniQ=nei^Stringtb,®.,lens); System♦printlnf^filoNamet"+filcNamc)\ fis=rewFileInpirtStreain(".\\source\\"+fileName);byte[]buffer-newbyte[1024*6W]5intlen; Systen.out.println(HK^S: 送內弯”); while((len=fis.read(buffer))! =-1){dos.writpfbuffprjQ,lpn); } dos.write(NEND"; System.cwt.printin("交件发送圭毕! "); }catch(IOExccptionc)[ System.oLft*println(°ER^^: 读入失败"” e.print5t日匚1<1厂日匸亡(}; } try{ fis.closp(); }catch(JOException&){ //TODO目动生成的匚日tch规 e.printStackTrace(); } } } publicstaticvoidmain(String[]a^^s){ newServer().intera匚t(〉; } Client.java packageworki; importjava*10h□□talnputstreofi;_| publicclassClient{ Socket-null; Scannerin-newScannsr(System»in; I. FileOutputStreamfos=null; StringfilcNomc; DdtaOulputSliediiidos=null; DatalnputStrea『dis-null; publicClient(){ ss=newSockQt() InetSocketAddressisa=newInetSccketAddress("127.0.0.1"5036); try( ss,connect(isa); dos=newDataOirtputStream(ss dis=newDatalnputStre^mfss.getlnputSt「伽皿⑴;}catch(TOExceptione){ Systen.di/t.printin["g户端旌搂失哄J; } } publicvoidinteract()throusiOtxception{while(truc){ SystefnTout,println("盾帝入一牛文牛若: ");fileN^me=in.nextLinw(); by[JbFileName.getBytes()j dos*write[b); intLength=Q; byte[]bbnewbyte[1924*&00]; fos-newKileOirtputStr'ean(b\\\destiriation\\"+fileN^me);try{ t#)ileC(length-dis.read(bb))I二-1){ "3ystem if(newStringtbbjlength-3,3)*equals("END")){ break; } fo$Twrite(bb,0jlength); } System+out*printIn("文件搖檢完卑I }catch(lOExceptione){ System.out.printin(■嘗门命蜀瓷腓矣器主曲: 証据乂殴* } fos.closed)I publicstaticvoidrnain(String[]args)throws10匚xception{Clientt■newClientf); t.int&ract() 说明: 本次实验遇到的最大的困难就是本题,通过询问老师得到解决 问题描述: 客户端向服务器发送一个文件名,服务器端通过文件流将文件读入内存,然后再用网络流输出到客户端,客户端接受到文件流然后用文件流保存到本地。 在客户端接受网络流的时候会发现客户端程序进入死循环,无法进 行下一个文件的读写。 问题出现原因: 由于客户端通过网络流进行读写的时候与文件读写是不一样的,不会出现读到文件尾部的情况,而是会一直等待从而造成死循环。 问题解决方法: 设置一个文件末尾标记进行读写,如果读取到该标记则说明结束,break断开死循环。 任务三: 现有一个Triangle(三角形)类 publicclassTriangleimplementsSerializable{ doublesideA; doublesideB; doublesideC; Strin菖area; publicTria电doubledoublec){ this.sideA=a; this.sideB=b; this,sideC=c; } publicbooleanisLegal(){〃判断三角形三条边是否合法I」 publicStringcalculateArea(){//「算三毎旳囱积 doublep=(sideA+sideB+sideC)/2,0; area=1,41+Math*(p-sideA)*(p-sideB)*(P-SideC}); returnarea; } } 思考: 为什么Triangle需要实现Serializable接口? 服务器用于接收客户端传来的Triangle对象,计算三角形面积,将计算结果 传给客户端。 连接服务器之前: 点击“连接服务器”实现连接,点击“send”提交计算请求: 基本要求: 使用ServerSocket类和Socket类实现单线程对象的发送与接收实现计算结果的发送与接收。 服务器端可以不使用界面。 效果截图: 代码截图: Triangle.java importjava・io・Serializable; /* •疼歹妣最为了便于在网貉的传输和保存 publicrriangleimplements5亡rializ: diblE{ doublesideA; doublesideB; doublesideC; doublearea; publicTriangle(){ sideA=sideB=sideC=0 public7riarig]_e({10Libledoublet>,doublec){ 七his.sideA-a; this・sideB=b; thiSnside匚=匚; publicboaleani^Legal(){ sideC)) sideB)) sideft)) if((sideB+sideA>5ideC>&St(sideB-sideA if((sideC4sid^A>side匚-sideA< returntrue; if((sideB+sideC>sideA)&&(sideG-sideC returnfalse; } publicdoublecalculat&Areaf){ doublep=(sideA4-sideB-i-sideC)/2. area=Math.sqrt(p*(p-sideA)*(p-sideB)*(p-sireturnareaj TriangleFrame.java packagework3; importjava.awt.BordorLayout;;! publicclassTrlangleFraaeextends3Frame{TCPClienttc・null; • JParelnorth; 3Parelcenter; * JParelsouth; ^Buttonlink; ^Buttonsend; JTextFieldtextA; JTextFieldtextB; JTextFieldtextc; area; publicTrlanglercd«e(){ tc-newTCPC1lent(); link・newS"); seedinewJButtonCstHD*); textA=newjTextField(); textB■new3TextField(); textC・newDTextfield(); ■newJTextArea(); north=new3Panel(); center=newJPanel(); south=new0Panel(); tmtto; north・S€tLNyout(riewBorderLayout()); north・add(link»EorderLayout.CFWTFR); cente「・setLayout(newFlowL«yojt()); ■ 4 center.add(nR43Latel(9VSldeA: *)); "ntee・2dd(2xtA〉: center・2dd(npw3Label(*SldeB: *));center.add(textB); center.add(new3Label(wSideCM));center・add(textC); center.add south・5etL8yout(newBorderLayout()); south・add(ar*ea); area.setBorderfnewBevelBcrder(BevelBorder・LOW£R£D)); this•setTitle(-计算三角形面积••“ this.setVisible(truc); this・setsi2°(newDimension(680/08)); this・SQTDefdultC10SQ0pGraxlcxi(JFrame・EXITONCLOSE); this.^dd(north,Bor(terLayout.NORTH); this.add(c^nter#Bord^rLayout.CFNTER);thls.add(south,BorderLayout.50UTH); voidINIT(){ area.setRows(16); textA・setPreferredSize(newMinersion(1G0,30));textB.setPreferredSizefnewDinersion(100,30)); textC・setPreferredSizefnewDinersion(1G0f30)); •link・addActionlistener(newActionListGnen(){^Override publicvoidactlonPerformed(ActionEventg){ if(tc.llnk()){area.setText(M服务署连接咸功! JPt也址为: "卜tc.ss.grtlnetAddressO♦*\n");arpa.append('^口世w“tc.ss.gptLocalPort()♦w\n"); }01"{area.setTextO.务君连赛矢败! \十); }};send»addActionList@ner(newActionListener(){ (^Override publicvoidactionPerformed(ActionEvente){Stringa=nulljb=null^c=nullja-textA^gefext()jb=texts,get_ext();c-textC.get_ext(}; DoubleSarea=tc area.appended的三个边长不能组咸三角形! ”);else area.append("H角形的面积为: "*Sarea+n\n");} }}; } publicstaticvoid! main(String[]args){ newTriangleFramef); } TCPServcer.java packagewonk3j importjava,io*DataInputStream;|2 publicclassTCPServer{ ServerSocketss=null; Socketsocket=null; DataInputStreamdis=null; DataOutputStreamdos=null; publicTCPServer(){ try{ ss=newServerSocket(6660);socket=ss.accept(); dis=newDatalnpuizEtrearn(socket.getInputs七「己日111());dos=newDataOutputStream(socke七*直色士011七口11七5七$£幺1! 1()); }eatch(IOExceptione){ System.out.printin(诜口祕占用")i publicvoidirrteract(){| Trianglet=null; while(true){ try{ doublea=dis*readDouble();doubleb=dis.readDcuble(); doublec=di5
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 西农 java 实习 网络 编程