第十一章 Java的网络功能.

Slides:



Advertisements
Similar presentations
软件编程基础 一、程序的编辑 Java 源程序是以 Java 为后缀的简单的文本文件,可以用各种 Java 集成开发环境中的源代码编辑器来编写,也可以用其他文 本编辑工具,如 Windows 中的记事本或 DOS 中的 EDIT 软件等。 利用文字编辑器编写下列程序 public class Hello.
Advertisements

第四章 类、对象和接口.
3.2 Java的类 Java 类库的概念 语言规则——程序的书写规范 Java语言 类库——已有的有特定功能的Java程序模块
项目6 通用堆栈.
檔案處理.
四資二甲 第三週作業 物件導向程式設計.
第五章 字符串.
第二十章 圖型介面與網路對播 (GUI and Intercross Transition) 20-1 簡介 20-2 ActionListener Interface 20-3 ActionEvent Class 20-4 Vector Class 20-5 圖型介面與視窗關閉 20-6 圖型介面與資料顯示.
第十讲 网络通信 1、网络基本概念 2、Java与Internet 3、使用InetAddress 4、使用URL 5、Socket通信
第十五章 网络编程.
网络程序设计 第二章 客户端Socket用法详解.
第 5 章 流程控制 (一): 條件分支.
第9章 网络通信 1.
第二章 JAVA语言基础.
目标 运用File类进行文件操作 理解流,标准输入/输出流的概念
实验4 基于Socket的C/S程序开发 实验目的
第九章 字符串.
Ch02 視窗Swing套件 物件導向系統實務.
程式設計實作.
2.1 基本資料型別 2.2 變數 2.3 運算式與運算子 2.4 輸出與輸入資料 2.5 資料型別轉換 2.6 實例
Java语言程序设计 清华大学出版社 第9章 网络通信.
2018/11/15 面向对象与多线程综合实验-GUI设计 教师:段鹏飞.
例外處理(Exception Handling)
第14章 Java网络编程 Java语言提供了强大的网络编程功能,能够处理各种网络资源以及进行网络通信。java.net包定义了Java语言网络编程的主要工具类。其中,包括代表网络IP地址的InetAddress类;与URL有关的URL类和URLConnection类;与网络通信有关的Socket类和ServerSocket类。本章包括以下知识点。
Java 第28讲:建立删除文件 主讲教师:李焱 讲师.
崑山科技大學資訊管理系 伺服網頁程式設計 系統開發細部流程 教師:游峰碩.
JAVA 编 程 技 术 主编 贾振华 2010年1月.
C#程序设计 c# programming 网络编程 C#程序设计课程组.
西南科技大学网络教育系列课程 高级语程序设计(Java) 第五章 继承、接口与范型.
程式設計實作.
記事本 物件導向系統實務.
第11章 Java网络编程 本章要点 11.1 网络基础 11.2 InetAddress编程 11.3 URL编程
西南科技大学网络教育系列课程 高级语程序设计(Java) 第十一章 Java 中的网络编程.
2018/12/3 面向对象与多线程综合实验-网络编程 教师:段鹏飞.
2018/12/3 面向对象与多线程综合实验-网络编程 教师:段鹏飞.
Java语言程序设计 第五部分 Java异常处理.
辅导课程六.
网络常用常用命令 课件制作人:谢希仁.
實作輔導 3 日期: 4/14(星期六) 09:10~12:00、13:10~16:00
Chapter 11:Java网络编程 授课教师:赵小敏 浙江工业大学 软件学院
异常及处理.
4、按钮事件.
C/C++/Java 哪些值不是头等程序对象
Java语言程序设计 清华大学出版社 第8章 输入输出流(1).
5.3 简单的tcp通讯 信息工程系 向模军 Tel: QQ:
SOA – Experiment 2: Query Classification Web Service
Multithread 多執行緒 以GUI為例了解物件以及Event
《JAVA程序设计》 语音答疑 辅导老师:高旻.
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
DQMClientDim.cxx及双光子练习
第二章 Java基本语法 讲师:复凡.
Java程式初體驗大綱 大綱 在學程式之前及本書常用名詞解釋 Hello Java!程式 在Dos下編譯、執行程式
计算机网络与网页制作 Chapter 07:Dreamweaver CS5入门
Select模型 本节内容 视频提供:昆山爱达人信息技术有限公司 视频录制:yang 官网地址:
2019/5/3 JAVA Socket(UDP).
第二章 Java语法基础.
第二章 Java基本语法 讲师:复凡.
WSAAsyncSelect 模型 本节内容 视频提供:昆山爱达人信息技术有限公司 视频录制:yang
阻塞式模型 本节内容 视频提供:昆山爱达人信息技术有限公司 视频录制:yang 官网地址:
C++语言程序设计 C++语言程序设计 第九章 类的特殊成员 第十一组 C++语言程序设计.
助教:廖啟盛 JAVA Socket(UDP) 助教:廖啟盛
PPT注意事项: 当前PPT课件文件必须和提供的源代码文件夹“代码”在同一目录中即不要移动文件夹“代码”的默认位置。
第2章 Java语言基础.
判斷(選擇性敘述) if if else else if 條件運算子.
第十二章 Java网络编程 1.URL编程 2.Socket网络编程 3.Datagram网络编程.
使用Fragment 本讲大纲: 1、创建Fragment 2、在Activity中添加Fragment
本章提要 ◆ 客户/服务器模型 ◆ Java编写客户应用程序 ◆ Java编写服务器应用程序
第二章 Java基础语法 北京传智播客教育
第二章 Java基本语法 讲师:复凡.
Summary
Presentation transcript:

