Java程序开发教学课件13-网络通信_第1页
Java程序开发教学课件13-网络通信_第2页
Java程序开发教学课件13-网络通信_第3页
Java程序开发教学课件13-网络通信_第4页
Java程序开发教学课件13-网络通信_第5页
已阅读5页,还剩46页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Java程序开发网络通信重庆大学计算机学院主要内容

协议,主机,端口

URLConnection

Socket通信

多客户机制

扩展:ftp,http等下载和通信程序网络基础知识

IP地址如:,0

主机名(hostname)如:

端口号(portnumber)如:80,21,23,25

服务类型(service)http,telnet,ftp,smtp两类传输协议

TCP(TransportControlProtocol)面向连接的能够提供可靠的流式数据传输的协议。类似于打电话的过程。URL,URLConnection,Socket,ServerSocket等类都使用TCP协议进行网络通讯。

UDP(UserDatagramProtocol)非面向连接的提供不可靠的数据包式的数据传输的协议。类似于从邮局发送信件的过程。DatagramPacket,DatagramSocket,MulticastSocket等类使用UDP协议进行网络通讯。URL类

URL(UniformResourceLocator)一致资源定位器的简称,它表示Internet上某一资源的地址。

URL的组成protocol:resourceName协议名指明获取资源所使用的传输协议,如http、ftp、gopher、file等,资源名则应该是资源的完整地址,包括主机名、端口号、文件名或文件内部的一个引用。URL例子

/

/home/welcome.html

:80/Gamelan/network.html#BOTTOM构造URL对象publicURL(Stringspec)URLurlBase=newURL(“/”);publicURL(URLcontext,Stringspec)URLibm=newURL(“/pages/");URLibmgame=new(ibm,"game.html");例外处理try{URLmyURL=newURL(...)}catch(MalformedURLExceptione){.//exceptionhandlercodehere.....}获取URL对象属性

publicStringgetProtocol()

publicStringgetHost()

publicStringgetPort()

publicStringgetFile()

publicStringgetRef()类InetAddress

InetAddress类是IP地址封装类

InetAddressgetByName(Stringhostname)

InetAddressgetByAddress(byte[]addr)

StringgetHostAddress()

