Java编程技术课件:12网络编程(2学时)_第1页
Java编程技术课件:12网络编程(2学时)_第2页
Java编程技术课件:12网络编程(2学时)_第3页
Java编程技术课件:12网络编程(2学时)_第4页
Java编程技术课件:12网络编程(2学时)_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

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

文档简介

12

网络编程12.1基础知识12.2基于URL的高层次Java网络编程12.3基于Socket的低层次Java网络编程12.4支持多客户的client/server程序设计12.1基础知识Socket概念网络上的两个应用程序之间的通信是分层进行的。socket是应用程序进行网络通信的接口。端口号如果要发起网络连接,还需要知道远程机器的地址或名字。此外,每个网络连接需要一个端口号,客户端和服务器必须事先约定所使用的端口。如果系统两部分所使用的端口不一致,那就不能进行通信。TCP/IP系统中的端口号是一个16位的数字,它的范围是0~65535。实际上,小于1024的端口号保留给预定义的服务。

两类传输协议--TCP和UDPTCP:一种面向连接的保证可靠传输的协议。(TranferControlProtocol)通过TCP协议传输,得到的是一个顺序的无差错的数据流。发送方和接收方的两个socket之间必须建立连接,当一个socket(通常都是serversocket)等待建立连接时,另一个socket可以要求进行连接,一旦这两个socket连接起来,它们就可以进行双向数据传输,双方都可以进行发送或接收操作。一旦连接建立起来,双方的socket就可以按统一的格式传输大量的数据。TCP传输的效率不如UDP高。本章Socket编程将重点介绍TCP方式两类传输协议--TCP和UDP(续)UDP:一种无连接的协议。(UserDatagramProtocol)每个数据报中都给出了完整的地址信息,因此无需要建立发送方和接收方的连接。数据报在网络上以任何可能的路径传往目的地,因此能否到达目的地,到达目的地的时间以及内容的正确性都是不能被保证的。使用UDP传输数据时是有大小限制的,每个被传输的数据报必须限定在64KB之内。

【Return】12.2基于URL的高层次Java网络编程关于URL创建一个URL解析一个URL从URL读取WWW网络资源通过URLConnetction连接WWW【Return】关于URLURL:UniformResourceLocatorURL表示Internet上某一资源的地址。通过URL可以访问Internet上的各种网络资源,比如最常见的WWW,FTP站点。URL的组成基本结构:protocol://resourceNameProtocol:协议名,指明获取资源所使用的传输协议,如http、ftp、gopher、file等。resourceName:资源名是资源的完整地址,包括主机名、端口号、文件名或文件内部的引用(相对位置,锚)。例如:/协议名://主机名/home/welcome.html

协议名://主机名+文件名:80/Gamelan/network.html#11

协议名://主机名+端口号+文件名+内部引用.【Return】创建一个URLpublicURL(Stringspec);例:URLurl1=newURL("http:///");publicURL(URLcontext,Stringspec);例:URLurl2=newURL(url1,"index.html");publicURL(Stringprotocol,Stringhost,Stringfile);例:URLurl3=newURL("http","","/sports/football.html");publicURL(Stringprotocol,Stringhost,intport,Stringfile);例:URLurl4=newURL(“http”,“",80,"news/tech.html");注意生成URL对象时,通常要用try-catch语句进行捕获MalformedURLException(URL格式错误异常)。用法如下:try{

URLmyURL=newURL(…)}catch(MalformedURLExceptione){

}【Return】解析一个URLpublicStringgetProtocol()获取该URL的协议名。publicStringgetHost()获取该URL的主机名。publicintgetPort()获取该URL的端口号,如果没有设置则-1。publicStringgetFile()获取该URL的文件名。publicStringgetQuery()获取该URL的查询信息。publicStringgetPath()获取该URL的路径publicStringgetAuthority()获取该URL的权限信息publicStringgetUserInfo()获得使用者的信息publicStringgetRef()获取该URL在文件中的内部引用(相对位置)。【Return】从URL读取WWW网络资源当得到一个URL对象后,就可以通过它读取指定的WWW资源。方法:InputStreamopenStream();功能:与指定的URL建立连接并返回InputStream类型对象以从这一连接中读取数据。

示例importjava.io.*;import.*;publicclasscalendar{publicstaticvoidmain(String[]args)throwsException{URLurl1=newURL("/");//使用openStream得到一输入流并由此构造一个BufferedReader对象BufferedReaderin=newBufferedReader(new InputStreamReader(url1.openStream()));StringinputLine;while((inputLine=in.readLine())!=null)System.out.println(inputLine);

in.close();}}输出的结果是网页的HTML文档【Return】通过URLConnetction连接WWW通过URL的openStream()方法,只能从网络上读取数据。如果同时还想输出数据,例如向服务器端的CGI程序发送一些数据,必须先与URL建立连接,然后才能对其进行读写,这时就要用到URLConnection类。URLConnetction用法Try{

URLurl1=newURL("/index.shtml");

//打开URL对象上的一个连接

URLConnectonntc=url1.openConnection();

}catch(MalformedURLExceptione){//创建URL()对象失败

}catch(IOExceptione){//openConnection()失败

}}URLConnection对象的两个方法InputSteramgetInputSteram();获得输入流OutputSteramgetOutputStream();获得输出流通过返回的输入/输出流可以与远程对象进行通信示例//创建一URL对象,其中backwards为服务器端的CGI程序。URLurl=newURL("/cgi-bin/backwards");URLConnectincon=url.openConnection();//由URLConnection获取输入流,并构造DataInputStream对象DataInputStreamdis=newDataInputStream(con.getInputSteam());//由URLConnection获取输出流,并构造PrintStream对象PrintStreamps=newPrintSteam(con.getOutputSteam());Stringline=dis.readLine();//从服务器读入一行ps.println("client…");//向服务器写出字符串"client…"【Return】12.3基于Socket的低层次Java网络编程Socket工作过程:Server端Listen(监听)某个端口是否有连接请求,Client端向Server端发出Connect(连接)请求,Server端向Client端发回Accept(接受)消息,一个连接就建立起来了。Server端和Client端都可以通过Send,Write等方法与对方通信。四个基本的步骤:(1)创建Socket;(2)打开连接到Socket的输入/出流;(3)按照一定的协议对Socket进行读/写操作;(4)关闭Socket。TCPsocket连接图示主要过程如下:服务器分配一个端口号port:newServerSocket(intport)。如果客户端请求一个连接,服务器则用accept()方法从连接请求队列中取出一个socket连接打开。客户端在自己主机上的port端口建立连接:newSocket(主机地址,端口号port)。服务器和客户使用Socket的InputStream和OutputStream进行通信。