第十一章 Java的网络功能

主要内容: 1、了解URL的构成,学会利用URL读取网络资源 2、熟悉java.net包 3、了解TCP/IP协议 4、掌握Socket的基本使用方法,学会建立Socket连接,实现客户端和服务器端通信 5、掌握利用UDP通信的方法 6、了解多客户端通信概念,掌握进行多客户通信的方法

11.1基本知识 11.1.1 计算机网络就是利用通信线路连接起来的、相互独立的,计算机集合 11.1.2 计算机协议就是针对计算机进行通信时,关于信息交互方式、交互秩序等所作出的规定。 常用协议: TCP、IP、UDP、SNMP、SMTP、FTP、HTTP

11.1.3 Java的网络功能 作为一门成功的网络编程语言,Java为用户提供了十分完善的网络功能: 获取网络上的各种资源    获取网络上的各种资源    与服务器建立连接和通信    传递本地数据

11.1.4 通信模式 Java是通过使用流模式来实现网络信息交互的。这种模式下,一个接口同时拥有两个流--输入流和输出流。   当一个进程向另一个进程发送数据时,只需将数据写入到相应接口的输出流上,而另一个进程在接口的“另一端”从输入流上读取数据

11.1.5 Java.net包 Java.net包提供了低级和高级的网络功能。它包含了大部分用于访问网络资源的类。 一、用于网络定位的类 URL类 URLConnection类 HttpURLConnection类 InetAddress类

二、用于建立服务器和客户端通信的类 Socket类 ServerSocket类 三、基于数据报的通信DatagramSocket DatagramPacket类

11.2网络功能与使用方法 网络功能按层次与使用方法分为三类 11.2.1 URL   这种方法是通过URL的网络资源表达式形式确定数据在网络中的位置,利用URL类中提供的方法,直接读入网络中的数据,或者将本地数据传送到网络的另一端。

11.2.2 Socket   是指两个程序通过网络进行通信的一种方式。在TCP/ IP协议下,客户端和服务器端通常使用socket来进行信息交流。这种方式也是传统中常用的一种方式。 11.2.3 DataGram   Datagram方式是三种网络功能中最低级的一种,它是一种面向非连接的、以数据报方式工作的通信。适用于网络状况不稳定下的数据传输和访问

