




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第11单元网络编程Java程序设计基础教程((慕课版)(第2版))目录导航11.1网络协议11.3
UDP通信11.2
TCP通信11.4项目实战11.5单元小结11.1.1TCP及UDPTCP/IP(TransmissionControlProtocol/InternetProtocol)叫作传输控制协议/互联网协议,又叫作网络通信协议,是互特网中使用的基本通信协议。该协议包含两个保证数据完整传输的重要协议,即TCP和IP,同时包含上百种其他功能的协议。UDP是UserDatagramProtocol的简称,中文名是用户数据报协议,是OSI(OpenSystemInterconnection,开放系统互连)参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。UDP无须三次握手确保连接双方都已准备就绪就可以传输数据。因为免去了三次握手,所以其消耗的服务器负载要远小于TCP/IP。套接字(Socket)是TCP/IP中的基本概念,负责将TCP/IP包发送到指定的IP地址。它可以看作两个程序通信连接中的端点。数据被写入套接字中后,该套接字将数据发送到另一个套接字中,使数据能够传送给其他程序。URL是对可以从互联网上得到的资源位置和访问方法的一种简洁表示,是互联网上资源的标准地址。互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它。URL由Internet资源类型(http或ftp等)、服务器地址(host)、端口(port)和资源在服务器上的位置组成。任务11-1URL类和URLConnection类的使用文件URLDemo.javapublicclassURLDemo{publicstaticvoidmain(String[]args){try{URLurl=newURL("/index.html");System.out.println("默认端口是:"+url.getDefaultPort());//打开一个URLConnection类对象URLConnectionurlConn=url.openConnection();//获取请求头Map<String,List<String>>map=urlConn.getHeaderFields();for(Entry<String,List<String>>entry:map.entrySet()){System.out.println(entry.getKey()+":"+entry.getValue());}System.out.println("content-type:"+urlConn.getContentType());System.out.println("是否获取用户缓存:"+urlConn.getDefaultUseCaches());}catch(MalformedURLExceptione){e.printStackTrace();}catch(IOExceptione){e.printStackTrace();}}}运行结果如图11-1所示。11.1.2IP地址及端口号IP地址具有唯一性,用于唯一标识网络中的一台设备。IPv4
(InternetProtocolVesion4,网际协议版本4,现行的IP版本)地址由4个小于256的字节组成,这些字节通过以“.”连接的32位字符串来表示,如24;IPv6(InternetProtocolVersion6,网际协议版本6)
则使用8个16位的无符号整数,通过用冒号“∶”隔开表示,例如6dfe:3312:1123:12df:dfdd:123s:fed2:ss4e。Java网络包中提供了Inet4Address类和Inet6Address类,分别对应IPv4和IPv6地址。由于IP地址是数字标识,难于记忆和书写,所以在IP地址的基础上又发展出一种符号化的地址方案,来代替数字型的IP地址,每一个符号化的地址与特定的IP地址对应。因为符号化的地址有其对应的意义和内容,所以记忆和书写都非常方便。这些符号化的地址就是域名,例如人民邮电出版社的域名就是
。但域名不能直接被网络设备所识别,需要域名服务器(DomainNameServer,DNS)对域名与IP地址做对应的转换。计算机端口对应的英文是port。硬件中的端口也称接口;在软件中,端口一般是指网络中面向连接服务和无连接服务的通信协议识别代码,是一种抽象的软件结构,包括一些数据结构和输入输出缓冲区。计算机在通信时需要指定端口,以传递信息。端口号可以是0~65535之间的任意一个整数。任务11-2IP类的使用文件IPDemo.javapublicclassIPDemo{publicstaticvoidmain(String[]args){try{InetAddressip=InetAddress.getByName("");System.out.println("主机名是:"+ip.getHostName()+",
地址是:"+ip.getHostAddress());System.out.println("地址是否可达:"+ip.isReachable(1000));InetAddress[]ads=InetAddress.getAllByName("");System.out.println("开始获取当前域名对应的所有IP地址:");for(InetAddressad:ads){System.out.println(""+ad.getHostName()+":"+ad.getHostAddress());}System.out.println("结束获取当前域名对应的所有IP地址。");System.out.println("当前主机的地址是:"+InetAddress.getLocalHost());}catch(UnknownHostExceptione){e.printStackTrace();}catch(IOExceptione){e.printStackTrace();}}}运行结果如图11-2所示目录导航11.1网络协议11.3
UDP通信11.2
TCP通信11.4项目实战11.5单元小结11.2.1Socket类当两个程序想要通信的时候,可以使用Socket类建立套接字连接,使呼叫的一方成为客户端,接收的一方成为服务器端。服务器端使用的套接字是ServerSocket。Socket类和ServerSocket类使用的IP地址和端口号必须相同,端口号在服务器端和客户端必须一致才能通信。③
服务器端接收到请求,进行处理并返回给客户机处理结果。④
客户端接收结果,进行后续处理。②
客户端对指定的端口发起请求。①
服务器端开启监听功能,监听指定端口。客户端/服务器端对话过程11.2.1Socket类在Java中,Socket类的创建有两种方式,一种是非阻塞式创建(这种方式可以设置超时时间):Socketso=newSocket();SocketAddresssaddr=newInetSocketAddress(InetAddress.getByName(""),80);so.connect(saddr,3000);另一种是阻塞式创建:Socketso=newSocket("",80);或者Socketso=newSocket(InetAddress.getByName(""),80);11.2.2ServerSocket类ServerSocket类是服务器端套接字,用于对指定的端口进行监听。当监听到请求之后,可以使用accept()方法接收客户端发来的消息。该方法是阻塞的,直到有连接响应,才会返回一个Socket对象。服务器可以使用该Socket类与客户端进行通信。图11-3Socket类的通信模型任务11-3端到端通信文件SocketClientDemo.javapublicclassSocketClientDemo{publicstaticvoidmain(String[]args){try(Socketsocket=newSocket("localhost",8182);InputStreamis=socket.getInputStream();OutputStreamos=socket.getOutputStream()){System.out.println("已经连接上服务器,等待服务器端返回数据:");byte[]buf=newbyte[2048];inti=0;StringBuildersb=newStringBuilder();while((i=is.read(buf))!=-1){sb.append(newString(buf,"UTF-8"));}System.out.println("服务器端返回数据:"+sb);}catch(IOExceptione){e.printStackTrace();}}}任务11-3端到端通信文件SocketServerDemo.javapublicclassSocketServerDemo{
publicstaticvoidmain(String[]args)throwsIOException{try(ServerSocketss=newServerSocket(8182)){while(true){try(Socketso=ss.accept();OutputStreamos=so.getOutputStream();PrintWriterpw=newPrintWriter(os);InputStreamis=so.getInputStream()){System.out.println("客户端地址【:"+so.getInetAddress()+",端口号:"+so.getPort()+"】已经连接到服务器!");pw.write("Hello,"+so.getInetAddress()+",非常感谢您的本次连接。");pw.write("连接成功!");pw.flush();System.out.println("服务器端数据返回成功!开始后续数据的交流步骤!");}}}}}运行结果如图11-4所示。目录导航11.1网络协议11.3
UDP通信11.2
TCP通信11.4项目实战11.5单元小结11.3.1DatagramPacket类与UDP通信相关的处理类是DatagramPacket类,该类位于
包下。该类在接收方和发送方创建的对象是不同的,当发送的时候,发送方不仅要将需要发送的数据告诉DatagramPacket对象,还需要将数据要发送的地址和端口号告诉DatagramPacket对象;接收方则只需声明要获取的数据即可。方法功能描述DatagramPacket(byte[]buf,intlength)创建时指定封装的字节数据和长度大小,用于数据接收方DatagramPacket(byte[]buf,intoffset,int
length)创建时指定封装的字节数据、数据的偏移量和读取长度,用于数据接收方DatagramPacket(byte[]buf,intlength,
InetAddressaddr,intprot)创建时指定封装的字节数据、封装数据的大小、指定数据包的IP地址和端口号,用于数据发送方DatagramPacket(byte[]buf,intoffset,int
length,InetAddressaddr,intprot)创建时指定封装的字节数据、数据的偏移量、封装数据的大小、指定数据包的IP地址和端口号,用于数据发送方InetAddressgetAddress()返回DatagramPacket对象的IP地址。如果是发送方,则返回接收方的IP地址;如果是接收方,则返回发送方的IP地址intgetOffset()返回要发送数据的偏移量或要接收数据的偏移量intgetPort()同getAddress()方法类似,用于返回端口号voidsetPort()设置发送数据包的远程主机端口号byte[]getData()用于返回将要发送或者接收的数据,发送方返回发送数据,接收方返回接收数据byte[]setData(byte[]buf)设置数据包的数据缓冲区intgetLength()返回将要发送或接收数据的长度表11-1DatagramPacket类中常用的方法11.3.2DatagramSocket类DatagramSocket类专用于发送和接收使用DatagramPacket类打包的数据。两者分工明确,前者负责接收和发送经过后者打包的数据,后者则专门负责数据的打包工作。表11-2DatagramSocket类中常用的方法方法功能描述DatagramSocket(intport)构造数据包套接字并将其绑定到本地主机上的指定端口DatagramSocket(intport,InetAddressladdr)创建一个数据包套接字,绑定到指定的本地地址DatagramSocket(SocketAddressbindaddr)创建一个数据包套接字,绑定到指定的本地套接字地址voidconnect(InetAddressaddress,intport)将套接字连接到其远程地址voiddisconnect()断开连接intgetReceiveBufferSize()获取DatagramSocket类的SO_RCVBUF参数的值,即平台在DatagramSocket类上输入的缓冲区大小intgetSendBufferSize()获取DatagramSocket类的SO_SNDBUF参数的值,即平台在DatagramSocket类上输出的缓冲区大小intgetSoTimeout()检索SO_TIMEOUT的设置voidsetSoTimeout(inttimeout)以指定的超时时间(以毫秒为单位)启用/禁用SO_TIMEOUTvoidreceive(DatagramPacketp)从指定套接字接收数据包voidsend(DatagramPacketp)从指定套接字发送数据包任务11-4UDP通信模型文件UDPSendDemo.javapackagecom.lw.chapter11;importjava.io.IOException;import.DatagramPacket;import.DatagramSocket;import.InetAddress;import.SocketException;import.UnknownHostException;publicclassUDPSendDemo{publicstaticvoidmain(String[]args){//使用字符串创建一个数据字节数组byte[]b="你好,服务器,这是第一个数据包".getBytes();//声明发送的DatagramSocket对象DatagramSocketds=null;try{//创建DatagramPacket对象,并初始化数据、长度、目标地址和端口号参数DatagramPacketdp=newDatagramPacket(b,b.length,InetAddress.getByName("localhost"),9900);//创建DatagramSocket对象ds=newDatagramSocket(9901);//发送数据ds.send(dp);任务11-4UDP通信模型//输出信息System.out.println("发送信息:");System.out.println("数据:"+newString(dp.getData(),"UTF-8")+";发送到:"+dp.getAddress().getHostAddress()+";
端口号:"+dp.getPort());}catch(UnknownHostExceptione){e.printStackTrace();}catch(SocketExceptione){e.printStackTrace();}catch(IOExceptione){e.printStackTrace();}finally{//关闭DatagramSocket对象if(null!=ds){ds.close();}}}}文件UDPRecvDemo.javapackagecom.lw.chapter11;importjava.io.IOException;import.DatagramPacket;import.DatagramSocket;import.SocketException;任务11-4UDP通信模型publicclassUDPRecvDemo{publicstaticvoidmain(String[]args){//创建一个字节数组,用于存放数据byte[]b=newbyte[2048];//创建一个DatagramPacket对象DatagramPacketdp=newDatagramPacket(b,2048);//声明DatagramSocket对象DatagramSocketds=null;try{//初始化DatagramSocket对象ds=newDatagramSocket(9900);//接收数据ds.receive(dp);//输出信息System.out.println("接收数据:");System.out.println("数据:"+newString(dp.getData(),"UTF-8").trim()+";
来源:"+dp.getAddress().getHostAddress()+";
端口号:"+dp.getPort());}catch(SocketExceptione){e.printStackTrace();}catch(IOExceptione){e.printStackTrace();}finally{if(null!=ds){ds.close();}//关闭DatagramSocket对象}}}运行结果分别如图11-5和图11-6所示。图11-5发送信息的运行结果图11-6接收数据的运行结果目录导航11.1网络协议11.3
UDP通信11.2
TCP通信11.4项目实战11.5单元小结项目11-1设计通信程序QQ和微信现在已经成了很多人无法离开的通信交流软件,它们方便了人们的交流和沟通。通过对Java的学习,再结合多线程和UDP通信,聊天软件的神秘面纱就可以揭开了,聊天软件的核心也就非常好理解了。本项目结合已经学习的内容模仿编写一个聊天室,实现聊天室消息的发送和接收功能,并将接收的数据显示出来。
程序运行结果如图所示。项目11-1设计通信程序文件ChatClientDemo.javapackagecom.lw.chapter11;importjava.io.IOException;import.DatagramPacket;import.DatagramSocket;import.InetAddress;import.SocketException;import.UnknownHostException;importjava.util.Scanner;publicclassChatClientDemo{publicstaticvoidmain(String[]args){@SuppressWarnings("resource")Scannerscan=newScanner(System.in);//用于获取客户端监听的端口和发送的数据System.out.println("请输入监听端口:");StringportStr=scan.nextLine();//获取用户监听端口intport=Integer.parseInt(portStr);//转化成int类型的数值//定义一个线程对象,异步接收服务器端的广播数据Runnabler=newRunnable(){@SuppressWarnings("resource")@Overridepublicvoidrun(){byte[]buf=newbyte[1024];//字节数据对象//初始化DatagramPacket对象DatagramPacketdp=newDatagramPacket(buf,buf.length);DatagramSocketds=null;try{ds=newDatagramSocket(port);//创建DatagramSocket对象}catch(SocketExceptione1){e1.printStackTrace();}//循环监听数据while(true){try{//监听并接收数据ds.receive(dp);//输出数据System.out.println(newString(dp.getData(),"UTF-8"));}catch(SocketExceptione){e.printStackTrace();}catch(IOExceptione){e.printStackTrace();}}}};项目11-1设计通信程序//启动异步线程进行数据监听Threadt=newThread(r);t.start();
//通过主线程进行数据发送DatagramSocketds=null;try{ds=newDatagramSocket();while(true){//获取用户输入数据Stringline=scan.nextLine();//如果是非空数据,则发送消息,否则获取下一行的输入if(null!=line){//组装数据,数据格式是port:messageline=port+":"+line;//创建数据包DatagramPacketdp=newDatagramPacket(line.getBytes(),line.getBytes().length,InetAddress.getByName("localhost"),9901);//发送数据包try{ds.send(dp);}catch(IOExceptione){e.printStackTrace();}}else{continue;}}}catch(SocketExceptione){e.printStackTrace();}catch(UnknownHostExceptione1){e1.printStackTrace();}finally{//关闭数据流if(null!=ds){ds.close();}}}}项目11-1设计通信程序服务器端实现代码如下。packagecom.lw.chapter11;importjava.io.IOException;import.DatagramPacket;import.DatagramSocket;import.InetAddress;import.SocketException;importjava.util.HashSet;importjava.util.Set;publicclassChatServerDemo{publicstaticvoidmain(String[]args){//使用Set集合保存注册用户的信息Set<String>registerSet=newHashSet<>();byte[]buf=newbyte[1024];//初始化数据数组//不间断监听DatagramSocketds=null;try{ds=newDatagramSocket(9901);文件ChatServerDemo.javawhile(true){//初始化DatagramPacket对象DatagramPacketdp=newDatagramPacket(buf,buf.length);//接收数据ds.receive(dp);//处理客户端数据Stringinfo=newString(dp.getData(),"UTF-8");//客户端数据StringportStr=info.substring(0,info.indexOf(":"));//截取端口号StringhostName=dp.getAddress().getHostAddress();//组装host地址信息Stringhost=hostName+"-"+portStr
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年快手磁力引擎暑期内容营销招商手册
- CRH380AL型车组三级修复习试题含答案
- 我的家人写人作文(4篇)
- 产品供货合同协议书范文
- 保险合同转让协议书
- 合同协议书图片有效吗
- 2025项目内部承包合同书
- 2025股权投资合同协议书范本
- 婚庆合同签约协议书范本
- 2025版合同法解析
- 六年级数学下册期末试卷及答案【可打印】
- 人教B版高中数学必修第二册 4.7数学建模活动:生长规律的描述【课件】
- 数字图像处理-第12章 图像编码
- JGJ100-2015 车库建筑设计规范
- 娱乐场所安全管理条例
- 超星尔雅学习通《社会科学方法论(南开大学)》2024章节测试答案
- CJJ181-2012 城镇排水管道检测与评估技术规程
- 部编版八年级上册语文第一单元整体教学设计
- 2024年版婴幼儿功能性消化不良综合征非药物干预专家共识(完整版)
- 苏教版小学1-6年级英语单词
- 托育服务项目运营管理方案
评论
0/150
提交评论