64
第第第第 网网网网网网 1 第第第第第第 第第第第第 第第第 [email protected] http://211.155.231.249:8009

第十二章 网络程序设计

  • Upload
    orsen

  • View
    97

  • Download
    0

Embed Size (px)

DESCRIPTION

第十二章 网络程序设计. 浙江工业大学 计算机学院 赵小敏 [email protected] http://211.155.231.249:8009. 1. 主要内容. 统一资源定位地址 (URL) 基于 TCP 的网络程序设计 基于 UDP 的网络程序设计 基于 SSL 的网络程序设计. 2. Internet 地址. 在 Internet 上的计算机通过 IP (Internet Protocol) 地址标识 示例 : 216.239.53.100 域名 : www.google.com - PowerPoint PPT Presentation

Citation preview

Page 1: 第十二章   网络程序设计

第十二章 网络程序设计

11

浙江工业大学 计算机学院赵小敏[email protected]://211.155.231.249:8009

Page 2: 第十二章   网络程序设计

22

主要内容

统一资源定位地址 (URL)

基于 TCP 的网络程序设计 基于 UDP 的网络程序设计 基于 SSL 的网络程序设计

Page 3: 第十二章   网络程序设计

33

Internet 地址

在 Internet 上的计算机通过 IP (Internet Protocol) 地址标识 示例 : 216.239.53.100

域名 : www.google.com

类 java.net.InetAddress 用来表示 Internet 地址,它有两个子类,分别是 java.net.Inet4Address 和 java.net.Inet6

Address

Page 4: 第十二章   网络程序设计

44

创建类 InetAddress 的实例对象

类 InetAddress 并不具有 public 的构造方法 但可以通过下列方法构造 :

static InetAddress getByAddress(byte[ ] addr)

static InetAddress getByName(String host)

static InetAddress getLocalHost()

Page 5: 第十二章   网络程序设计

例 1 :网络地址的例程1. import java.net.InetAddress;2. import java.net.UnknownHostException;3. public class InetAddressDemo{4. public static void main(String args[]){5. String s = "www.zjut.edu.cn";6. InetAddress zjut= null;

7. try{ 8. zjut = InetAddress.getByName(s);9. }10. catch (UnknownHostException e){ 11. System.err.println(e);12. }13. if (ts!=null){14. System.out.println("The IP address of zjut is "15. + zjut.getHostAddress( ));16. System.out.println("The host name of zjut is "17. + zjut.getHostName( ));18. }19. else System.out.println("Cannot access " + s);20. }21. }

Page 6: 第十二章   网络程序设计

66

URL

类 URL 是网络资源定位器 (Uniform Resou

rce Locator), 指向网页 (World Wide Web)

上的一个资源。 这里的资源可以是文件 / 目录,也可以是一些

复杂的对象,如数据库或搜索引擎 (search e

ngine) 。

Page 7: 第十二章   网络程序设计

77