11.3 URL 11.3.1 Internet上的寻址 IP是标识连接到Internet上的计算机的唯一的数字地址。 如:202.199.28.6. 人们更熟悉的是它的符号形式,也就是域名,如: www.sina.com.cn 。

URL是Unoform Resource Locator的缩写。 <schme>://[<user>][:password]/ <usr-path>  如:http://www.sina.com.cn/ http://java.sun.com/products/jdk/1.3/    download-windows.html

URL对象是通过定义在Java.net包中的URL类来进行构造的。构造方法有四种: 1.Public URL(String spec) spec--表示URL的字符串 例:URL url1=new URL(“http://sina.com.cn/”) 2.Public URL(URL context,String spec) 用于表示相对URL位置的定义。 例:URL url2=new   URL(getCodeBase(),”myfile.text”)

3.public URL(String protocol, String host,String file) String host,int port,String file) String protocol--协议 String host--主机名 int port--端口 String file--文件名

例:URL url3=newURL(“http”, ”www.sohu.com”,”myfile.txt”) 在使用上述构造方法时,会存在某些问题,因此,在类URL的构造方法中都声明抛出非运行时异常--MalformedURLException,所以在生成URL对象时要捕获,进行异常处理。

Try{   URL url3=new URL(“http”, ”www.sohu.com”,”myfile.txt”)     } catch(MalformedURLException e) { ….. } 三.常用方法 String getProtocol()  获取传输协议 String getHost()  获取主机名称 String getPort()  获取通信端口号 String getFile() String toString()   获取资源文件名称

