当前位置:首页 >> 自然科学 >>

java网络编程


Java网络编程

1

Java与网络
Java语言取得成功的领域之一就是网络 (其他语言)数页代码---->(Java)一条语句 TCP/IP(传输控制协议/网间协议)是internet的主要协议, 定义了计算机和外设进行通信所使用的规则(应用层,传 输层,网络层,链路层). 大多数基于internet的应用程序被看作TCP/IP协议的上 一层. 如 : ftp, http, smtp, pop3, telnet, nntp等 IP地址:TCP/IP网络中的每台计算机都有唯一的地址-IP地址. 在Java中,有一个用来存储internet地址的类叫 InetAddress.
2

网络层次
4层网络结构:

3

传输层的两个基本协议
1 TCP协议:确保以发送时的顺序接受,丢包 重新传递,数据对于连接太快TCP会调整速度 等 2UDP协议: 允许接受方检测被破坏的包,不保 证这些包正确的顺序传输。实时的音频或视频 应用程序经常使用。如果UDP有纠错功能一般 由应用层来实现,如TFTP等。UDP本身没有此 功能
4

Java网络编程
Java的网络编程是建立在传输层之上的, 我们可以创建自己的应用层协议。Java 仅支持TCP和UDP。(ICMP不支持) Java已经给我们提供好了基于传输层协 议的类(Stream Socket和 Datagram Socket) Java不能直接发IP数据包
5

TCP协议的实现
Socket是实现TCP协议的基本工具, Socket对程序员掩盖了网络底层实现的 细节。如:纠错,重传,网络地址等 Socket是网络上运行的程序之间双向通 信链路的最后终结点 IP与端口的组合得出一个套接字,可以完 全分辨internet上运行的程序
6

Socket概念
端口号:TCP/IP协议为每种服务定义了一个端口,当一台 计算机上运行不同服务器程序时,根据端口号不同提供 相应的服务. 端口号不是计算机上的物理连接器,它只是具有软件意 义的假想端口 internet服务 服务 ftp telnet DNS 端口号 21 23 53 internet服务 服务 www nntp POP3 端口号 80 119 110
7

Socket的功能
1连接远程机器 2发送数据 3接受数据 4关闭连接 5绑定端口 6监听入站数据 7在所绑定得端口上接受来自远程的连接
8

Socket类
Socket类用代码通过主机操作系统的本 地TCP栈进行通信。 Socket为用户提供的接口是流。

9

Socket类
Server ServerSocket(port #) Server Socket.accept() Socket() OutputStream InputStream Close Socket Client Socket(host, port #) Attempt the connection

OutputStream InputStream Close Socket
10

Socket类(续)
程序员只需把传输内容转化为流

Stream
IP数 据 包 交 互 细 节 S o c k e t (服 务 器 端 )

Stream
S o c k e t( 客 户 端 )

11

客户端Socket
构造函数:
public Socket(String host,int port) throws unknownHostException,IOException Socket socket=new Socket( time.nist.gov ”,80); Socket(“ ,80); 含义: 1 创建一个socket对象 2尝试连接主机 主机名不存在或服务器没运行unknownHostException 其他原因抛: IOException
12

客户端Socket(续)
检查主机1024个端口哪些提供了 个端口哪些提供了TCP服务 检查主机 个端口哪些提供了 服务 public class PortsScanner{ String host=“localhost”; for (int i=1 ;i<1024;i++){ try{ Socket s=new Socket(host,i); System.out.println(“TCP server port is”+i); } catch(UnknownHostException e){….} catch(IOException e){……} }

}

13

时间协议的使用
使用Socket完成一些应用层的协议。
telnet完成此协议: 完成此协议: 完成此协议 %telnet vision.poly.edu 13 Trying 128.238.42.35 Connected to Vision.poly.edu Escape character is ‘^]’ Sun Oct 28 11:05:15 2007 Connection closed by foreign host

14