StringgetHostName()获得有关IP地址的各种属性通过URL读取WWW信息publicclassURLReader{publicstaticvoidmain(String[]args)throwsException{URLcqu=newURL(“/");BufferedReaderin=newBufferedReader(newInputStreamReader(cqu.openStream()));StringinputLine;while((inputLine=in.readLine())!=null)System.out.println(inputLine);in.close();}}使用URLConnection读写WWW资源try{URLcqu=newURL("/");URLConnectionntc=cqu.openConnection();}catch(MalformedURLExceptione){//newURL()failed...}catch(IOExceptione){//openConnection()failed...}

得到URLConnection对象之后,可以用如下方法得到相应的输入/输出流:

getInputStream()

getOutputStream()之后就可以读写输入/输出流,完成数据的读写。socket通讯

网络上的两个程序通过一个双向的通讯连接实现数据的交换,这个双向链路的一端称为一个socket。

socket通常用来实现客户方和服务方的连接。Client-serverandServiceSocketCommunicationSocket编程模型ClientServerServerSocketwaitrequestnewSocketnewSocketacceptsendRead/WriteDatareceiveRead/WriteDatareceivesendcloseCloseSocketCloseSocketclose创建Socket和ServerSocket

Socket(InetAddressaddress,intport);

Socket(InetAddressaddress,intport,booleanstream);

Socket(Stringhost,intport);

Socket(Stringhost,intport,booleanstream);

ServerSocket(intport);

ServerSocket(intport,intcount);客户端Socket的建立try{Socketsocket=newSocket(”",2000);}catch(IOExceptione){System.out.println("Error:"+e);}服务器端Socket的建立ServerSocketserver=null;try{server=newServerSocket(2000);}catch(IOExceptione){System.out.println("cannotlistento:"+e);}Socketsocket=null;try{socket=server.accept();}catch(IOExceptione){System.out.println("Error:"+e);}打开输入/输出流PrintStreamos=newPrintStream(newBufferedOutputStream(socket.getOutputStream()));DataInputStreamis=newDataInputStream(socket.getInputStream());PrintWriterout=newPrintWriter(socket.getOutputStream(),true);BufferedReaderin=newBufferedReader(newInputStreamReader(socket.getInputStream()));关闭socket

os.close();

is.close();

socket.close();

注意关闭的顺序例客户端程序importjava.io.*;.*;publicclassTalkClient{publicstaticvoidmain(Stringargs[]){try{Socketsocket=newSocket(“”,4700);BufferedReadersin=newBufferedReader(newInputStreamReader(System.in));PrintWriteros=newPrintWriter(socket.getOutputStream());BufferedReaderis=newBufferedReader(newInputStreamReader(socket.getInputStream()));Stringreadline;readline=sin.readLine();while(!readline.equals(“bye”)){os.println(readline);os.flush();System.out.println(“Client:”+readline);System.out.println(“Server:”+is.readLine());readline=sin.readLine();}os.close();is.close();socket.close();}catch(Exceptione){System.out.println(“Error”+e);}}}服务器端程序:importjava.io.*;.*;publicclassTalkServer{publicstaticvoidmain(Stringargs[]){try{ServerSocketserver=null;try{server=newServerSocket(4700);}catch(Exceptione){System.out.println(“cannotlistento:”+e);}Socketsocket=null;try{socket=server.accept();}catch(Exceptione){System.out.println(“Error.”+e);}Stringreadline;BufferedReaderis=newBufferedReader(newInputStreamReader(socket.getInputStream()));PrintWriteros=newPrintWriter(socket.getOutputStream());BufferedReadersin=newBufferedReader(newInputStreamReader(System.in));System.out.println(“Client:”+is.readLine());readline=sin.readLine();while(!readline.equals(“bye”)){os.println(readline);os.flush();System.out.println(“Server:”+readline);System.out.println(“Client:”+is.readLine());readline=sin.readLine();}os.close();is.close();socket.close();server.close();}catch(Exceptione){System.out.println(“Error:”+e);}}}运行结果Server:hello!Client:hello!Server:howareyou?Client:Iamfine,thankyou!…Client:bye.Server:bye.多客户机制SocketThreadAClientASocketThreadBServerSocketClientBThreadCSocketClientC服务器端程序:MultiTalkServer.javatry{serverSocket=newServerSocket(4700);}catch(IOExceptione){System.out.println("Couldnotlisten");System.exit(-1);}while(listening){newServerThread(serverSocket.accept(),clientnum).start();clientnum++;}程序ServerThread.javaimportjava.io.*;.*;publicclassServerThreadextendsThread{Socketsocket=null;clientnum;publicServerThread(Socketsocket,intnum){this.socket=socket;clientnum=num+1;}publicvoidrun(){try{Stringline;BufferedReaderis=newBufferedReader(newInputStreamReader(socket.getInputStream()));PrintWriteros=newPrintWriter(socket.getOutputStream());BufferedReadersin=newBufferedReader(newInputStreamReader(System.in));System.out.println(“Client”+clientnum+”:”+is.readLine());line=sin.readLine();while(!line.equals(“bye”)){os.println(line);os.flush();System.out.println(“Server:”+line);System.out.println(“Client:”+clientnum+“:”is.readLine());line=sin.readLine();}os.close();is.close();socket.close();}catch(Exceptione){System.out.println(“Error:”+e);}}}server.close();}catch(Exceptione){System.out.println(“Error:”+e);}}}数据报通信

TCP(TransportControlProtocol)面向连接的能够提供可靠的流式数据传输的协议。类似于打电话的过程。URL,URLConnection,Socket,ServerSocket等类都使用TCP协议进行网络通讯。

UDP(UserDatagramProtocol)非面向连接的提供不可靠的数据包式的数据传输的协议。类似于从邮局发送信件的过程。DatagramPacket,DatagramSocket,MulticastSocket等类使用UDP协议进行网络通讯。比较通信方协议是否需要连可靠性数据量应用式接无连接,每不可靠,64KB之数据会丢失数据报UDP个报包括源地址和目标地址时间服务,ping程序通信内可靠,http服务,流式通TCP需要连接大量数Telnet服务,信数据不会丢失据Ftp服务数据报通信

TCP有建立时间

UDP传输有大小限制:64K以内

TCP的应用:Telnet,ftp

UDP的应用:ping数据报通信

DatagramSocket()

DatagramSocket(intport)

DatagramPacket(byteibuf[],intilength)

DatagramPacket(byteibuf[],intilength,InetAddressiaddr,intiport);数据报通信

收数据报:DatagramPacketpacket=newDatagramPacket(buf,256);socket.receive(packet);

发数据报DatagramPacketpacket=newDatagramPacket(buf,buf.length,address,port);socket.send(packet);客户方程序QuoteClient.javaimportjava.io.*;.*;importjava.util.*;publicclassQuoteClient{publicstaticvoidmain(String[]args)throwsIOException{if(args.length!=1){System.out.println(“Usage:javaQuoteClient<hostname>”);return;}DatagramSocketsocket=newDatagramSocklet();//sendrequestByte[]buf=newbyte[256];InetAddressaddress=InetAddress.getByName(args[0]);DatagramPacketpacket=newDatagramPacket(buf,buf.length,address,4445);socket.send(packet);//getresponsepacket=newDatagramPacket(buf,buf.length);socket.receive(packet);//displayresponseStringreceived=newString(packet.getData());System.out.println(“QuoteoftheMoment:”+received);socket.close();服务器方程序:QuoteServer.javapublicclassQuoteServer{publicstaticvoidmain(Stringargs[])throwsjava.io.IOException{newQuoteServerThread().start();}}程序QuoteServerThread.javaimportjava.io.*;.*;importjava.util.*;publicclassQuoteServerThreadextendsThread{protectedDatagramSocketsocket=null;protectedBufferedReaderin=null;protectedbooleanmoreQuotes=true;publicQuoteServerThread()throwsIOException{this(“QuoteServerThread”);}publicQuoteServerThread(S)throwsIOException{super(name);socket=newDatagramSocket(4445);try{in=newBufferedReader(newFileReader(“one-liners.txt”));}catch(FileNotFoundExceptione){System.err.println(“Couldnotopenquotefile.Servingtimeinstead.”);}}publicvoidrun(){while(moreQuotes){try{byte[]buf=newbyte[256];DatagramPacketpacket=newDatagramPacket(buf,buf.length);socket.receive(packet);StringdString=null;if(in==null)dString=newDate().toString();elsedString=getNextQuote();buf=dString.getByte();//sendtheresponsetotheclientat”address”and//“port”InetAddressaddress=packet.getAddress();intport=packet.getPort();packet=newDatagramPacket(buf,buf.length,address,port);socket.send(packet);}catch(IOExceptione){e.printStackTrace();moreQuotes=false;}}socket.close();}protectedStringgetNextQuotes(){StringreturnValue=null;try{if((returnValue=in.readLine())==null){in.close();moreQuotes=false;returnValue=“Nomorequotes.Goodbye.”;}}catch(IOEceptione){returnValue=“IOExceptionoccurredinserver”;}returnreturnValue;}使用数据报进行广播通信

DatagramSocket只运行数据报发往一个目的地址

MulticastSocket将数据报以广播方式发送到该端口的所有客户.

MulticastSocket用在客户端,监听服务器广播来的数据客户方程序:MulticastClient.javaimportjava.io.*;.*;importjava.util.*;publicclassMulticastClient{publicstaticvoidmain(Stringargs[])throwsIOException{MulticastSocketsocket=newMulticastSocket(4446);InetAddressaddress=InetAddress.getByName(“”);socket.joinGroup(address);DatagramPacketpacket;//getafewquotesfor(inti=0;i<5;i++){byte[]buf=newbyte[256];packet=newDatagramPacket(buf,buf.length);socket.receive(packet);Stringreceived=newS

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论