例:链向另外的Web页UrlEx.java 创建URL对象、链接到相应主页的代码: {try {url1=new URL(s1); } catch(MalformedURLException g) {System.out.println(“不正确的 URL:"+url1); text1.setText("哈尔滨工业大学"); getAppletContext().showDocument(url1);

InputStream openStream() 打开输入流 用以读取URL位置的数据,其返回值是一个InputStream数据流 例:读指定文件在屏幕上显示 ReadFromURL.java 用于建立流的代码: try{ url=new URL(getCodeBase(),"ReadFromUrl.java"); dis=new DataInputStream(url.openStream());} catch(MalformedURLException q) {System.out.println("MalformedURLException:"+q); }

从流中读取数据的代码: try{ while((readstring=dis.readLine())!=null) { e.drawString(readstring,10,i ); i=i+20; } e.drawString("end of the file",10,i); dis.close(); } catch(IOException g){ System.out.println("IOException:"+g);

11.4同服务器进行通信 11.4.1 套接字(Socket和ServerSocket) IP地址标识Internet上的计算机 端口号标识正在计算机上运行的进程 端口号定义为0--65535之间的一个16位整数,其中0--1023被一些特定服务器占用如:      telnet占用端口23     http占用端口80     SMTP占用端口25 普通用户端口号 只能是1024--65535之间 端口号与IP地址的组合得出一个网络套接字

11.4.2 客户端建立套接字 客户端程序可使用Socket类建立与服务器的套接字连接,Socket类的构造方法是: 11.4.2 客户端建立套接字 客户端程序可使用Socket类建立与服务器的套接字连接,Socket类的构造方法是: Socket(String host,int port)   host---服务器地址 port---端口号 当 用本地机充当 服务器时,host 用“localhost”表示 例: Socket mysocket=new Socket( “http://sina.com.cn/”,3980);  Socket mysocket=new Socket( “ localhost”,2880); 

建立套接字时可能发生IOException异常,应当捕获,格式如下: try{ Socket mysocket=new Socket(     “http://sina.com.cn”,2880);   } catch(IOException e) {…..} 当套接字连接mysocket建立后可使用getInputStream()方法获得一个输入流,用于接收服务器发来的信息 使用getOutputStream()方法获得一个输出流,用于将信息发送至服务器端

11.4.3 建立服务器套接字 为响应客户端的呼叫,服务器端必须建立一个等待接收客户套接字的服务器套接字 11.4.3 建立服务器套接字 为响应客户端的呼叫,服务器端必须建立一个等待接收客户套接字的服务器套接字 可用ServerSocket类创建服务器套接字 Socket mysocket=new Socket(“ localhost”, 2880);  ServerSocket的构造方法是: ServerSocket(int port) port--客户端建立连接时使用的同一端口号 ServerSocket serversocket=new    ServerSocket(2880);

建立服务器套接字时可能发生IOException异常,应当捕获,格式如下: try{ ServerSocket serversocket=new  ServerSocket(2880);      } catch(IOException e) {…..}

11.4.4 接收客户端套接字 当服务器端的套接字连接serversocket建立后,可使用ServerSocket类中的accept()方法接收客户端套接字mysocket, 格式为: Socket sc=serversocket.accept(); 接收客户端套接字的过程也可能发生IOException异常,应当捕获: try{ Socket sc=serversocket.accept(); } catch(IOException e){…..}

收到客户套接字后,放到一个Socket对象sc中,那么服务器套接字sc就是客户端套接字mysocket。 服务器端也可以通过服务器套接字sc使用方法 getInputStream() 获得一个输出流有,用于向客户端发送信息 使用方法 getOutputStream() 获得一个输入流,用于接收客户端发来的信息

网络连接模式 服务器端 客户端 Socket(host,port) ServerSocket(port) accept()  网络连接模式 接收客户 套接字 建立服务器端 套接字 建立客户端 套接字 服务器端 客户端 Socket(host,port) ServerSocket(port) accept() 获得客户端 输入输出流 获得服务器端 输入输出流 OutputStream OutputStream InputStream InputStream 至此,就将网络 通信转化为IO操作  close()  close()

例:一个简单的通信程序客户端的主要代码 建立套接字, 获得IO对象 try{mysocket=new Socket("localhost",3456);  in=new DataInputStream(      mysocket.getInputStream());  out=new DataOutputStream(      mysocket.getOutputStream()); 向服务器发送信息 out.writeUTF("hello!"); 等待接收服务器 发送的信息 while(true) {  s=in.readUTF();   if(s!=null) break;}   mysocket.close(); }

catch(IOException e){  System.out.println("not           connected");}   System.out.println(s);  } }

服务器端程序主要代码 建立服务器端 套接字 try{server=new ServerSocket(3456);} catch(IOException e1){   System.out.println("Error:"+e1);} 接收客户端 套接字 try{ client=server.accept(); in=new DataInputStream(         client.getInputStream()); out=new DataOutputStream(         client.getOutputStream());

out.writeUTF("Hello,i am server."); you.close(); catch(IOException e){ while(true) { s=in.readUTF(); if(s!=null) break; } out.writeUTF("Hello,i am server."); you.close(); catch(IOException e){ System.out.println("Erro:"+e);} }} 接收客户端信息 并给出应答

s=new ServerSocket(portnub); …… for (;;) 五.服务多个客户  如果允许多个客户同时连接到服务器上,可以利用多线程来实现。 s=new ServerSocket(portnub); …… for (;;) {Socket incoming = s.accept( ); …..      new ThreadHandler(incoming, i).start(); i++; }

例:一个聊天程序 public void run() { try { DataInputstream in = new DataInputstream         (incoming.getInputStream()); DataOutputStream out = new DataOutputStream (incoming.getOutputStream());   out.println( "Hello! Enter BYE to exit." ); boolean done = false; while (!done) { String str = in.readLine(); if (str == null) done = true; 。。。 例:一个聊天程序

11.5基于数据报的通信 数据报是一种无连接的通信服务 数据报的特点: 速度快 稳定性差 DatagramSocket类实现了一种适用于数据报的socket,用于监听本地主机上的指定端口 DatagramPacket类实现了从指定的缓冲区接收数据,通过DatagramSocket实例调用receive()使其处于堵塞状态,一直到接收到数据为止。

11.5.1 接收数据报 创建一个DatagramSocket实例用来监听本地主机上的指定端口 DatagramSocket socket=new DatagramSocket(9999); 创建一个Datagrampacket实例,用以从指定的缓冲区接收数据 DatagramPacket packet=new DatagramPacket(buffer,buffer.length); 用DatagramSocket提供的方法receive()接收数据   socket.receive(packet);

例:下面为一接收数据报程序 public class UDPGet extends Frame implements ActionListener {TextArea textArea1=new TextArea(); Button button1=new Button();

public static void main(String args[]) {   UDPGet get=new UDPGet(); get.setLocation(100,100); get.setSize(300,200); get.show(); get.waitForData(); }

public UDPGet() {try{ this.setTitle("接收数据报"); textArea1.setText(""); button1.setLabel("退出"); this.add(textArea1,BorderLayout.CENTER);   this.add(button1,BorderLayout.SOUTH); button1.addActionListener(this);} catch(Exception e){e.printStackTrace() }}

void waitForData() { try{ byte[] buffer=new byte[1024]; DatagramPacket packet=new   DatagramPacket(buffer,buffer.length); DatagramSocket socket=new      DatagramSocket(9999);

while(true) {socket.receive(packet); String s=new String(buffer ,0,packet.getLength()); textArea1.append(s+"\n"); packet=new DatagramPacket(        buffer,buffer.length); } } catch(Exception e){} }

public void actionPerformed( ActionEvent e) {Component com=    (Component)e.getSource(); if(com.equals(button1)) System.exit(0); }

二.发送数据报 首先创建一个DatagramPacket实例,用于指定要发送的数据、数据长度、目的地主机名的端口号 DatagramPacket packet=new DatagramPacket(      message,len,”localhost”,9999); message为一byte型数组 再用DatagramSocket类对象的成员方法send() 来发送数据    socket.send(packet); 例:下面为一个发送数据的例子

public class UDPSend extends Frame implements ActionListener { GridLayout net; TextField textField1=new TextField(); Button button1=new Button(); Button button2=new Button();

public static void main(String args[]) { UDPSend send=new UDPSend(); send.setLocation(100,100); send.setSize(300,150); send.show(); }

public UDPSend() {try{ this.setTitle("发送数据报"); button1.setLabel("发送"); button2.setLabel("退出"); net=new GridLayout(3,1); setLayout(net); this.add(textField1,null); this.add(button1,null);

this.add(button2,null); textField1.addActionListener(this); button2.addActionListener(this); button1.addActionListener(this); } catch(Exception e) {e.printStackTrace();

void sendData() { try {String msg=textField1.getText(); if(msg.equals("")) return; textField1.setText(""); InetAddress address=InetAddress .getByName("localhost"); int len=msg.length(); void sendData() { try {String msg=textField1.getText(); if(msg.equals("")) return; textField1.setText(""); InetAddress address=InetAddress .getByName("localhost"); int len=msg.length(); byte[] message=new byte[len]; msg.getBytes(0,len,message,0); DatagramPacket packet=new DatagramPacket(message,len,address,9999); DatagramSocket socket=new DatagramSocket(); socket.send(packet);} catch(Exception e){} } public void actionPerformed(ActionEvent e) {Component com=(Component)e.getSource(); if(com.equals(button1)) sendData(); else if(com.equals(button2)) System.exit(0); else sendData(); } }

byte[] message=new byte[len]; msg.getBytes(0,len,message,0); DatagramPacket packet=new DatagramPacket( message,len,address,9999); DatagramSocket socket=new DatagramSocket(); socket.send(packet);} catch(Exception e){…..} }

public void actionPerformed( ActionEvent e) {Component com=(Component )e.getSource(); if(com.equals(button1)) sendData(); else if(com.equals(button2)) System.exit(0); else sendData();} }