Upload
halle
View
128
Download
2
Embed Size (px)
DESCRIPTION
Java 语言编程技术. 第12章 网络编程. 主要内容. 使用 URL TCP 编程 UDP 编程. Java 提供的网络功能有三大类 : URL, Socket, Datagram. URL 是三大功能中最高级的一种 , 通过 URL Java 程序可以直接送出或读入网络上的数据 . Socket 是传统网络程序最常用的方式 , 可以想象为两个不同的程序通过网络的通信信道 . Datagram 是更低级的网络传输方式 , 它把数据的目的纪录在数据包中 , 然后直接放在网络上. 网络环境中的 java. 借助 HTML 从网上下载 applet. - PowerPoint PPT Presentation
Citation preview
Java 语言编程技术第第 1212 章 网络编程章 网络编程
Java 语言编程技术 2
主要内容 使用使用 URLURL TCPTCP 编程编程 UDPUDP 编程编程
Java 语言编程技术 3
JavaJava 提供的网络功能有三大类提供的网络功能有三大类 : URL, : URL, Socket, Datagram.Socket, Datagram.
URLURL 是三大功能中最高级的一种是三大功能中最高级的一种 ,, 通过通过URL JavaURL Java 程序可以直接送出或读入网络程序可以直接送出或读入网络上的数据上的数据 ..
SocketSocket 是传统网络程序最常用的方式是传统网络程序最常用的方式 ,, 可可以想象为两个不同的程序通过网络的通以想象为两个不同的程序通过网络的通信信道信信道 .. DatagramDatagram 是更低级的网络传输方式是更低级的网络传输方式 ,, 它它把数据的目的纪录在数据包中把数据的目的纪录在数据包中 ,, 然后直接然后直接放在网络上放在网络上 ..
Java 语言编程技术 4
网络环境中的 java
借助 HTML从网上下载 applet
在程序中通过 URL访问网上资源通过 java.net包中的类直接在程序中实现网络通讯
Java 语言编程技术 5
URL 统一资源定位符统一资源定位符 URLURL (( Uniform Resource Uniform Resource
LocatorLocator ))用字符串表示用字符串表示 InternetInternet 网络上资源的地址网络上资源的地址包括两部分包括两部分
使用的协议(使用的协议( http, ftp, gopher, file…)http, ftp, gopher, file…)资源位置资源位置
Java 语言编程技术 6
URL (续) 资源位置资源位置
主机名,或主机名,或 IPIP 地址地址端口号端口号路径名,资源文件在主机中的路径路径名,资源文件在主机中的路径引用,指向资源文件的某一个位置引用,指向资源文件的某一个位置
httphttp://://www.sun.comwww.sun.com::88888888//dirdir//file.htmfile.htm##locloc
Java 语言编程技术 7
URL 类 java.net.URL java.net.URL
一个一个 URLURL 对象代表一个对象代表一个 URLURL 资源资源 构造函数构造函数
URL(String spec) URL(String spec) URL url1=new URL(“http://www.nankai.edu.cn/”);URL url1=new URL(“http://www.nankai.edu.cn/”);
URL(URL baseURL, String URL(URL baseURL, String relativeURL)relativeURL)
URL url2=new URL(url1, “file.html”);URL url2=new URL(url1, “file.html”);
Java 语言编程技术 8
URL 类(续) URL(String protocol, String host, int URL(String protocol, String host, int
port, String file)port, String file) URL(String protocol, String host, String URL(String protocol, String host, String
file)file) 使用缺省使用缺省 8080 端口端口构造函数抛出构造函数抛出 MalformedURLExceptionMalformedURLException
获取获取 URLURL 信息的一些方法信息的一些方法 getProtocol(), getHost(), getPort(), getFile(), getProtocol(), getHost(), getPort(), getFile(),
getRef()getRef()
Java 语言编程技术 9
利用 URL 获取网络资源 创建创建 URLURL 对象对象 使用使用 URLURL 对象的对象的 openStream()openStream() 方法,返方法,返回一个回一个 InputStreamInputStream 。。 从此从此 InputStreamInputStream 读入即可。读入即可。
Java 语言编程技术 10
利用 URL 获取网络资源(续)import java.net.*;import java.io.*;
public class TestUrl { public static void main(String[] args) throws Exception { URL web = new URL("http://www.nankai.edu.cn"); System.out.println(web.getProtocol()); System.out.println(web.getHost()); System.out.println(web.getPort()); System.out.println(web.getFile());
Java 语言编程技术 11
利用 URL 获取网络资源(续) BufferedReader in = new BufferedReader( new InputStreamReader(web.openStream())); String inputLine; while ((inputLine = in.readLine()) != null)
System.out.println(inputLine); in.close(); }}
Java 语言编程技术 12
URLConnection 一个一个 URLConnectionURLConnection 对象代表一个对象代表一个 URLURL资源与资源与 JavaJava 程序的通讯连接,可以通过程序的通讯连接,可以通过它向这个它向这个 URLURL 连接读或写。连接读或写。 获得获得 URLConnectionURLConnection 类对象 —— 使用类对象 —— 使用
URLURL 的的 openConnectionopenConnection 方法:方法: URLConnection url1. openConnection()
成功,返回一个 URLConnection 对象不成功,抛出 IOException 例外
Java 语言编程技术 13
URLConnection (续) 从从 URLConnectionURLConnection 读读
getInputStream( )getInputStream( ) 向向 URLConnectionURLConnection 写写
setDoOutput(true), getOutputStream( )setDoOutput(true), getOutputStream( )
Java 语言编程技术 14
import java.io.*;import java.io.*;import java.net.*;import java.net.*;public class Reverse {public class Reverse { public static void main(String[] args) throws public static void main(String[] args) throws Exception {Exception {
if (args.length != 1) {if (args.length != 1) {System.err.println("Usage: java Reverse System.err.println("Usage: java Reverse
string_to_reverse");string_to_reverse");System.exit(1);System.exit(1); }}
String stringToReverse=args[0];String stringToReverse=args[0];
URLConnection (续)
Java 语言编程技术 15
URL url = new URL(URL url = new URL( "http://java.sun.com/cgi-bin/backwards");"http://java.sun.com/cgi-bin/backwards");
URLConnection connection = url.URLConnection connection = url.openConnectionopenConnection();(); connection.setDoOutput(true);connection.setDoOutput(true);
PrintWriter to_cgi = newPrintWriter to_cgi = new PrintWriter(connectionPrintWriter(connection.getOutputStream.getOutputStream());()); to_cgi.println("string=" + stringToReverse); to_cgi.println("string=" + stringToReverse);
to_cgi.close();to_cgi.close();
URLConnection (续)
Java 语言编程技术 16
BufferedReader from_cgi = new BufferedReader( BufferedReader from_cgi = new BufferedReader( new InputStreamReader(new InputStreamReader( connection.getInputStream())); connection.getInputStream()));
String inputLine;String inputLine;while ((inputLine = from_cgi.readLine()) != null) while ((inputLine = from_cgi.readLine()) != null) System.out.println(inputLine);System.out.println(inputLine); from_cgi.close(); from_cgi.close();
}}}}
URLConnection (续)
Java 语言编程技术 17
运行结果运行结果
URLConnection (续)abcdefg
reversed is:
gfedcba
Java 语言编程技术 18
TCP 与 UDP TCP(Transport Control Protocol)TCP(Transport Control Protocol)
两主机之间有连接的、可靠的、端对两主机之间有连接的、可靠的、端对端端 ((end-to-endend-to-end)) 的数据流的传输的数据流的传输 如如 http, ftp, telnet http, ftp, telnet 的传输层均使用此协的传输层均使用此协议议
UDP(User Datagram Protocol)UDP(User Datagram Protocol)从一台机器向另一台机器以无连接的、从一台机器向另一台机器以无连接的、数据报的方式进行通讯的协议数据报的方式进行通讯的协议
Java 语言编程技术 19
TCP 与 Socket 有连接的服务中,服务器进程绑定有连接的服务中,服务器进程绑定一个一个 SocketSocket ,,监听客户请求监听客户请求 请求请求 服务进程服务进程响应请求响应请求 服务进程与客户进程各绑定一个服务进程与客户进程各绑定一个
SocketSocket ,,进行相互通讯。进行相互通讯。
Java 语言编程技术 20
UDP 与 Datagrams 使用使用 UDPUDP 协议传送数据时,把数据分协议传送数据时,把数据分割为各自独立的多个数据报割为各自独立的多个数据报
((Datagrams), Datagrams), 分别发送,数据报是否到分别发送,数据报是否到达、到达顺序以及内容是否正确不保证。达、到达顺序以及内容是否正确不保证。 IPIP 以及端口地址包含在报头中以及端口地址包含在报头中
Java 语言编程技术 21
InetAddress 类 代表一个代表一个 IPIP 地址地址 创建创建 InetAddressInetAddress 对象的方法对象的方法
static InetAddress getByName(String)static InetAddress getByName(String) InetAddress ip1 =InetAddress ip1 = InetAddress. getByName(“202.113.28.6");InetAddress. getByName(“202.113.28.6");InetAddress ip2 = InetAddress ip2 = InetAddress. getByName(InetAddress. getByName( "www.nankai.edu.cn");"www.nankai.edu.cn");
Java 语言编程技术 22
InetAddress 类 static InetAddress getLocalHost()static InetAddress getLocalHost()
InetAddress ip1=InetAddress ip1= InetAddress.getLocalHost();InetAddress.getLocalHost();
InetAddress.getLocalHost();InetAddress.getByName(null);InetAddress.getByName(null);InetAddress.getByName("127.0.0.1");InetAddress.getByName("127.0.0.1");InetAddress.getByName("localhost");InetAddress.getByName("localhost");
Java 语言编程技术 23
InetAddress 类(续) 其他方法其他方法
String getHostAddress(): String getHostAddress(): 返回“返回“ %%d.%d.%d.%d”d.%d.%d.%d” 形式的形式的 IPIP 地地址址 String getHostName(): String getHostName(): 返回主机名返回主机名 String toString()String toString()
Java 语言编程技术 24
TCP 通信
使用使用SocketSocket 类类ServerSocketServerSocket 类类
Java 语言编程技术 25
SocketSocket 是网络上运行的程序之间双向通信是网络上运行的程序之间双向通信链路的最后终结点链路的最后终结点网络服务
ftp
finger
20telnet
数据结构I/O缓冲区端口
2123客户程序 Socket
IP,port
IP与端口的组合得出一个套接字 ,可以完全分辨internet上运行的程序
Java 语言编程技术 26
TCP 通信
Server端通讯过程
Client端通讯过程
在某端口创建ServerSocket对象提供监听
等待并接收Client端的请求
利用返回的Socket对象与Client端通讯
关闭 Socket结束与此Client的通讯
关闭监听
创建 Socket对象向 Server某端口请求利用此 Socket对象与 Server端通讯
关闭 Socket结束与此Server的通讯
建立连接 数据通讯 拆除连接
Java 语言编程技术 27
Socket 类 构造函数:构造函数: Socket(InetAddress addr , int port) Socket(InetAddress addr , int port) Socket(String addr , int port) Socket(String addr , int port) 方法:方法:InputStream InputStream getInputStreamgetInputStream();();outputStream outputStream getoutputStreamgetoutputStream();();
Java 语言编程技术 28
Server 类 指定指定端口号,端口号,创建一个创建一个 ServerSocketServerSocket 对象对象 ::
ServerSocket(int port);ServerSocket(int port); ServerSocket(int port, int count);ServerSocket(int port, int count);
ServerSocket mSer = new ServerSocket(8010);ServerSocket mSer = new ServerSocket(8010); 在该端口监听,当收到在该端口监听,当收到 ClientClient 发出的请求时,创建一发出的请求时,创建一
个个 SocketSocket 对象与此对象与此 ClientClient 通讯通讯Socket ReturnS = mSer.accept();Socket ReturnS = mSer.accept(); 接收到接收到 ClientClient 请求之前该线程处于阻塞状态请求之前该线程处于阻塞状态
通过通过 SocketSocket 类的类的 I/OI/O 流对象与流对象与 ClientClient 端通信端通信 关闭用来与关闭用来与 ClientClient 做数据做数据 I/OI/O 的的 SocketSocket 对象对象 撤消服务时,关闭撤消服务时,关闭 ServerSocketServerSocket 对象对象
mServer.close();mServer.close();
Java 语言编程技术 29
socket 通信Client
//试图连接Socket(host;port#)
OutputStreamInputStream
Socket.close()
Server
//占用某个端口ServerSocket(hostport)
//等待连接ServerSocket.accept()
Socket()
OutputStreamInputStream
Socket.close()
Java 语言编程技术 30
Server 端ServerSocket server=null;try { server=new ServerSocket(2000);}catch(IOException e){ System.out.println("can not listen to :"+e);}Socket socket=null;try { socket=server.accept();}catch(IOException e){ System.out.println("Error:"+e);}
Java 语言编程技术 31
Client 端 用用 ServerServer 端端主机号主机号 ,, 端口号端口号创建创建 SocketSocket 对象对象 Socket mClient = new Socket(202.113.3.3,8010);Socket mClient = new Socket(202.113.3.3,8010);
利用利用 SocketSocket 实现网络 实现网络 I/OI/OInputStream rDIn=mClient.getInputStream();InputStream rDIn=mClient.getInputStream();OutputStream rD=mClient.getOutputStream();OutputStream rD=mClient.getOutputStream();
关闭关闭 SocketSocket ,,结束通讯结束通讯mClient.close();mClient.close();
Java 语言编程技术 32
TCP 通信例 JabberServer.javaJabberServer.java JabberClient.javaJabberClient.java
Java 语言编程技术 33
JabberServer.javapublic static final int PORT = 7777;
ServerSocket s = new ServerSocket(PORT);
Socket socket = s.accept();
BufferedReader in = new BufferedReader(
new InputStreamReader(
socket.getInputStream()));
PrintWriter out = new PrintWriter(
new BufferedWriter(
new OutputStreamWriter(
socket.getOutputStream())),true);
Java 语言编程技术 34
JabberServer.javawhile (true) {
String str = in.readLine();
if (str.equals("END")) break;
System.out.println("Echoing: " + str);
out.println(str);
}
Java 语言编程技术 35
JabberClient.java
InetAddress addr = InetAddress.getByName(null);
Socket socket = new Socket(addr,
JabberServer.PORT);
BufferedReader in =
new BufferedReader(
new InputStreamReader(
socket.getInputStream()));
Java 语言编程技术 36
JabberClient.java
PrintWriter out = new PrintWriter(
new BufferedWriter(
new OutputStreamWriter(
socket.getOutputStream())),true);
for(int i = 0; i < 10; i ++) {
out.println("howdy " + i);
String str = in.readLine();
}
Java 语言编程技术 37
server 多客户机制 服务器通信程序采用多线程,每个线程服务器通信程序采用多线程,每个线程负责与一个客户对话负责与一个客户对话
ServerThread extend Thread{ServerThread extend Thread{ … … public void run() { public void run() { 服务器端通信程序服务器端通信程序 }}}}
… … sSocket=new Serversocket(8000)sSocket=new Serversocket(8000) … … while (listening) {while (listening) { tSocket= sSocket.accept() ;tSocket= sSocket.accept() ; new ServerThread(tSocket).start()new ServerThread(tSocket).start() }}
Java 语言编程技术 38
server 多客户机制 例 例 MultiJabberServer.javaMultiJabberServer.java MultiJabberClient.javaMultiJabberClient.java
Java 语言编程技术 39
UDP 通信 使用使用
DatagramPacketDatagramPacket 类类DatagramSocketDatagramSocket 类类
Java 语言编程技术 40
TCPTCP 提供高可靠性服务提供高可靠性服务 ,, 适用于一次要传适用于一次要传输交换大量报文的情况输交换大量报文的情况 ,, 信道上传递的包信道上传递的包不需要源地址和目的地址不需要源地址和目的地址 UDPUDP 提供高效率服务提供高效率服务 ,, 适用于依次传输交适用于依次传输交换少量报文的情形 换少量报文的情形 (( 如数据库查询如数据库查询 ),), 每个每个数据包要包含目的地址和端口号数据包要包含目的地址和端口号 .. 数据报文的使用以包为中心数据报文的使用以包为中心 :: 打包打包 ,, 拆包拆包 . . Java.netJava.net 包支持两种不同的在网络上送数据包支持两种不同的在网络上送数据的方法的方法 :: 一般套接字和数据报文套接字一般套接字和数据报文套接字 ..
Java 语言编程技术 41
发出报文的标准步骤如下发出报文的标准步骤如下 ::1. 1. 定义数据成员定义数据成员 DatagramSocket socket;DatagramSocket socket; DatagramPacket packet;DatagramPacket packet; InetAddress address;(InetAddress address;( 用来存放接收方的地址用来存放接收方的地址 )) int port;(int port;( 用来存放接收方的端口号用来存放接收方的端口号 ))
2. 2. 创建数据报文创建数据报文 SocketSocket 对象对象 try {socket=new DatagramSocket(1111);}try {socket=new DatagramSocket(1111);} catch(java.net.SocketException e) {}catch(java.net.SocketException e) {} socket socket 绑定到一个本地的可用端口绑定到一个本地的可用端口 ,,等待接收等待接收客户的请求客户的请求 ..
Java 语言编程技术 42
3.3. 分配并填写数据缓冲区分配并填写数据缓冲区 (( 一个字节类型一个字节类型的数组的数组 )) byte[] Buf=new byte[256]; byte[] Buf=new byte[256]; 存放从客户端接收的请求信息存放从客户端接收的请求信息 ..4.4. 创建一个创建一个 DatagramPacketDatagramPacket packet=new DatagramPacket(buf, 256);packet=new DatagramPacket(buf, 256); 用来从用来从 socketsocket 接收数据接收数据 ,, 它只有两它只有两个参数个参数 5. 5. 服务器阻塞服务器阻塞 socket.receive(packet);socket.receive(packet); 在客户的请求报道来之前一直等待在客户的请求报道来之前一直等待
Java 语言编程技术 43
6. 6. 从到来的包中得到地址和端口号从到来的包中得到地址和端口号 InetAddress address=packet.getAddress();InetAddress address=packet.getAddress(); int port=packet.getPort();int port=packet.getPort();7. 7. 将数据送入缓冲区将数据送入缓冲区 或来自文件或来自文件 ,, 或键盘输入或键盘输入8. 8. 建立报文包建立报文包 ,, 用来从用来从 socketsocket 上发送信息上发送信息 packet=new DatagramPacket packet=new DatagramPacket (buf,buf.length, address,port);(buf,buf.length, address,port);9. 9. 发送数据包发送数据包 socket.send(packet); socket.send(packet); 10.10. 关闭关闭 socket socket.close();socket socket.close();
Java 语言编程技术 44
客户端接收包的步骤如下客户端接收包的步骤如下 ::1. 1. 定义数据成员定义数据成员 int port; InetAddress address;int port; InetAddress address; DatagramSocket socket;DatagramSocket socket; DatagramPacket packet;DatagramPacket packet; byte[] sendBuf=new byte[256];byte[] sendBuf=new byte[256];2. 2. 建立建立 socketsocket socket=new DatagramSocket();socket=new DatagramSocket();
Java 语言编程技术 45
3. 3. 向服务器发出请求报文向服务器发出请求报文 address=InetAddress.getByName(args[0]);address=InetAddress.getByName(args[0]); port=parseInt(args[1]);port=parseInt(args[1]); packet=new packet=new
DatagramPacket(sendBuf,256,address,port);DatagramPacket(sendBuf,256,address,port); socket.send(packet);socket.send(packet); 这个包本身带有客户端的信息这个包本身带有客户端的信息4. 4. 客户机等待应答客户机等待应答 packet=new DatagramPacket(sendBuf,256);packet=new DatagramPacket(sendBuf,256); socket.receive(packet);(socket.receive(packet);( 如果没有到就一直等如果没有到就一直等
待待 ,,因此实用程序要设置时间限度因此实用程序要设置时间限度 ) )
Java 语言编程技术 46
5. 5. 处理接收到的数据处理接收到的数据 String received=new String received=new
String(packet.getData(),0);String(packet.getData(),0); System.out.println(received);System.out.println(received);
数据报套接字首先是强调发送方和接收方的区数据报套接字首先是强调发送方和接收方的区别别 ,, 同时也指出服务器和客户之间的不同同时也指出服务器和客户之间的不同 ::
一个客户机必须事先知道服务器的地址和端一个客户机必须事先知道服务器的地址和端口口 ,, 以便进行初始连接以便进行初始连接
一个服务器从它接收到的数据报文中读取客户一个服务器从它接收到的数据报文中读取客户端的地址和端口端的地址和端口 ..
Java 语言编程技术 47
建立数据报 socket();
建立一个报文包 packet
等待请求报文
建立数据报 socket
建立一个请求包发出请求
获得对方地址构成信息包发送出去
创建接收包等待接收
Java 语言编程技术 48
UDP 通信 DatagramPacketDatagramPacket 构造方法:构造方法:
DatagramPacket(byte [] recvBuf, DatagramPacket(byte [] recvBuf, int readLength)int readLength)
用于用于接收 UDPUDP 包。包。 DatagramPacket(byte [] sendBuf, int DatagramPacket(byte [] sendBuf, int
sendLength, InetAddress iaddr, int iport)sendLength, InetAddress iaddr, int iport)
用于用于发送 UDPUDP 包。包。
Java 语言编程技术 49
UDP 通信 DatagramSocketDatagramSocket 用来读写用来读写 UDPUDP 包。包。
DatagramSocket()DatagramSocket() 绑定本地主机的一个可用端口绑定本地主机的一个可用端口
DatagramSocket(int port)DatagramSocket(int port) 绑定本地主机的指定端口绑定本地主机的指定端口例如:例如: DatagramSocket socket DatagramSocket socket = new DatagramSocket();= new DatagramSocket();
Java 语言编程技术 50
发送与接收 发送发送
接收接收
DatagramPacket packet = new DatagramPacket(buf,buf.length, address,port);socket.send(packet);
DatagramPacket packet = new DatagramPacket(buf, 256);socket.receive(packet);
Java 语言编程技术 51
发送与接收 例 例 DatagramServer1.javaDatagramServer1.java DatagramClient.java DatagramClient.java
Java 语言编程技术 52
实现网络功能要靠实现网络功能要靠 URLURL 类类 , URLConection, URLConection 类类 , , SocketSocket 类和类和 DatagramSocketDatagramSocket 类类
网络上的数据传送是将网络连接转换成输入输网络上的数据传送是将网络连接转换成输入输出流出流 DataInputStreamDataInputStream 和和 DataOutputStream DataOutputStream
(PrintStream)(PrintStream) 是网间流的载体是网间流的载体 .. URLURL 适用于适用于 webweb 应用应用 ,, 如访问如访问 httphttp 服务器是高服务器是高层服务层服务 URLConectionURLConection 的另一边通常是的另一边通常是 cgicgi 程序程序 cgicgi 程序完成客户端与外部程序的交互程序完成客户端与外部程序的交互
总结
Java 语言编程技术 53
cgicgi 通过访问环境变量或读标准输入获得通过访问环境变量或读标准输入获得数据数据 SocketSocket 适用于面向连接的适用于面向连接的 ,, 可靠性要求高可靠性要求高的应用的应用 DatagramDatagram 适用于效率要求高的应用适用于效率要求高的应用 SocketSocket 是由是由 IPIP 和端口构成的一种网上通和端口构成的一种网上通信链路的一端信链路的一端 SocketSocket 通信要分别运行服务器和客户程序通信要分别运行服务器和客户程序 服务器程序是多线程的服务器程序是多线程的 ,, 可处理多个客户可处理多个客户的请求的请求