URL 的格式 (Protocol)(Host)[:Port][File][#Reference]

示例 http://www.ncsa.uiuc.edu:8080/demoweb/urlprimer.html#I

NSTALL

http://211.155.231.249:8009/java

http://localhost:8080/index.html#bottom

ftp://166.111.233.143/java/

mailto:[email protected]

Page 8: 第十二章   网络程序设计

88

端口号 : Port 端口号 (Port)

范围 : 0-65535 (16 bits) 。 小于 1024: 用来对应特定的服务 ( 例如 : telnet, S

MTP, ftp 等等 ) 。 服务端与客户端必须采用相同的端口号。

Page 9: 第十二章   网络程序设计

99

类 : java.net.URL 类 java.net.URL 的实例对象表示具体的 URL 。 public final class URL 。 类 java.net.URL 的中构造方法 :

public URL(String u) throws MalformedURLException

public URL(String protocol, String host, String file) thro

ws MalformedURLException

public URL(String protocol, String host, int port, String

file) throws MalformedURLException

Page 10: 第十二章   网络程序设计

1010

剖析 URL 类 java.net.URL 具有五个成员方法,可以用

来获取 URL 的五个部分 :

public String getProtocol( )

public String getHost( )

public int getPort( )

public String getFile( )

public String getRef( )

Page 11: 第十二章   网络程序设计

1. import java.net.*;2. import java.io.*;

3. public class ParseURL {4. public static void main(String[] args) throws Exception {5. 6. URL aURL = new

URL("http://java.sun.com:80/docs/books/"7. + "tutorial/index.html#DOWNLOADING");8. System.out.println("protocol = " + aURL.getProtocol());9. System.out.println("host = " + aURL.getHost());10. System.out.println("filename = " + aURL.getFile());11. System.out.println("port = " + aURL.getPort()); 12. System.out.println("ref = " + aURL.getRef());13. }14. }

输出结果:protocol = httphost = java.sun.comfilename = /docs/books/tutorial/index.htmlport = 80ref = DOWNLOADING

例 2 :解析 URL 的例程

Page 12: 第十二章   网络程序设计

从 URL 读取 WWW 网络资源

当我们得到一个 URL 对象后,就可以通过它读取指定的 WWW 资源。这时我们将使用URL 的方法 openStream() ,其定义为:  InputStream openStream();

方法 openSteam() 与指定的 URL 建立连接并返回 InputStream 类的对象以从这一连接中读取数据。

Page 13: 第十二章   网络程序设计

读取网络资源数据的一般步骤

① 创建类 URL 的实力对象,使其指向给定的网络资源;

② 通过类 URL 的成员方法 openStream 建立 URL连接,并返回输入流对象的引用,以便读取数据;

③ 可选步骤,通过 java.io.BufferedInputStream 或java.io.BufferedReader 封装输入流;

④ 读取数据,并进行数据处理;⑤ 关闭数据流。

Page 14: 第十二章   网络程序设计

1. import java.io.*;

2. import java.net.*;3. public class URLReader {4. public static void main(String[] args) throws Exception { 5. URL tirc = new URL("http://www.yahoo.com/"); 6. BufferedReader in = new BufferedReader(new

InputStreamReader(tirc.openStream()));

7. String inputLine; 8. File outfile = new File("test.html"); 9. PrintWriter out = new PrintWriter(new FileWriter(outfile));10. while ((inputLine = in.readLine()) != null) {11. // 从输入流中不断读取数据直到读完为止12. out.println(inputLine); // 把读入的数据写入 test.html13. }14. in.close(); // 关闭输入流15. out.close();16. }17. }

例 3 :获取网络资源的例程

Page 15: 第十二章   网络程序设计

1515

主要内容

统一资源定位地址 (URL)

基于 TCP 的网络程序设计 基于 UDP 的网络程序设计 基于 SSL 的网络程序设计

Page 16: 第十二章   网络程序设计

1616

传输控制协议 TCP 传输控制协议 TCP (Transfer Control Protoc

ol) 是一种基于连接的协议,可以在两台计算机之间提供可靠的数据传输。 基于连接的协议,可提供可靠的数据传输 服务器端与客户端通过 TCP 协议进行通讯 连接通道的两端称为套接字 (Socket)

Page 17: 第十二章   网络程序设计

1717

基于 TCP 的 网络数据通信模型

服务器端

ServerSocket(port#)

ServerSocket.accept()

OutputStream

InputStream

Socket.close()

客户端

Socket(host, port#)

OutputStream

InputStream

Socket.close()

Page 18: 第十二章   网络程序设计

1818

类 java.net.Socket

类 java.net.Socket 允许如下的四种基本操作1. 连接到远程的机器

2. 发送数据

3. 接收数据

4. 关闭连接

Page 19: 第十二章   网络程序设计

1919

类 java.net.Socket 中的成员方法 构造方法 getInputStream(): 返回该 socket 所对应的

输入流 getOutputStream(): 返回该 socket 所对应的

输出流

Page 20: 第十二章   网络程序设计

2020

创建类 Socket 的实例对象 构造方法

Socket()

Socket(InetAddress address, int port)

Socket(InetAddress address, int port, InetAddress localAddr, int localPort)

Socket(String host, int port)

Socket(String host, int port, InetAddress localAddr, int localPort)

示例 : Socket javaSite = new Socket("java.sun.com", 80);

Page 21: 第十二章   网络程序设计

类 java.net.ServerSocket

ServerSocket 类的主要方法(1) Socket accept() throws IOException

等待客户连接,该方法将阻塞当前系统服务线程,直到连接成功。该方法返回一个套接字类对象,通过该套接字,新的服务子线程与连接的客户进行通信。

(2) Void close() throws IOException

      关闭套接字

Page 22: 第十二章   网络程序设计

怎样用 socket 进行客户与服务器通信

Socket 是两个实体之间进行通信的有效端点。通过Socket 可以获得源 IP 地址和源端口、终点 IP 地址和终点端口。用户可以将多个 socket 连入同一个端口,以便对于单个端口可以有多个连接。

通过 Socket 客户 / 服务器编程可以创建一个能被许多人使用的分布式程序,并且所有客户均可以用统一的前端进行工作,并与服务器进行通信。

Page 23: 第十二章   网络程序设计

与服务器通信必须具备三个条件

服务器程序 客户程序 连接它们的 Socket 程序

Page 24: 第十二章   网络程序设计

ServerSocket 类

它的实例使服务器能够检测到指定端口的信息 accept() 方法可以使服务器检测到指定端口的

活动 服务器还负责检测要求与它连接的客户。

Page 25: 第十二章   网络程序设计

Socket 类

getInputStream() 和 getOutStream() 方法来发送和捕捉数据。

try{

// 传递给它一个整数作为服务器指定可以使用的给定端口    ServerSocket myServerSocket=new ServerSocket(80);

   Socket mySocket=myServerSocket.accept(); // 检测端口的活动    }catch(Exception e){ }

Page 26: 第十二章   网络程序设计

  Accept() 方法直到接收到用户的连接请求,才继续执行中断的执行程序。一旦客户的连接成功, mySocket 就代表该连接,并且可以发送和接收数据。

最后,我们看一看客户是怎样请求连接的。其连接方法如下:

try{

  Socket mySocket=new Socket("www.yahoo.com",80);

}catch(Exception e ){ }

Socket 类

Page 27: 第十二章   网络程序设计

(一 )TCP 协议通信的服务器方实现(1) 假设服务器工作在端口 8000 上,ServerSocket svrsoc = ServerSocket(8000)Socket soc = svrsoc.accept();// 监视端口 8000

的连接请求(2) 打开与 soc 绑定的输入 / 输出流:In=new BufferedReader(new

InputStreamRead(soc.getInputStream()));// 在套接字 soc 上绑定的输入流基础上构造

BufferedReader 对象

Page 28: 第十二章   网络程序设计

TCP 协议通信的服务器方实现(续)out=new PrintWrite(new bufferedWrite(new

OutputStreamWrite(soc.getOutputStream())),true);

// 在套接字 soc 上绑定的输出流基础上构造PrintWrite 对象

服务器使用 in 和 out 两个实例从客户接收输入信息和向客户程序发信息,同样,在客户端也应该建立这两个对象,用来与服务器程序进行双向通信。

Page 29: 第十二章   网络程序设计

(一 ) TCP 协议通信的服务器方实现(续)(3) 获取客户机的 IP 地址,并在服务器窗口中

显示客户机的地址信息:clientIP=soc.getInetAddress();

System.out.println(“Client’s IP address:”+clientIP);

(4) 读入一行客户的输入,并回显该行 String str = in.readLine();

while(!str.equals(“quit”));{

System.out.println(“Client said:”+str);

str=in.readLine();

}

Page 30: 第十二章   网络程序设计

(一 ) TCP 协议通信的服务器方实现(续)(5) 不断循环以上代码,直到客户输入“ quit” 为

止。System.out.println(“Client want to leave.”);

finall{

in.close();

out.close();

soc.close();

svrsoc.close();

}

Page 31: 第十二章   网络程序设计

(二 ) TCP 协议通信的客户方实现

(1) 创建一个指向固定主机的固定端口的 Socket : Socket soc = new Socket(“localhost”,8000);

(2) 从 Socket 对象中获取与其绑定的输入和输出流

In=new BufferedReader(new InputStreamRead(soc.getInputStream()));

out=new PrintWrite(new bufferedWrite(new OutputStreamWrite(soc.getOutputStream())),true);

Page 32: 第十二章   网络程序设计

(二 ) TCP 协议通信的客户方实现(续 )

(3) 建立输入 / 输出流后,从服务器读取发来的” welcome!” 信息,显示在窗口:

Strin=in.readLine();

System.out.println(“Server said:”+strin);

Page 33: 第十二章   网络程序设计

(二 ) TCP 协议通信的客户方实现(续 )(4) 客户向服务器发送的数据流从键盘获取byte bmsg[]=new byte[200];

System.in.read(bmsg); // 从键盘读入 bmsg

String msg=new String(bmsg,0); //byte 型转 String型

Msg=msg.trim(); // 删除 msg 两边的空格

Page 34: 第十二章   网络程序设计

(二 ) TCP 协议通信的客户方实现(续 )

(5) 当键盘输入不是“ quit” 时,将键盘输入的数据写入输出流中,并发送出去,然后继续从键盘获取输入数据,不断循环,直到输入“ quit” 时,先将其传送给服务器,然后关闭输入 / 输出流和 Socket:

out.println(strout);In.close();out.close();soc.close();System.exit(0);

Page 35: 第十二章   网络程序设计

一个简单的客户端 /服务器程序1. import java.net.*; 2. import java.io.*; 3. import java.lang.*;

4. public class myserver{ 5. public static void main(String args[]){ 6. ServerSocket server; 7. Socket socket; 8. String s; 9. InputStream Is; 10. OutputStream Os; 11. DataInputStream DIS; 12. PrintStream PS;

13. try{ 14. server=new ServerSocket(4321); 15. socket=server.accept();16. System.out.println("server ok"); 17. System.out.println("************************************************"); 18. System.out.println("");

Page 36: 第十二章   网络程序设计

19. Is=socket.getInputStream(); 20. Os=socket.getOutputStream(); 21. DIS=new DataInputStream(Is); 22. PS=new PrintStream(Os); 23. DataInputStream in=new DataInputStream(System.in); 24. while(true){ 25. System.out.println(""); 26. System.out.println("please wait client's message..."); 27. System.out.println(""); 28. s=DIS.readLine(); 29. System.out.println("client said:"+s); 30. if(s.trim().equals("BYE"))break; 31. System.out.print("you say:"); 32. s=in.readLine(); 33. PS.println(s); 34. if(s.trim().equals("BYE"))break; 35. } 36. DIS.close(); 37. PS.close(); 38. Is.close(); 39. Os.close(); 40. socket.close(); 41. } catch(Exception e){ 42. System.out.println("Error:"+e); 43. } //catch44. } //main45. } //public class

Page 37: 第十二章   网络程序设计

1. import java.net.*; 2. import java.io.*; 3. import java.lang.*;

4. public class myclient{ 5. public static void main(String args[]){ 6. if (args.length<1){7. System.out.println("Please input the Server Name or IP!"); 8. System.out.println("see also: myclient 127.0.0.1"); 9. System.exit(1); } //if

10. Socket socket; 11. String s=“[email protected]"; 12. String len; 13. InputStream Is; 14. OutputStream Os; 15. DataInputStream DIS; 16. PrintStream PS; 17. try{ 18. socket=new Socket(args[0],4321);

19. System.out.println("client ok"); 20. System.out.println("************************************************"); 21. System.out.println("");

Page 38: 第十二章   网络程序设计

22. Is=socket.getInputStream(); 23. Os=socket.getOutputStream(); 24. DIS=new DataInputStream(Is); 25. PS=new PrintStream(Os); 26. DataInputStream in=new DataInputStream(System.in); 27. while(true){ 28. System.out.print("you say:"); 29. s=in.readLine(); 30. PS.println(s); 31. if(s.trim().equals("BYE"))break; //32. else 33. { 34. System.out.println(""); 35. System.out.println("please wait server's message..."); 36. System.out.println(""); 37. } 38. s=DIS.readLine(); //´39. System.out.println("server said:"+s); 40. if(s.trim().equals("BYE"))break; } 41. DIS.close(); //42. PS.close(); //43. Is.close(); //44. Os.close(); // 45. socket.close(); //46. } catch(Exception e){ 47. System.out.println("Error:"+e); 48. } 49. } 50. }

Page 39: 第十二章   网络程序设计

(三 )支持多客户的 client/server 程序设计 在实际应用中,往往是在服务器上运行一个永久的程

序,它可以接收来自其他多个客户端的请求,提供相应的服务。

利用多线程实现多客户机制 : 服务器总是在指定的端口上监听是否有客户请求,一旦监听到客户请求,服务器就会启动一个专门的服务线程来响应该客户的请求,而服务器本身在启动完线程之后马上又进入监听状态,等待下一个客户的到来。

实现程序包括服务器端主程序、服务器端通信的线程程序和客户端程序

Page 40: 第十二章   网络程序设计

支持多客户的 C/S 程序步骤

1 、服务器端主程序(1) 创建 ServerSocket 对象;(2) 循环侦听客户端的请求,若监听到客户请求,

根据得到的 Socket 对象和客户端连接数创建服务线程,并启动该线程;

(3) 关闭 ServerSocket 对象。

Page 41: 第十二章   网络程序设计

服务器端程序1. import java.io.*;2. import java.net.*;

3. public class MultiTalkServer{4. static int clientnum=0;// 静态成员变量,记录当前客户的个数5. public static void main(String args[ ]) {6. ServerSocket serverSocket=null;7. boolean listening=true;8. try{9. serverSocket=new ServerSocket(4700); 10. System.out.println("Server is running...");11. // 创建一个 ServerSocket 在端口 4700 监听客户请求12. }catch(IOException e) {13. System.out.println("Could not listen on port:4700."); 14. System.exit(-1); // 退出15. }

Page 42: 第十二章   网络程序设计

服务器端程序 (续 )16. try{17. while(listening){// 永远循环监听18. new ServerThread(serverSocket.accept(),+

+clientnum).start();19. // 监听到客户请求,根据得到的 Socket 对象和20. // 客户计数创建服务线程,并启动之21. System.out.println("Client-"+(clientnum)+" is

connected...");22. }23. serverSocket.close(); // 关闭 ServerSocket24. }catch(IOException e){25. System.out.println(" 连接客户端失败 "); 26. }27. }28. }

Page 43: 第十二章   网络程序设计

支持多客户的 C/S 程序步骤 (续 )

2 、服务器端通信的线程程序(1) 定义一个线程类(2) 通过构造方法将服务器端程序传递的 Socket

对象和客户端连接数赋值给相应的变量(3) 线程体 run 方法:通过得到的 Socket 对象获

取输入输出流对象,通过循环与客户端发送和接收数据。若循环结束,关闭 Socket 对象和输入输出流对象

Page 44: 第十二章   网络程序设计

服务器端通信的线程程序1. import java.io.*;2. import java.net.*;3. public class ServerThread extends Thread{4. Socket socket=null; // 保存与本线程相关的 Socket 对象5. int clientnum; // 保存本进程的客户计数6. public ServerThread(Socket socket,int num) { // 构造函数7. this.socket=socket;//初始化 socket 变量8. clientnum=num+1;//初始化 clientnum 变量9. }10. public void run() {// 线程主体11. try{12. String line;13. // 由 Socket 对象得到输入流,并构造相应的 BufferedReader 对象14. BufferedReader is=new BufferedReader(new

InputStreamReader(socket.getInputStream()));15. // 由 Socket 对象得到输出流,并构造 PrintWriter 对象16. PrintWriter os=new PrintWriter(socket.getOutputStream());17. //由系统标准输入设备构造 BufferedReader 对象18. BufferedReader sin=new BufferedReader(new InputStreamReader(System.in));

Page 45: 第十二章   网络程序设计

⑲ // 在标准输出上打印从客户端读入的字符串⑳ System.out.println("Client-"+ clientnum +":" +is.readLine());㉑ // 从标准输入读入一字符串㉒ line=sin.readLine();

㉓ while(!line.equals("bye")){ // 如果该字符串为 "bye" ,则停止循环㉔ os.println(line); // 向客户端输出该字符串㉕ os.flush(); //刷新输出流,使 Client 马上收到该字符串㉖ System.out.println("Server:"+line); ㉗ ㉘ // 从 Client 读入一字符串,并打印到标准输出上㉙ System.out.println("Client-"+ clientnum +":" +is.readLine());㉚ line=sin.readLine(); // 从系统标准输入读入一字符串㉛ } //继续循环

㉜ os.close(); // 关闭 Socket 输出流㉝ is.close(); // 关闭 Socket 输入流㉞ socket.close(); // 关闭 Socket㉟ }catch(Exception e){㊱ System.out.println("Error:"+e); ㊲ }㊳ } ㊴ }

Page 46: 第十二章   网络程序设计

支持多客户的 C/S 程序步骤 (续 )

3 、客户端程序(1) 创建与服务器连接的 socket 对象(2) 通过 Socket 对象获取输入输出流对象,通

过循环与客户端发送和接收数据。若循环结束,关闭 Socket 对象和输入输出流对象。

Page 47: 第十二章   网络程序设计

客户端程序1. import java.io.*;2. import java.net.*;3. public class TalkClient {4. public static void main(String args[]) {

5. try{6. // 向本机的 4700 端口发出客户请求7. Socket socket=new Socket("127.0.0.1",4700); 8. System.out.println("已连接服务器 , 请发消息给服务器处理 ...");

9. //由系统标准输入设备构造 BufferedReader 对象10. BufferedReader sin=new BufferedReader(new

InputStreamReader(System.in));11. // 由 Socket 对象得到输出流,并构造 PrintWriter 对象12. PrintWriter os=new PrintWriter(socket.getOutputStream());13. // 由 Socket 对象得到输入流,并构造相应的 BufferedReader 对象14. BufferedReader is=new BufferedReader(new

InputStreamReader(socket.getInputStream()));

Page 48: 第十二章   网络程序设计

客户端程序 (续 )1. String readline;2. readline=sin.readLine(); // 从系统标准输入读入一字符串3. while(!readline.equals("bye")){ //若输入字符串为 "bye"则停止循环4. //将从系统标准输入读入的字符串输出到 Server5. os.println(readline); 6. //刷新输出流,使 Server 马上收到该字符串7. os.flush(); 8. // 在系统标准输出上打印读入的字符串9. System.out.println("Client:"+readline);

10. // 从 Server 读入一字符串,并打印到标准输出上11. System.out.println("Server:"+is.readLine()); 12. // 从系统标准输入读入一字符串13. readline=sin.readLine(); 14. } //继续循环

15. os.close(); // 关闭 Socket 输出流16. is.close(); // 关闭 Socket 输入流17. socket.close(); // 关闭 Socket18. }catch(Exception e) {19. System.out.println("Error"+e); // 出错,则打印出错信息20. }21. }22. }

Page 49: 第十二章   网络程序设计

课后思考? 服务器端如何控制客户端的连接数量? 服务器端如何广播信息给客户端? 如何实现图形用户界面的 C/S 聊天系统?

Page 50: 第十二章   网络程序设计

5050

主要内容

统一资源定位地址 (URL)

基于 TCP 的网络程序设计 基于 UDP 的网络程序设计 基于 SSL 的网络程序设计

Page 51: 第十二章   网络程序设计

5151

基于 UDP 的网络程序设计 UDP(User Datagram Protocol) 是一种简单

的不可靠的无连接的网络数据传输协议。 UDP 不保证数据包会顺利到达指定的主机,

也不保证数据包会按照发送顺序到达指定的主机。

基于 UDP 传输的数据传输过程:传输的数据首先封装在数据报包 (DatagramPacket),然后通过数据报套接字 (DatagramSocket) 的发送与接收。

Page 52: 第十二章   网络程序设计

5252

数据报包 java.net.DatagramPacket 构造方法

public DatagramPacket(byte[ ] buf, int length)

// 主要用于接收数据public DatagramPacket(byte[ ] buf, int length, InetAddres

s address, int port)

// 主要用来发送数据 成员方法

public InetAddress getAddress( )

public int getPort( )

public byte[ ] getData()

public int getLength()

Page 53: 第十二章   网络程序设计

5353

数据报套接字 java.net.DatagramSocket 构造方法protected DatagramSocket(int port)

// 绑定到特定端口接收广播的数据包 成员方法

public void send(DatagramPacket p) throws IOException

public void receive(DatagramPacket p) throws IOException

public void close()

Page 54: 第十二章   网络程序设计

基于 UDP 协议的网络编程步骤 服务器端的步骤如下 :1. 定义数据成员 DatagramSocket socket; DatagramPacket packet; InetAddress address;( 用来存放接收方的地址 ) int port; ;( 用来存放接收方的端口号 )2. 创建数据报文 Socket 对象 try { socket=new DatagramSocket(1111); }catch(java.net.SocketException e) { } socket 绑定到一个本地的可用端口 , 等待接收客户的请

求 .

Page 55: 第十二章   网络程序设计

基于 UDP 协议的网络编程步骤3. 分配并填写数据缓冲区 ( 一个字节类型的数组 )

byte[] Buf=new byte[256];

     存放从客户端接收的请求信息 .

4. 创建一个 DatagramPacket 对象 packet=new DatagramPacket(buf, 256);

    用来从 socket 接收数据 , 它只有两个参数 5. 服务器阻塞,等待客户端发送数据过来 socket.receive(packet);

    在客户的请求报道来之前一直等待

Page 56: 第十二章   网络程序设计

基于 UDP 协议的网络编程步骤6. 从接收的包中得到地址和端口号 InetAddress address=packet.getAddress(); int port=packet.getPort();7. 将数据送入缓冲区 或来自文件 ,或键盘输入8. 建立报文包 , 用来从 socket 上发送信息 packet=new DatagramPacket (buf,buf.length, address,port);

9. 发送数据包: socket.send(packet); 10. 10. 关闭 socket : socket.close();

Page 57: 第十二章   网络程序设计

基于 UDP 协议的网络编程步骤 客户端的步骤如下 :1. 定义数据成员 int port; InetAddress address; DatagramSocket socket; DatagramPacket packet; byte[ ] sendBuf=new byte[256];2. 创建 DatagramSocket 对象 socket=new DatagramSocket();

Page 58: 第十二章   网络程序设计

基于 UDP 协议的 Java 网络编程步骤3. 向服务器发出请求报文 address=InetAddress.getByName(args[0]); port=parseInt(args[1]); packet=new DatagramPacket(sendBuf,256,address,port); socket.send(packet);

     这个包本身带有客户端的信息4. 客户机等待应答 packet=new DatagramPacket(sendBuf,256);

socket.receive(packet);( 如果没有收到就一直等待 ,因此实用程序要设置时间限度 )

Page 59: 第十二章   网络程序设计

基于 UDP 协议的 Java 网络编程步骤5. 处理接收到的数据 String received=new String(packet.getData(),0);

System.out.println(received);

数据报套接字首先是强调发送方和接收方的区别 , 同时也指出服务器和客户之间的不同 :一个客户机必须事先知道服务器的地址和端口 , 以便进行连接一个服务器从它接收到的数据报文中读取客户端的地址和端口 .

Page 60: 第十二章   网络程序设计

基于 UDP 的网络程序模型建立数据报 socket;

建立一个报文包 packet

等待请求报文

建立数据报 socket

建立一个请求包

发出请求

获得对方地址

构成信息包

发送出去

创建接收包

等待接收

Page 61: 第十二章   网络程序设计

一个 UDP 协议的 C/S 例子

UDPServer.java UDPClient.java

Page 62: 第十二章   网络程序设计

6262

主要内容

统一资源定位地址 (URL)

基于 TCP 的网络程序设计 基于 UDP 的网络程序设计 基于 SSL 的网络程序设计

Page 63: 第十二章   网络程序设计

6363

基于 SSL 的网络程序设计

密钥和证书管理工具 keytool

基于 SSL 的服务器端和客户端程序 自定义安全提供程序和密钥管理器

Page 64: 第十二章   网络程序设计

作业

1 、使用 socket编写一个服务器端程序,服务器端程序在端口 8888 监听,如果它接到客户端发来的“ hello” 请求时会回应一个“ hello” ,对客户端的其他请求不响应。

2 、修改支持多客户的 client/server 程序,设定客户的最大连接数是 10 ,若超出 10则服务器给出信息“客户已达到最大连接数,请等待…”。要求用 GUI 实现。