网络编程就是在两个或两个以上的设备(例如计算机)之间传输数据。html
程序员所做的事情就是把数据发送到指定的位置,或者接收到指定的数据,这个就是狭义的网络编程范畴。java
在发送和接收数据时,大部分的程序设计语言都设计了专门的API实现这些功能,程序员只须要调用便可。git
网络编程技术是当前一种主流的编程技术,随着联网趋势的逐步加强以及网络应用程序的大量出现,因此在实际的开发中网络编程技术得到了大量的使用。程序员
网络编程的实质就是两个(或多个)设备(例如计算机)之间的数据传输。编程
按照计算机网络的定义,经过必定的物理设备将处于不一样位置的计算机链接起来组成的网络,这个网络中包含的设备有:计算机、路由器、交换机等等。浏览器
路由器和交换机组成了核心的计算机网络,计算机只是这个网络上的节点以及控制等,经过光纤、网线等链接将设备链接起来,从而造成了一张巨大的计算机网络。服务器
网络最主要的优点在于共享:共享设备和数据。网络
为了可以方便的识别网络上的每一个设备,网络中的每一个设备都会有一个惟一的数字标识,这个就是IP地址。在计算机网络中,如今命名IP地址的规定是IPv4协议,该协议规定每一个IP地址由4个0-255之间的数字组成。并发
可是因为IP地址不容易记忆,因此为了方便记忆,有创造了另一个概念——域名(Domain Name),例如sohu.com等。一个IP地址能够对应多个域名,一个域名只能对应一个IP地址。socket
在网络中传输的数据,所有是以IP地址做为地址标识,因此在实际传输数据之前须要将域名转换为IP地址,实现这种功能的服务器称之为DNS服务器,也就是通俗的说法叫作域名解析。
当DNS服务器正常工做时,使用IP地址或域名均可以很方便的找到计算机网络中的某个设备,例如服务器计算机。
当DNS不正常工做时,只能经过IP地址访问该设备。因此IP地址的使用要比域名通用一些。
有了端口的概念之后,一个计算机上能够并发运行多个网络程序,而不会在互相之间产生干扰。
在硬件上规定,端口的号码必须位于0-65535之间,每一个端口惟一的对应一个网络程序,一个网络程序可使用多个端口。
网络编程就是两个或多个设备之间的数据交换,其实更具体的说,网络编程就是两个或多个程序之间的数据交换,和普通的单机程序相比,网络程序最大的不一样就是须要交换数据的程序运行在不一样的计算机上,这样就形成了数据交换的复杂。虽然经过IP地址和端口能够找到网络上运行的一个程序,可是若是须要进行网络编程,则还须要了解网络通信的过程。
网络通信基于“请求-响应”模型。
在网络通信中,第一次主动发起通信的程序被称做客户端(Client)程序,简称客户端,而在第一次通信中等待链接的程序被称做服务器端(Server)程序,简称服务器。一旦通信创建,则客户端和服务器端彻底同样,没有本质的区别。
使用C/S结构的程序,在开发时须要分别开发客户端和服务器端,这种结构的优点在于因为客户端是专门开发的,因此根据须要实现各类效果,专业点说就是表现力丰富,而服务器端也须要专门进行开发。可是这种结构也存在着不少不足,例如通用性差,几乎不能通用等,也就是说一种程序的客户端只能和对应的服务器端通信,而不能和 其它服务器端通信,在实际维护时,也须要维护专门的客户端和服务器端,维护的压力比较大。
使用B/S结构的程序,在开发时只须要开发服务器端便可,这种结构的优点在于开发的压力比较小,不须要维护客户端。可是这种结构也存在着不少不足,例如浏览器的限制比较大,表现力不强,没法进行系统级操做等。
总之C/S结构和B/S结构是如今网络编程中常见的两种结构,B/S结构其实也就是一种特殊的C/S结构。
P2P(Point to Point)程序,常见的如BT、电驴等。P2P程序是一种特殊的程序,应该一个P2P程序中既包含客户端程序,也包含服务器端程序,例如BT,使用客户端程序部分链接其它的种子(服务器端),而使用服务器端向其它的BT客户端传输数据。
那么如何来编写协议格式呢?答案是随意。只要按照这种协议格式可以生成惟一的编码,按照该编码能够惟一的解析出发送数据的内容便可。也正由于各个网络程序之间协议格式的不一样,因此才致使了客户端程序都是专用的结构。
在实际的网络程序编程中,最麻烦的内容就是协议的设计以及协议的生产和解析,这个才是网络编程中最核心的内容。
一、 TCP(传输控制协议)方式 二、 UDP(用户数据报协议)方式
在网络通信中,TCP方式就相似于拨打电话,使用该种方式进行网络通信时,须要创建专门的虚拟链接,而后进行可靠的数据传输,若是数据发送失败,则客户端会自动重发该数据。而UDP方式就相似于发送短信,使用这种方式进行网络通信时,不须要创建专门的虚拟链接,传输也不是很可靠,若是发送失败则客户端没法得到。
这两种传输方式都是实际的网络编程中进行使用,重要的数据通常使用TCP方式进行数据传输,而大量的非核心数据则都经过UDP方式进行传递,在一些程序中甚至结合使用这两种方式进行数据的传递。
因为TCP须要创建专用的虚拟链接以及确认传输是否正确,因此使用TCP方式的速度稍微慢一些,并且传输时产生的数据量要比UDP稍微大一些。
不管使用TCP方式仍是UDP方式进行网络通信,网络编程都是由客户端和服务器端组成。固然,B/S结构的编程中只须要实现服务器端便可。
客户端网络编程的第一步都是创建网络链接。在创建网络链接时须要指定链接到的服务器的IP地址和端口号,创建完成之后,会造成一条虚拟的链接,后续的操做就能够经过该链接实现数据交换了。
- 链接创建之后,就能够经过这个链接交换数据了。交换数据严格按照请求响应模型进行,由客户端发送一个请求数据到服务器,服务器反馈一个响应数据给客户端,若是客户端不发送请求则服务器端就不响应。 - 根据逻辑须要,能够屡次交换数据,可是仍是必须遵循请求响应模型。
在数据交换完成之后,关闭网络链接,释放程序占用的端口、内存等系统资源,结束网络编程。
- 服务器端属于被动等待链接,因此服务器端启动之后,不须要发起链接,而只须要监听本地计算机的某个固定端口便可。 - 这个端口就是服务器端开放给客户端的端口,服务器端程序运行的本地计算机的IP地址就是服务器端程序的IP地址。
- 当客户端链接到服务器端时,服务器端就能够得到一个链接,这个链接包含客户端的信息,例如客户端IP地址等等,服务器端和客户端也经过该链接进行数据交换。 - 通常在服务器端编程中,当得到链接时,须要开启专门的线程处理该链接,每一个链接都由独立的线程实现。
- 服务器端经过得到的链接进行数据交换。服务器端的数据交换步骤是首先接收客户端发送过来的数据,而后进行逻辑处理,再把处理之后的结果数据发送给客户端。简单来讲,就是先接收再发送,这个和客户端的数据交换数序不一样。 - 其实,服务器端得到的链接和客户端链接是同样的,只是数据交换的步骤不一样。 - 固然,服务器端的数据交换也是能够屡次进行的。 - 在数据交换完成之后,关闭和客户端的链接。
当服务器程序关闭时,须要关闭服务器端,经过关闭服务器端使得服务器监听的端口以及占用的内存能够释放出来,实现了链接的关闭。
首先来介绍一个基础的网络类——InetAddress类。该类的功能是表明一个IP地址,而且将IP地址和域名相关的操做方法包含在该类的内部。
eg:关于该类的使用,下面经过一个基础的代码示例演示该类的使用。
按照前面的介绍,网络通信的方式有TCP和UDP两种,其中TCP方式的网络通信是指在通信的过程当中保持链接。
在Java语言中,对于TCP方式的网络编程提供了良好的支持,在实际实现时,以java.net.Socket
类表明客户端链接,以java.net.ServerSocket
类表明服务器端链接。
eg:在客户端网络编程中,首先须要创建链接,在Java API中以java.net.Socket
类的对象表明网络链接,因此创建客户端网络链接,也就是建立Socket类型的对象,该对象表明网络链接。
Socket socket1 = new Socket(“192.168.1.103”,10000); Socket socket2 = new Socket(“www.sohu.com”,80); 上面的代码中,socket1实现的是链接到IP地址是192.168.1.103的计算机的10000号端口,而socket2实现的是链接到域名是www.sohu.com的计算机的80号端口。若是创建链接时,本机网络不通,或服务器端程序未开启,则会抛出异常。
eg:从链接中得到输入流和输出流,而后将须要发送的数据写入链接对象的输出流中,在发送完成之后从输入流中读取数据。
OutputStream os = socket1.getOutputStream(); //得到输出流 InputStream is = socket1.getInputStream(); //得到输入流 上面的代码中,分别从socket1这个链接对象得到了输出流和输入流对象,在整个网络编程中,后续的数据交换就变成了IO操做,也就是遵循“请求-响应”模型的规定,先向输出流中写入数据,这些数据会被系统发送出去,而后在从输入流中读取服务器端的反馈信息,这样就完成了一次数据交换过程,固然这个数据交换过程能够屡次进行。
eg:最后当数据交换完成之后,关闭网络链接,释放网络链接占用的系统端口和内存等资源,完成网络操做。
socket1.close();
eg:向服务器端发送一个字符串“Hello”,并将服务器端的反馈显示到控制台,数据交换只进行一次,当数据交换进行完成之后关闭网络链接,程序结束。
eg:实现服务器端监听的代码:
ServerSocket ss = new ServerSocket(10000);
eg:实现得到链接的代码是:
Socket socket = ss.accept();
eg:在服务器端通讯完成之后,关闭服务器端链接。实现的代码为:
ss.close();
一、如何复用Socket链接?
eg:实现创建一次链接,进行屡次数据交换呢。其实很简单,创建链接之后,将数据交换的逻辑写到一个循环中就能够了。这样只要循环不结束则链接就不会被关 闭。按照这种思路,能够改造一下上面的代码,让该程序能够在创建链接一次之后,发送三次数据,固然这里的次数也能够是屡次。
二、如何使服务器端支持多个客户端同时工做?
eg:MulThreadSocketServer类实现服务器端控制,实现接收客户端链接,而后开启专门的逻辑线程处理该链接,LogicThread类实现对于一个客户端链接的逻辑处理,将处理的逻辑放置在该类的run方法中。
1.l DatagramSocket DatagramSocket类实现“网络链接”,包括客户端网络链接和服务器端网络链接。虽然UDP方式的网络通信不须要创建专用的网络链接,可是毕竟仍是须要发送和接收数据,DatagramSocket实现的就是发送数据时的发射器,以及接收数据时的监听器的角色。类比于TCP中的网络链接,该类既能够用于实现客户端链接,也能够用于实现服务器端链接。 2.l DatagramPacket DatagramPacket类实现对于网络中传输的数据封装,也就是说,该类的对象表明网络中交换的数据。在UDP方式的网络编程中,不管是须要发送的数据仍是须要接收的数据,都必须被处理成DatagramPacket类型的对象,该对象中包含发送到的地址、发送到的端口号以及发送的内容等。其实DatagramPacket类的做用相似于现实中的信件,在信件中包含信件发送到的地址以及接收人,还有发送的内容等,邮局只须要按照地址传递便可。在接收数据时,接收到的数据也必须被处理成DatagramPacket类型的对象,在该对象中包含发送方的地址、端口号等信息,也包含数据的内容。和TCP方式的网络传输相比,IO编程在UDP方式的网络编程中变得不是必须的内容,结构也要比TCP方式的网络编程简单一些。
UDP客户端编程涉及的步骤也是4个部分:创建链接、发送数据、接收数据和关闭链接。
因为服务器端的端口须要固定,因此通常在创建服务器端链接时,都指定端口号。
接着服务器端就开始接收客户端发送过来的数据,其接收的方法和客户端接收的方法一直,其中receive方法的做用相似于TCP方式中accept方法的做用,该方法也是一个阻塞方法,其做用是接收数据。
eg:UDP网络编程的基本使用。实现将客户端程序的系统时间发送给服务器端,服务器端接收到时间之后,向客户端反馈字符串“OK”。
网络协议是指对于网络中传输的数据格式的规定。
eg:实现的功能是质数判断,程序实现的功能为客户端程序接收用户输入的数字,而后将用户输入的内容发送给服务器端,服务器端判断客户端发送的数字是不是质数,并将判断的结果反馈给客户端,客户端根据服务器端的反馈显示判断结果。
一、 客户端程序功能: a) 接收用户控制台输入 b) 判断输入内容是否合法 c) 按照协议格式生成发送数据 d) 发送数据 e) 接收服务器端反馈 f) 解析服务器端反馈信息,并输出 二、 服务器端程序功能: a) 接收客户端发送数据 b) 按照协议格式解析数据 c) 判断数字是不是质数 d) 根据判断结果,生成协议数据 e) 将数据反馈给客户端
eg:当客户端第一次链接到服务器端时,服务器端生产一个【0,50】之间的随机数字,而后客户端输入数字来猜该数字,每次客户端输入数字之后,发送给服务器端,服务器端判断该客户端发送的数字和随机数字的关系,并反馈比较结果,客户端总共有5次猜的机会,猜中时提示猜中,当输入”quit”时结束程序。
- 客户端程序功能列表: 一、 接收用户控制台输入 二、 判断输入内容是否合法 三、 按照协议格式发送数据 四、 根据服务器端的反馈给出相应提示 - 服务器端程序功能列表: 一、 接收客户端发送数据 二、 按照协议格式解析数据 三、 判断发送过来的数字和随机数字的关系 四、 根据判断结果生产协议数据 五、 将生产的数据反馈给客户端
问题1:
当DNS服务器正常工做时,使用IP地址或域名均可以很方便的找到计算机网络中的某个设备,例如服务器计算机。那当DNS不正常工做时该怎么样?问题1解决方案:
当DNS不正常工做时只能经过IP地址访问该设备。因此IP地址的使用要比域名通用一些。问题2:
客户端的编程主要由哪三个步骤实现?
问题2解决方案:
无
此次与实验有关的考试做答的不是很好,感受并无很好地掌握。之后会多多查看老师发的文件,去学习。
教材学习中的问题和解决过程, 一个问题加1分
代码调试中的问题和解决过程, 一个问题加1分
基于评分标准,我给本博客打分:XX分。得分状况以下:xxx
使用C/S结构的程序,在开发时须要分别开发客户端和服务器端,这种结构的优点在于因为客户端是专门开发的,因此根据须要实现各类效果,专业点说就是表现力丰富,而服务器端也须要专门进行开发。可是这种结构也存在着不少不足,例如通用性差,几乎不能通用等,也就是说一种程序的客户端只能和对应的服务器端通信,而不能和 其它服务器端通信,在实际维护时,也须要维护专门的客户端和服务器端,维护的压力比较大。
使用B/S结构的程序,在开发时只须要开发服务器端便可,这种结构的优点在于开发的压力比较小,不须要维护客户端。可是这种结构也存在着不少不足,例如浏览器的限制比较大,表现力不强,没法进行系统级操做等。
上周博客互评状况(只要连接,具体点评放相应博客下)
经过前面几周的学习,java的核心知识与难点以前都已经学完了,后面的章节大概都是介绍一些类的应用。在不断的学习中,我也在不断的寻找适合本身的学习方法。平时本身要主动敲代码,主动发现问题,提升学习效率。
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 5/5 | 1/4 | 20/20 | |
第二周 | 140/145 | 1/5 | 18/38 | |
第三周 | 330/451 | 1/6 | 16/54 | |
第四周 | 578/1038 | 1/7 | 18/72 | |
第五周 | 774/1472 | 1/8 | 18/90 | |
第六周 | 1592/3064 | 1/9 | 18/108 | |
第七周 | 1034/4098 | 2/11 | 22/130 | |
第八周 | 613/4711 | 1/12 | 20/150 | |
第九周 | 2924/5574 | 2/14 | 16/166 | |
第十周 | 984/6558 | 1/15 | 20/186 |
尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进本身的计划能力。这个工做学习中很重要,也颇有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。
计划学习时间:22小时
实际学习时间:20小时
改进状况:无
(有空多看看现代软件工程 课件
软件工程师能力自我评价表)