Java语言程序设计 清华大学出版社 第9章 网络通信.

Slides:



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

1 Java 语言程序设计 计算机系 鲍金玲. 2 引子 甲骨文 甲骨文是全球最大的信息管理软件及服务供应商,成立于 1977 年,公司总部 设在美国加利福尼亚州的红木城( Redwood Shores ),全球员工达 名, 包括 名开发人员、 7500 多名技术支持人员和.
3.2 Java的类 Java 类库的概念 语言规则——程序的书写规范 Java语言 类库——已有的有特定功能的Java程序模块
项目6 通用堆栈.
檔案處理.
第 12 章 UDP 與 TCP.
Java程序设计教程 第一讲 Java概述.
四資二甲 第三週作業 物件導向程式設計.
实训十四、IE浏览器的基本应用.
第二十章 圖型介面與網路對播 (GUI and Intercross Transition) 20-1 簡介 20-2 ActionListener Interface 20-3 ActionEvent Class 20-4 Vector Class 20-5 圖型介面與視窗關閉 20-6 圖型介面與資料顯示.
第十五章 网络编程.
网络程序设计 第二章 客户端Socket用法详解.
了 解 Internet 从 ip 开 始.
第二章 JAVA语言基础.
第二部分 Java语言基础篇 第4章 Java语言与面向对象 (之一).
第十三章 網路檔案傳遞(File Transition)
第三章 控制结构.
学习目标: 1)理解包和包过滤 2)理解包过滤的方法 3)设置特殊的包过滤规则
程式設計實作.
第 12 章 UDP 與 TCP.
2.1 基本資料型別 2.2 變數 2.3 運算式與運算子 2.4 輸出與輸入資料 2.5 資料型別轉換 2.6 實例
第3讲 网络安全协议基础 此为封面页,需列出课程编码、课程名称和课程开发室名称。
例外處理(Exception Handling)
Java 第28讲:建立删除文件 主讲教师:李焱 讲师.
Java基础 JavaSE异常.
2018/11/20 第一章 Java概述 武汉大学计算机学院计算机应用系 2018/11/20 14:33.
網路服務 家庭和小型企業網路 – 第六章.
TCP/IP Protocol Suite TCP/IP協定 第二組 投影片製作by簡嘉宏 綦凱宏 林睿敏 滕孟哲.
JAVA 编 程 技 术 主编 贾振华 2010年1月.
C#程序设计 c# programming 网络编程 C#程序设计课程组.
程式設計實作.
第四章 基本輸出入 Java應用程式的輸出入介面有三種,分別是命令提示字元視窗、AWT元件、及Swing元件。本單元先介紹命令提示字元視窗,AWT請看第16、17章,Swing請看第20章。 輸入 輸出.
西南科技大学网络教育系列课程 高级语程序设计(Java) 第十一章 Java 中的网络编程.
第六讲 JSP中的文件操作(2) 教学目的 本讲继续讲述JSP中使用Java输入、输出流实现文件的读写操作 。 1 文件上传 2 文件下载
2018/12/3 面向对象与多线程综合实验-网络编程 教师:段鹏飞.
Java语言程序设计 第五部分 Java异常处理.
王豐緒 銘傳大學資訊工程學系 問題:JAVA 物件檔輸出入.
Java语言程序设计 第八部分 Applet小程序.
考试题型 填空题(30) 选择题(20) 名词解释(10) 问答题(24) 计算题(16) 附加题(30) 成绩核算:
實作輔導 3 日期: 4/14(星期六) 09:10~12:00、13:10~16:00
3.1 数据类型 3.2 标识符与关键字 3.3 常量 3.4 变量 3.5 运算符与表达式 3.6 一个编程实例
Chapter 11:Java网络编程 授课教师:赵小敏 浙江工业大学 软件学院
异常及处理.
第 12 章 UDP 與 TCP 著作權所有 © 旗標出版股份有限公司.
4、按钮事件.
C/C++/Java 哪些值不是头等程序对象
第十一章 Java的网络功能.
P2P聊天工具.
* 單元:電腦與問題解決 主題:Java物件導向程式設計-類別與物件 台南縣國立善化高中 蕭嘉民 老師
4.2通讯服务模块线程之间传递信息 信息工程系 向模军 Tel: QQ:
Web前端开发 第23章:网站发布 阮晓龙 / 河南中医药大学管理科学与工程学科
Web Server 王宏瑾.
Network Application Programming(3rd Edition)
《JAVA程序设计》 语音答疑 辅导老师:高旻.
第二章Java基本程序设计.
第二章 Java基本语法 讲师:复凡.
Java程式初體驗大綱 大綱 在學程式之前及本書常用名詞解釋 Hello Java!程式 在Dos下編譯、執行程式
2019/5/3 JAVA Socket(UDP).
第二章 Java语法基础.
第二章 Java基本语法 讲师:复凡.
第10讲 Web服务.
助教:廖啟盛 JAVA Socket(UDP) 助教:廖啟盛
Internet课程设计 教师:陈 妍 朱海萍 西安交通大学计算机系
PPT注意事项: 当前PPT课件文件必须和提供的源代码文件夹“代码”在同一目录中即不要移动文件夹“代码”的默认位置。
第2章 Java语言基础.
判斷(選擇性敘述) if if else else if 條件運算子.
第十二章 Java网络编程 1.URL编程 2.Socket网络编程 3.Datagram网络编程.
第二章 Java基础语法 北京传智播客教育
輸出執行結果到螢幕上 如果要將執行結果的文字和數值都「輸出」到電腦螢幕時,程式要怎麼寫? class 類別名稱 {
第二章 Java基本语法 讲师:复凡.
Presentation transcript:

Java语言程序设计 清华大学出版社 第9章 网络通信

主要内容 1、网络编程基础 2、基于TCP网络程序设计 3、基于UDP网络程序设计 4、* 基于C/S模式的分布计算

一、 Java与网络 1、网络数据通信的几个重要协议 IP协议、 TCP协议和UDP协议。

IP 数据报结构 源IP地址 目的IP地址

传输层数据报文结构:TCP

传输层数据报结构:UDP报文

2、端口号 端口号:TCP/IP协议为每种服务定义了一个端口。 服务  端口号 ftp 21 http 80 pop3 110

3、 套接字Socket Socket是网络程序中最常用的方式,用于建立两个不同程序之间通过网络进行通信的信道。

2、 套接字Socket 什么是socket ? 套接字是IP与端口的组合,可以分辨在internet上运行的程序 网络服务 IP,port Mail ftp finger 20 telnet 数据结构 I/O缓冲区 端口 21 23 客户程序 Socket IP,port 套接字是IP与端口的组合,可以分辨在internet上运行的程序

进程与进程之间建立起连接

建立套接字Socket 客户端呼叫 在客户端使用socket类,指定服务器IP和端口号,以便连到服务器上: Socket(host_IP, prot); 在服务器端使用ServerSocket类,以等待客户端的连接: ServerSocket(port); 服务器等待

Socket主要方法: 在客户端:建立socket连接后,还应该建立输入输出数据流。 getInputStream( ) 获得输入流 getOutputStream( ) 获得输出流 在服务器端: ServerSocket类的accept( )方法使服务器处于阻塞状态,等待用户请求。

二、TCP协议 Socket编程 Client Server Socket(host, port #) ServerSocket(port #) Server Socket.accept() Socket() OutputStream InputStream Close Socket Client Socket(host, port #) Attempt the connection OutputStream InputStream Close Socket

例1:演示服务器与客户之间的交互,服务器等待,客户访问,相互通一次信息。 客户端向服务器发出信息:“你好”,服务器接收到信息后,给出回应:“你好,我是服务器。”

21.5 Socket . 21.5 Socket 定义数据成员 定义数据成员 4331 创建Socket实例 创建服务器(端口号) waiting for user 127.0.0.1 4331 服务器等待 网络连接 建立socket流 读socket流 (接收并显示) 建立socket流 connetcting client... “这里是服务器" 向用户发出确认字符串 送用户名给 服务器 你好 读客户 端信息 读socket流 提示用户登录成功 关闭流

客户机端 import java.io.*; import java.net.*; class C { public static void main(String[] args) try{ Socket socket=new Socket("127.0.0.1",6565); DataOutputStream out=new DataOutputStream(socket.getOutputStream()); out.writeUTF("我是客户机"); DataInputStream in=new DataInputStream(socket.getInputStream()); String s=in.readUTF(); System.out.println("客户机收到:"+s); }catch(Exception e){} }

服务器端 import java.io.*; import java.net.*; class S { public static void main(String[] args) try{ ServerSocket s_socket=new ServerSocket(6565); Socket socket=s_socket.accept(); DataInputStream in=new DataInputStream(socket.getInputStream()); String s=in.readUTF(); System.out.println("服务器收到:"+s); DataOutputStream out=new DataOutputStream(socket.getOutputStream()); out.writeUTF("我是服务器"); }catch(Exception e){} }

21.5 Socket 显示服务器与客户机间的通信(服务器端) DataOutputStream out=null; DataInputStream in=null; ServerSocket s_socket=null; Socket c_socket=null; String s; //存放读取到的信息 定义数据成员 创建服务器(端口号) try { s_socket=new ServerSocket(4331); }catch (IOException e){ } 服务器等待 网络连接 try { c_socket=s_socket.accept(); …… }catch (IOException e){ } 用循环语句收发信息 (见下页)

DataInPutStream(clientSocket.getInputStream()); out=new 创建服务器(端口号) 定义数据成员 服务器等待 网络连接 建立socket流 等待客户登录 读客户 端信息 in=new DataInPutStream(clientSocket.getInputStream()); out=new DataOutputStream(clientSocket.getOutputStream()); While (true) { s=in.readUTF( ); if ( s!=null ) break; } out.writeUTF(“这里是服务器"); clientSocket.close();

DataOutputStream out=null; DataInputStream in=null; String string; Socket socket=null; 定义数据成员 创建Socket实例 try{ socket=new Socket("127.0.0.1",4331); 建立socket流 input=new DataInputStream(socket.getInputStream()); output=new PrintStream(socket.getOutputStream()); catch(IOException e){ System.out.println(“无法连接 ”); }

System.out.println(input.readLine()); 创建Socket实例 定义数据成员 建立socket流 Out.writeUTF(“你好”); System.out.println(input.readLine()); 读socket流 (看到提示) While (true) { s=in.readUTF( ); if ( s!=null ) break; } 从键盘上读送用户 名送给服务器端 读服务器反馈 mysocket.close(); System.out.println(“s"); 关闭流

考虑多用户 第一种解决方案: 一台计算机上一次启动多个服务器程序,只是端口号不同。 myserver <-------->myclient----f21.bat myserver2<-------->myclient2----f9.bat Server1(1111) client(2222) Server2(2222) client(1111)

多用户的第二种方案 (支持多客户) 将服务器写成多线程的,不同的线程为不同的客户服务. main()只负责循环等待 serverthread serverthread (支持多客户) client1 Server client2 将服务器写成多线程的,不同的线程为不同的客户服务. main()只负责循环等待 线程负责网络连接,接收客户输入的信息

服务器 客户1 线程1( ) 客户2 线程2( ) 线程run() 下面简单分析 教材P276 例4

客户端 socket client() getInputStream getOutputStream writer.start() 服 务 器 In.readUTF() Run( ) class reader extends Thread {server s; int index; public reader(server s, int index) { this.s=s; this.index=index;} public void run() { setPriority(MIN_PRIORITY); s.write_net_output(s.net_output[index],"WAIT"); while (s.client_counter<2) {s.write_net_output(s.net_output[index]," GO..."); while(true) { String string=s.read_net_input(s.net_input[index]); if(string==null) break; System.out.println(s.user[index]+":"+string); s.write_net_output(s.net_output[(index+1)%2],string); } System.out.println(s.user[index]+" has disconnected."); s.user[index]=null; if(--s.client_counter==0) System.exit(0); 按钮事件() Out.writeUTF()

服务器端 . 服务器一端为了能接收多个客户的信息,它的输入流,输出流都是数组型的. (4321) accept socket IP client1 IP client2 客 户 客 户 . 线程 线程 服务器一端为了能接收多个客户的信息,它的输入流,输出流都是数组型的. ServerSocket.accept()等待用户连接,一旦连接上,则调用服务程序. 服务程序的主要内容是网络的读写,多客户的原因,网络读写的功能用多线程实现,因此将此部分功能单独分离出来,构成线程类 public void service_request(Socket socket) { InputStream input; OutputStream output; try{input=socket.getInputStream(); output=socket.getOutputStream(); }catch(IOException e){System.out.println("Unable to get input/output streams");return;} if(client_counter>=2){write_net_output(output,"There are already two clients");return; } net_input[client_counter]=input; net_output[client_counter]=output; user[client_counter]=read_net_input_line(input); System.out.print(user[client_counter]+" Connected!"+socket.toString()); (new reader(this,client_counter)).start(); int c=client_counter++; } String read_net_input_line(InputStream input) { String line="";String c; c=read_net_input(input); while((byte)c.charAt(0)!=10) { line=line+c;c=read_net_input(input);} return line;

服务器端 ServerSocket server Socket client1 accept() client2 serviceRequest read_net_input getInputStream write_net_output() getOutputStream String read_net_input(InputStream input) { byte bytes[]; int number_of_bytes; try{ bytes=new byte[1]; number_of_bytes=input.read(bytes,0,1); if(number_of_bytes>0) return(new String(bytes,0,0,number_of_bytes)); else return null; }catch(IOException e){return null;} } void write_net_output(OutputStream output,String string) { byte byte_array[]; int length=string.length(); byte_array=new byte[length]; string.getBytes(0,length,byte_array,0); try{output.write(byte_array);}catch(IOException e){;} reader.start() reader.run reader.run

在Java中,网络类都在 java.net 类库中。 用来存储internet地址的类InetAddress. 其主要方法: getHostName( ) 获取InetAddress对象的主机名或域名 getHostAddress( ) 获取InetAddress对象的IP地址 getLocalHost( )获取本机的IP地址 程序如何寻找网上的特定设备,程序发送这些设备所必须使用的格式,程序如何差错以及诸如此类的事情.

例:获取本机的IP地址 import java.net.*; public class getLocalHostTest { public static void main(String args[]) { InetAddress myIP=null; try {myIP=InetAddress.getLocalHost();} catch(UnknownHostException e){} System.out.println(myIP); } 创建inetAddress类不用构造函数(不用new)

Java与网络 下面的例子演示java如何根据域名自动到DNS 上查找IP地址(与DNS服务器的连接减至一行) import java.net.*; public class getIP { public static void main(String args[]) { InetAddress pku=null; try{ pku= InetAddress.getByName(“www.pku.edu.cn”); } catch(UnknownHostException e) {} System.out.println(pku); } }

三、基于数据报Datagram TCP/IP传输层由两个并列的协议:TCP,UDP. UDP数据报的每个数据包要包含目的地址和端口号. socket Socket要求数据按照发送的次序接收,包丢失要重发,浪费网络资源,没有保持的连接和数据流,UDP的价值在于效率,如果通信子网可靠UDP大有用武之处.TCP和UDP都由端口的概念.TCP的可靠来源于确认和超时重传.要求先建立连接,传输后关闭,次序不变. UDP不需要实现连接,数据报是独立的,没有次序要求路径不同. server client Datagram数据报 server client

接收时,用 receive( )方法接收数据。 (2) DatagramPacket 类 用于打包或拆包 发送时打包: 在UDP中,要使用二个类: (1) DatagramSocket 类 发送时,用 send( )方法发送数据; 接收时,用 receive( )方法接收数据。 (2) DatagramPacket 类 用于打包或拆包 发送时打包: 包由数据、接收地址、端口号组成; 接收时拆包: 取出包中的数据、接收地址、端口号。 TCP非常复杂,因为要包容通信子网的不可靠因素 可靠并以一定比效率重要,视情况而定

Datagram 工作过程 建立数据报socket(); 建立数据报socket 建立一个报文包packet 建立一个请求包 发出请求 等待请求报文 创建接收包 获得对方地址 等待接收 构成信息包 发送出去

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

Datagram 3.分配并填写数据缓冲区(一个字节类型的数组) byte[] Buf=new byte[256]; 存放从客户端接收的请求信息. 4.创建一个DatagramPacket packet=new DatagramPacket(Buf数组, 256长度); 用来从socket接收数据,它只有两个参数 5. 服务器阻塞 socket.receive(packet); 在客户的请求报道来之前一直等待

Datagram 6. 从到来的包中得到地址和端口号 InetAddress address=packet.getAddress(); int port=packet.getPort(); 7. 将数据送入缓冲区 或来自文件,或键盘输入 8. 建立报文包,用来从socket上发送信息 packet=new DatagramPacket (buf,buf.length, address,port); 9. 发送数据包 10.关闭socket socket.send(packet); socket.close();

Datagram 二、客户端接收包的步骤如下: 1. 定义数据成员 int port; InetAddress address; DatagramSocket socket; DatagramPacket packet; byte[] sendBuf=new byte[256]; 2. 建立socket socket=new DatagramSocket();

Datagram 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);(如果没有到就一直等待,因此实用程序要设置时间限度)

Datagram 5. 处理接收到的数据 String received=new String(packet.getData(),0); System.out.println(received); 数据报套接字首先是强调发送方和接收方的区别,同时也指出服务器和客户之间的不同: 一个客户机必须事先知道服务器的地址和端口,以便进行出事连接 一个服务器从它接收到的数据报文中读取客户端的地址和端口.

小结 实现网络功能要靠URL类, URLConection类, Socket类和DatagramSocket类 网络上的数据传送是将网络连接转换成输入输出流 DataInputStream和DataOutputStream (PrintStream)是网间流的载体. URL适用于web应用,如访问http服务器是高层服务

小结 环回地址可用于在本地机器上调试网络程序 Socket适用于面向连接的,可靠性要求高的应用 Datagram适用于效率要求高的应用 Socket是由IP和端口构成的一种网上通信链路的一端 Socket通信要分别运行服务器和客户程序 服务器程序是多线程的,可处理多个客户的请求

作业 编写一个会话程序 要求: 会话双方可以自由通话,看到对方发来“bye”则退出