时间协议的使用
public class Daytime client{ Public static void main(String args){ String hostName; if(args.length>0) hostname=args[0]; try{ Socket socket=new Socket(hostName,13) InputStream timeStream = theSocket.getInputStream(); StringBuffer time=new StringBuffer(); int c; while((c=timeStream.read()!=-1)) time.append((char)c); String timeString=time.toString().trim(); System.out.println(timeString); } catch(..){..} 运行命令:java Daytime client time.nist.gov 运行结果: Sun Oct 28 11:05:15 运行结果: 运行命令 15 2007

客户端Socket(续)
Socket使用之后要注意关掉.一般来说 socket确实会在两个流的一个关闭后或在 被垃圾回收时自动关闭。但是对于敏感 的程序,在垃圾回收介入之前,系统会 很快到达能打开的socket上限。尤其是跟 很多硬件设备打交道的软件系统。

16

客户端Socket(续)
try{ Socket connection=null; connection=new Socket(“time.nist.gov ”,13); //与socket交互 与 交互 } catch(UnknownHostException ex){ System.err.println(ex); } catch(IOException ex){ System.err.println(ex); } finally{ if(connection!=null) connection.close(); }
17

半关闭Socket
close()方法同时关闭Socket的输入和输 出 但JDK提供了shutdownInput()和 shutdownOutput的方法

18

Socket异常
BindException没有权限使用Socket,想使 用的端口被别的应用占用 ConnectException主机忙或没有监听该 端口的进程 NoRouteHostException表示连接超时 ProtocolException表示网络接受的数据 违反TCP/IP规范
19

ServerSocket
服务器Socket等待连接而客户端Socket 发起连接。一旦ServerSocket建立起来连 接,服务器就是用一个正常的Socket对 客户端发送数据。

20

ServerSocket基本流程
1 创 建 一 个 新 的 ServerSocket

2 accept()监 听 如 站 连 接

3通 过 调 用 输 入 输 出 流 火 的 客 户 传来的信息

4根 据 应 用 层 的 协 议 交 互

5服 务 器 或 者 客 户 端 关 闭 连 接

21

ServerSocket的构造函数
构造函数:
public ServerSocket(int port)throws BindException,IOException ServerSocket socket=new ServerSocket (80); 含义: 创建一个server socket对象,服务的端 口是80,如果port设为0或者null Java会随机选 一个未占用的port 如果端口已经被其他应用程序占用抛出 BindException
22

ServerSocket的构造函数(续)
public ServerSocket(int port,int queueLength)throws BindException,IOException Queue表示入站连接请求队列的长度,这个长度必须 小于操作系统所允许的最大长度 public ServerSocket()throws IOException 没有端口创建是没有意义的,因为客户端不知道如何 连接过去 ServerSocket ss=new ServerSocket(); SocketAddress http=new InetSocketAddress(80); ss.bind(http);

23

ServerSocket的监听方法
accept()监听客户端的连接。在未连接的 时候accept()是阻塞的,他会停止执行流 并等待

24

简单的日期时间服务器
while(true){ try{ Socket connection=null; connection=server.accept(); Write out=new OutPutStreamWriter(connection.getOutputStream()); Date now=new Date(); out.write(now.toString()+”\r\n”); out.flush(); connection.close(); } catch(UnknownHostException ex){ System.err.println(ex); } catch(IOException ex){ System.err.println(ex); } if(connection!=null) connection.close(); 25 }

UDP的实现
UDP的实现类DatagramPacket和 DatagramSocket. DatagramPacket的作用:将应用层的数据 字节准变为UDP的传输单位datagram

26

UDP的实现(续)
DatagramSocket与TCP的Socket不同, UDP没有连接的概念,没有TCP那样的服 务器Socket和客户端Socket的概念。 DatagramSocket既可以发又可以收,可 以面对多个DatagramSocket进行收发, 不像TCP协议中的1 on 1的关系,服务器 没有必要创建Socket与客户端Socket通 讯。
27

TCP通讯与UDP通讯对比
通讯信道 Socket Socket

ServerSocket Socket

通讯信道

Socket

服务器端

客户端

28

TCP通讯与UDP通讯对比
DataGramSocket DatagramSocket DataGramSocket

服务器端

客户端

29

DatagramPacket类
DaragramPacket转化成的Datagram已经 与IP层的数据包非常接近,包含了目标 地址 而TCP的数据片需要Socket告诉其目标地 址,然后组成IP数据包。

30

DatagramPacket类
接受和发送数据包的构造函数是不同的: 1 接受数据包: public DatagramPacket(byte[] buffer,int length) 两个参数1 byte[] buffer表示接受数据包的数组, length表示这个数组的长度。 2发送数据包: public DatagramPacket(byte[] data,int length,InetAddress destination,int port) 除了包括接受的参数外还包括目标地址和端口

31

DatagramPacket类(续)
创建一个DatagramPacket:
String s=“This is a Test”; byte[] data =s.getBytes(“ASCII”); try{ InetAddress ia=InetAddress.getByName(“www.sina.com”); int port=80 DatagramPacket dp=new DatagramPacket(data,data.length,ia,port); } catch(IOException e){…}

32

DatagramSocket类
与DatagramPacket类似发送与接受Socket只是构造函 数不相同 发送Socket对象 DatagramSocket client=new DatagramSocket() 由于发送无需关心发送端口所以操作系统会自动分配 一个端口发送时服务器的端口已经写在了 DatagramPacket中了 接受Socket对象 DatagramSocket server=new DatagramSocket(port) 由于需要监听客户端Socket所以必须指定port

33

DatagramSocket类(续)
客户端程序例子: 客户端程序例子: InetAddress server=InetAddress.getName(“www.sina.com”); BufferReader userInput=new BufferReader(new inputStreamReader(System.in)); DatagramSocket theSocket=new DatagramSocket(); while(true){ String theLine=userInput.readLine(); if(theLine.equals(“.”))break; byte[] data=theLine.getBytes(“UTF-8”); DatagramPacket theOutput=new DatagramPacket(data,data.length,server,port); theSocket.send(theOutput); } }
34

DatagramSocket类(续)
服务器端程序例子: 服务器端程序例子: DatagramSocket server=new DatagramSocket(port); DatagramPacket packet=new DatagramPacket(buffer,buffer.length); while(true){ server.receive(packet); String s=new String(packet.getData(),0,packet.getLength(),”UTF-8”); System.out.println(s); packet.setLength(buffer.length); }

35

DatagramSocket类(续)
DatagramSocket的对象用完之后也是要 关闭,如果等到垃圾回收关闭,有可能 会造占满所有允许的Socket数。 TCP的Socket和UDP的Socket可以共用一 个端口两种协议是毫不相干的且端口也 只是个逻辑概念

36

组播Socket
与传统传播的区别:
未使用组播 服 务 器 使用组播 服 务 器

路由器

路由器

PC

PC

PC

PC

PC

PC

PC

PC

37

组播的使用
采用MulticastSocket用法相近,但多了4 个动作: 1加入组播组 2向组播组发送数据 3接受组播组的数据 4离开组播组

38

组播接受实例:
服务器端程序例子: 服务器端程序例子: MulticastSocket server=new MulticastSocket (port); InetAddress ia=InetAddress.getByName(“224.2.2.2”);//定义组播组 定义组播组

Server.joinGroup(ia);
byte[] buffer=new byte[8192]; DatagramPacket packet=new DatagramPacket(buffer,buffer.length); while(true){ server.receive(packet); String s=new String(packet.getData(),0,packet.getLength(),”UTF-8”); System.out.println(s); }

39

有用的工具类—InetAddress类
Java对于IP地址的高级表示。它包含了 主机名和IP地址,我们知道了其中一个 信息可以得到另一个信息。 3个构造函数:
1 public static InetAddress getByName(String hostName) throws UnknownHostException 2 public static InetAddress[] getAllByName(String hostName) throws UnknownHostException

40

InetAddress类(续)
public static InetAddress[] getLocalhost(String hostName) throws UnknownHostException 通过DNS得到IP地址和hostname的转换

41

InetAddress类应用
查找Microsoft所有的 地址: 所有的IP地址 查找 所有的 地址: public class AllAddressesOfMicroSoft{ public static void main(String args[]){ try{ InetAddress[] addresses=InetAddress.getAllByName(“www.microsoft.com”); for(int i=0;i<addresses.length;i++){ System.out.println(addresses[i]); } catch(UnknownHostException e){} } }

42


赞助商链接
相关文章:
java网络编程实验报告
(jisuanjiMenu);//计算机类 JMenuItem javaItem=new JMenuItem("java 语言"); JMenuItem wangluoItem=new JMenuItem("网络编程"); jisuanjiMenu.add(java...
【最新版】JAVA网络编程毕业课程设计_图文
【最新版】JAVA网络编程毕业课程设计 - 毕业论文,单片机论文,毕业论文设计,毕业过关论文,毕业设计,毕业设计说明,硕士论文,研究生论文
java网络编程复习题(2013考试题库)
java网络编程复习题(2013考试题库) - V 大发大纲 Java 网络编程期末复习题(I/O、多线程、网络编程、数据库操作) 一、单选题 1、下列关于 Java 线程的说法那些...
java网络编程课程设计终极版
java网络编程课程设计终极版 - 枣庄学院 信息科学与工程学院课程设计任务书 题 目: 基于 UDP 的聊天系统 小组成员: 成员学号: 专业班级: 课程: 指导教师: 完成...
实验11 Java网络编程
实验4 java网络编程基础1 3页 免费如要投诉违规内容,请到百度文库投诉中心;如要提出功能问题或意见建议,请点击此处进行反馈。 实验11 Java网络编程 隐藏>> 实验14...
java网络编程试卷及答案
java网络编程试卷及答案 - A1、 Java 网络程序位于 TCP/IP 参考模型的哪一层?(B) a) 网络层互联层 b) 应用层 c) 传输层网络 d) 主机网络层 2、以下...
java网络编程典型例题
java网络编程典型例题 - 网络典型例题 Java 提供了两个不同层次的网络支持机制: 利用 URL 访问网络资源 利用 Socket 通信 一、统一资源定位符 URL 类 1、URL ...
java网络编程
java网络编程 - 网络编程,要熟悉 io 流,先说一下相关知识点。 public class FileInputStreamextends InputStream FileInputStre...
Java网络编程和数据库编程-Java实验报告(五)
Java网络编程和数据库编程-Java实验报告(五) - 甘肃政法学院 本科学生实验报告 (五) 姓名 专业 实验课程名称 试验时间 实验成绩 开课时间 2011 学年 第2 学期...
java网络编程
java网络编程 - 1 TCP / IP 概述 应用层(Application Layer) 应用层为用户提供所需要的各种服务,负责传送各种最终形态的数据,是直接与用户 打交道的层,典型协议...
更多相关文章: