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(ssdis=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){
"3ystemif(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-sideAif((sideC4sid^A>side匚-sideA<
returntrue;
if((sideB+sideC>sideA)&&(sideG-sideCreturnfalse;
}
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.addsouth・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=tcarea.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