您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > Java语言程序设计基础教程课件(第10章)
Java程序设计——第10章java网络编程第10章Java网络编程10.1网络编程基础知识10.2InetAdress类10.3基于套接字的低层次Java网络编程10.4UDP数据报及广播通讯10.5URL及应用示例10.1网络编程基础知识网络编程的目的就是指直接或间接地通过网络协议与其他计算机进行通讯。网络编程中有两个主要的问题,如何准确的定位网络上一台或多台主机如何可靠高效的进行数据传输。TCP/IP协议、TCP、UDPTCP是TranferControlProtocol的简称,是一种面向连接的保证可靠传输的协议。通过TCP协议传输,得到一个顺序无差错的数据流。发送方和接收方通信前必须先建立虚拟连接。客户机/服务器结构UDP是UserDatagramProtocol的简称,是一种无连接的协议,以一个独立的包括完整的源地址和目的地址的数据报,为发送单元数据报在网络上以任何可能的路径传往目的地接收端不确认是否接收到数据报因此能否到达目的地,到达目的地的时间以及内容的正确性都是不能被保证的。12发送数据报接收数据报发送数据报接收数据报两种协议简单比较TCP需建立连接,UDP不需要建立连接TCP可靠,UDP不可靠TCP有主客之分,UDP关系平等TCP无传输数据的大小限制,UDP数据报限制在64KB10.1.2Socket套接字实现网络变成的一种接口或机制Socket中封装了网络连接中的IP和端口号可以把Socket看成是一个港口码头发送数据接收数据Java中的网络编程类位于java.net包中基于TCP通信的Socket对应的是ServerSocket类和Socket类。ServerSocket是用于服务器端Socket类用于TCP通信的服务器和客户端基于UDP通信的Socket对应的是DatagramSocket类。10.3InetAdress类java.net.InetAddress类封装了Internet主机的域名和IP地址如:常用方法:staticInetAddressgetByname(Strings)staticInetAddressgetLocalHost()publicStringgetHostName()publicStringgetHostAddress()booleanisReachable(inttimeout)10.4基于TCP的网络编程TCP客户端与TCP服务器端程序的交互过程由TCP服务器程序创建一个ServerSocket类,然后调用accept()方法等待客户端的连接。客户端程序创建一个Socket并请求与服务器建立连接服务器接收客户的连接请求,并创建一个与请求相关的新的Socket与客户机专线连接。建立连接的两个Socket在一个单独的线程(由服务器创建)上对话。服务器程序又开始等待新的连接请求,当新的连接请求到达时,它又会重复前面2-5的过程。10.4.3创建Socketjava.net.Socket和ServerSocket,分别用来表示双向连接的客户端和服务端。构造方法如下:ServerSocket(intport);ServerSocket(intport,intbacklog);ServerSocket(intport,intbacklog,InetAddressbindAddr)Socketaccept()Socket(InetAddressaddress,intport);Socket(Stringhost,intprot);Socket(Stringhost,intport,InetAddresslocalAddr,intlocalPort)Socket(InetAddressaddress,intport,InetAddresslocalAddr,intlocalPort)InputStreamgetInputStream()OutputStreamgetOutputStream()close()注意在选择端口时,必须小心。每一个端口提供一种特定的服务,只有给出正确的端口,才能获得相应的服务。0~1023的端口号为系统所保留,例如http服务的端口号为80,telnet服务的端口号为21,ftp服务的端口号为23,所以我们在选择端口号时,最好选择一个大于1023的数以防止发生冲突。10.4.4客户端的Socketimportjava.io.IOException;importjava.net.Socket;publicclassep10_6{publicstaticvoidmain(String[]args){try{Socketsocket=newSocket(127.0.0.1,4700);//127.0.0.1是默认的本机地址}catch(IOExceptione){System.out.println(e.getMessage());}}}10.4.5服务器端的ServerSocketimportjava.io.IOException;importjava.net.ServerSocket;importjava.net.Socket;publicclassep10_7{publicstaticvoidmain(String[]args){ServerSocketserver=null;Socketsocket=null;try{server=newServerSocket(4700);socket=server.accept();//accept()会阻塞线程System.out.println(“已建立连接”);socket.close();}catch(IOExceptione){System.out.println(e.getMessage);}}}如何实现数据通信?如何实现多客户端连接?ServerSocketserver=null;Socketsocket=null;OutputStreamos=null;InputStreamis=null;byte[]b=newbyte[1024];try{server=newServerSocket(4700);socket=server.accept();//accept()会阻塞线程System.out.println(“已建立连接”);os=socket.getOutputStream();is=socket.getInputStream();os.write(“howareyou?”.getBytes());is.read(b);os.close();is.close();socket.close();}catch(IOExceptione){System.out.println(e.getMessage);}}InputStreamis=null;byte[]b=newbyte[1024];OutputStreamos=null;OutputStream=null;try{Socketsocket=newSocket(127.0.0.1,4700);//127.0.0.1是默认的本机地址is=socket.getInputStream();is.read(b);System.out.println(newString(b,0,b.length));os=socket.getOutputStream();os.write(“fine,thanks”);is.close();os.close();socket.close();}catch(IOExceptione){System.out.println(e.getMessage());}ServerSocketserver=null;Socketsocket=null;OutputStreamos=null;InputStreamis=null;byte[]b=newbyte[1024];try{server=newServerSocket(4700);socket=server.accept();//accept()会阻塞线程System.out.println(“已建立连接”);os=socket.getOutputStream();is=socket.getInputStream();os.write(“howareyou?”.getBytes());is.read(b);os.close();is.close();socket.close();}catch(IOExceptione){System.out.println(e.getMessage);}}建立的一条数据连接上从输入流中读取数据会阻塞线程怎么处理?为每个客户端启动一个新线程10.4.9支持多客户的client/server程序设计为了实现在服务器方给多个客户提供服务的功能,需要对上面的程序进行改造,利用多线程实现多客户机制。服务器总是在指定的端口上监听是否有客户请求,一旦监听到客户请求,服务器就会启动一个专门的服务线程来响应该客户的请求,而服务器本身在启动完线程之后马上又进入监听状态,等待下一个客户的到来作业分别使用TCP方式,实现将客户端输入的”boy”在服务器端转换为”男孩”后返回给客户端10.5UDP数据报TCP协议,是一种面向连接、可靠的字节流服务。UDP协议,是一种非面向连接、不可靠的报文服务。当强调传输性能而不是传输的完整性时,如:音频、多媒体应用和视频会议时,UDP是最好的选择。QQ采用也是UDP协议。10.5.2DatagramSocket、DatagramPacketjava.net.DatagramSocket的构造方法:DatagramSocket();用于建立单向通信发送端的套接字DatagramSocket(intprot);用于建立单向通信接收端或双向通信收发端的套接字DatagramSocket(intport,InetAddressladdr)用于指定本地的端口和网络地址(多网卡情况)的套接字主要方法:send(数据报)receive(数据报)10.5.1DatagramPacketDatagramPacket构造方法:DatagramPacket(byte[]b,intlength)用于构造接收端的数据报DatagramPacket(byte[]b,intlength,InetAddressaddress,intport)用于构造发送端的数据报主要方法:getData()getAddress()getPort()getLength()publicclassUDPSend{publicstaticvoidmain(String[]args)throwsSocketException{try{DatagramSocketds=newDatagramSocket();Stringstr=hello;DatagramPacketdp=newDatagramPacket(str.getBytes(),str.getBytes().length,InetAddress.getByName(127.0.0.1),3000);ds.send(dp);ds.close();}catch(Exceptione){e.printStackTrace();}}publicclassUDPRecv{publicstaticvoidmain(String[]args){while(true){try{DatagramSocketds=newDatagramSocket(3000);byte[]b=newbyte[1024];DatagramPacketdp=newDatagramPacket(b,b.length);ds.receive(dp);Stringstr=newStrin
本文标题:Java语言程序设计基础教程课件(第10章)
链接地址:https://www.777doc.com/doc-3685806 .html