TCPsocket连接是由

包中的类来实现的TCP服务器端ServerSocketserversocket=null;StringsendString="HelloNetWorld!";//服务器要传送给客户端的消息System.out.println("Serverstarting...");try{

serversocket=newServerSocket(5432);//服务器分配一个通信的端口号5432}catch(IOExceptione){}

while(true){//服务器一直监听通信端口 try{ System.out.println("Watingconnection...");

Socketsocket=serversocket.accept(); //一旦获取客户端请求,程序才开始往下继续:

System.out.println("AcceptingConnectionat"+

socket.getInetAddress()+":"+socket.getLocalPort()+ "attime:"+(newDate()).toLocaleString() ); OutputStreamos=socket.getOutputStream();//为socket创建输出流

BufferedWriterbw=newBufferedWriter(newOutputStreamWriter(os));//封装一下

bw.write(sendString+"\n");//输出消息

System.out.println("Messagesendcompleted!"); bw.close();os.close();socket.close();//关闭连接,但不关闭ServerSocket }catch(IOExceptione){}}ServerSocket的accept()方法:从连接请求队列中取出一个客户的连接请求,然后创建与客户连接的Socket对象,并将它返回。如果队列中没有连接请求,accept()方法就会一直等待,直到接收到了连接请求才返回。补充知识对于OutputStream字节流,还可以用DataOutputStream封装:

OutputStreamos=socket.getOutputStream(); DataOutputStreamdos=newDataOutputStream(os); dos.writeUTF(sendString);用于输出一个UTF-8编码的字符串UTF-8编码是与机器无关的,例如国外的用户如果使用英文版OS,浏览UTF-8编码的任何网页,无论是中文、还是日文、韩文、阿拉伯文,都可以正常显示。补充知识对于serversocket=newServerSocket(5432),如果运行时如果无法绑定到指定的端口号,该代码会抛出IOException。可能的原因是:端口已经被其他服务器进程占用;在某些OS中,如果没有以超级用户的身份来运行服务器程序,那么OS不允许服务器绑定到1~1023之间的端口。如果把端口号port设为0,表示由OS来为服务器分配一个任意可用的端口。也称为匿名端口。对于多数服务器,会使用明确的端口,而不会使用匿名端口。TCP客户端try{ System.out.println("Clientstarting...");

//在5432端口创建socket连接

Socketsocket=newSocket("",5432); InputStreamis=socket.getInputStream();//为socket创建输入流

BufferedReaderbr=newBufferedReader(newInputStreamReader(is)); System.out.println(br.readLine());//readLine()读取一行

br.close();is.close();socket.close();//关闭socket连接}catch(IOExceptione){}一个TCP/IP应用程序的客户端依靠Socket类,完成了建立一个连接所需的大部分工作。

补充知识对于InputStream字节流,还可以用DataInputStream封装:

InputStreamis=socket.getInputStream(); DataInputStreamdis=newDataInputStream(is); System.out.println(dis.readUTF());DataInputStream的readUTF()方法用于读取一个UTF-8格式编码的字符串示例改进:服务器和客户端交互(键盘输入信息)importjava.io.*;import.*;publicclassTalkServer{publicstaticvoidmain(String[]args){ServerSocketserver=null;System.out.println("Serverstarting...");try{server=newServerSocket(5432);}catch(Exceptione){System.out.println("cannotlistento:"+e);

}try{Socketsocket=server.accept();BufferedReaderis=newBufferedReader(newInputStreamReader(socket.getInputStream()));PrintWriteros=newPrintWriter(socket.getOutputStream());

BufferedReadersin=newBufferedReader(newInputStreamReader(System.in));System.out.println("Client:"+is.readLine());

Stringline=sin.readLine();

while(!line.equals("bye")){

os.println(line);

os.flush();System.out.println("Server:"+line);

System.out.println("Client:"+is.readLine());

line=sin.readLine();

}

//关闭Socket输出流、Socket输入流、Socket和ServerSocket

os.close();is.close();socket.close();server.close();}catch(IOExceptione){System.out.println("Error:"+e);

}}}服务器端importjava.io.*;import.*;publicclassTalkClient{publicstaticvoidmain(String[]args){System.out.println("Clientstarting...");try{Socketsocket=newSocket("",5432);BufferedReadersin=newBufferedReader(newInputStreamReader(System.in));PrintWriteros=newPrintWriter(socket.getOutputStream());BufferedReaderis=newBufferedReader(newInputStreamReader(socket.getInputStream()));Stringreadline=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();//关闭Socket输出流、Socket输入流和Socket }catch(IOExceptione){ S

温馨提示

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

评论

0/150

提交评论