一.网络通信的2种方式
1.TCP(传输控制协议)方式
TCP方式就类似于拨打电话,使用该种方式进行网络通讯时,需要建立专门的虚拟连接,然后进行可靠的数据传输,如果数据发送失败,则客户端会自动重发该数据
2.UDP(用户数据报协议)方式
UDP方式就类似于发送短信,使用这种方式进行网络通讯时,不需要建立专门的虚拟连接,传输也不是很可靠,如果发送失败则客户端无法获得
3.对比
重要数据一般是通过TCP协议进行数据传输的,因为TCP需要建立专用的虚拟连接以及确认传输是否正确,所以使用TCP方式的速度要稍微慢一些。
使用UDP时,每个数据报中都给出了完整的地址信息,因此无需要建立发送方和接收方的连接。
–对于TCP协议,由于它是一个面向连接的协议,在socket之间进行数据传输之前必然要建立连接,所以在TCP中多了一个连接建立的时间
–使用UDP传输数据时是有大小限制的,每个被传输的数据报必须限定在64KB之内。
–TCP没有这方面的限制,一旦连接建立起来,双方的socket就可以按统一的格式传输大量的数据。
–UDP是一个不可靠的协议,发送方所发送的数据报并不一定以相同的次序到达接收方。
–TCP是一个可靠的协议,它确保接收方完全正确地获取发送方所发送的全部数据
-TCP在网络通信上有极强的生命力,例如远程连接(Telnet)和文件传输(FTP)都需要不定长度的数据被可靠地传输。
—相比之下UDP操作简单,而且仅需要较少的监护,因此通常用于局域网高可靠性的分散系统中client/server应用程序
二.URL
1.创建URL
注意协议即可。public URL(String protocol, String host, String file);
2.解析URL
各种get方法。
3.从URL读取WWW网络资源
这样可以读取html文件。
三.网络编程
按照前面的基础知识介绍,无论使用TCP方式还是UDP方式进行网络通讯,网络编程都是由客户端和服务器端组成
3.1客户端网络编程步骤
客户端client指首先发起连接的程序,一般实现程序界面和基本逻辑实现。
1.建立网络连接:指定连接到的服务器的IP地址和端口号,完成后,会建立一条虚拟的连接,后续操作就可以通过该虚拟连接实现数据交换。
2.交换数据:交换数据严格按照请求响应模型进行,由客户端发送一个请求数据到服务器,如果客户端不发送请求则服务器端就不响应。
3.关闭网络连接:数据交换完成以后,关闭网络连接,释放和程序所占用的端口、内存等系统资源。
3.2服务器端网络编程步骤
服务器端Server是指在网络编程中被动等待连接的程序。一般实现程序的核心逻辑及数据存储等核心功能。
1.监听端口:服务器端启动后,不需要发起连接,只需要舰艇某个发放给客户端的端口,服务器程序运行的本地计算机的IP地址就是服务器程序的IP地址。
2.获取连接:当客户端连接到服务器时,服务器端就可以获得一个链接,这个连接包含客户端的信息。
3.数据交换:先接受客户端发来的数据,进行处理后发送回客户端。
4.关闭连接
四。基础网络类InetAddress
工厂方法(factory method)仅是一个类中静态方法返回一个该类实例的约定。对于InetAddress,三个方法 getLocalHost( )、getByName( )以及getAllByName( )可以用来创建InetAddress的实例
•如果这些方法不能解析主机名,它们引发一个UnknownHostException异常。
域名、IP、URL的联系
域名是个文字形式记录的IP地址 IP地址是计算机在网络中的门牌号!
URL是网页地址
打个比方 http://zhidao.baidu.com/question/14674128.html 是URL
zhidao.baidu.com 就是域名
220.181.18.110 就是IP地址
你通过录入URL http://zhidao.baidu.com/question/14674128.html让浏览器知道你要访问zhidao.baidu.com(域名)电脑就会把zhidao.baidu.com(域名)解析成220.181.18.110(ip地址)然后和220.181.18.110建立连接告诉220.181.18.110 我要看zhidao.baidu.com/question/14674128.html (URL)
五.TCP编程
java.net.Socket类代表客户端连接
java.net.ServerSocket类代表服务器端连接
在进行网络编程时,底层网络通讯的细节已经实现了比较高的封装,所以在程序员实际编程时,只需要指定IP地址和端口号码就可以建立连接了。
客户端
1) 建立Socket连接
Socket socket2 = new Socket(“www.sohu.com”,80);
2)按照“请求-响应”模型进行网络数据交换
在Java语言中,数据传输功能由Java IO实现,也就是说只需要从连接中获得输入流和输出流即可,然后将需要发送的数据写入连接对象的输出流中,在发送完成以后从输入流中读取数据即可。示例代码如下:
OutputStream os = socket1.getOutputStream(); //获得输出流
InputStream is = socket1.getInputStream(); //获得输入流
这里获得的只是最基本的输出流和输入流对象,还可以根据前面学习到的IO知识,使用流的嵌套将这些获得到的基本流对象转换成需要的装饰流对象,从而方便数据的操作。
3)关闭网络连接
socket1.close();
服务器端
首先需要说明的是,客户端的步骤和服务器端的编写步骤不同,所以在学习服务器端编程时注意不要和客户端混淆起来。
1)监听端口
ServerSocket ss = new ServerSocket(10000);
2)获得连接
当有客户端连接到达时,建立一个和客户端连接对应的Socket连 接对象,从而释放客户端连接对于服务器端端口的占用
Socket socket = ss.accept();
该代码实现的功能是获得当前连接到服务器端的客户端连接。需要说明的是accept和前面IO部分介绍的read方法一样,都是一个阻塞方法,也就是当无连接时,该方法将阻塞程序的执行,直到连接到达时才执行该行代码。另外获得的连接会在服务器端的该端口注册,这样以后就可以通过在服务器端的注册信息直接通信,而注册以后服务器端的端口就被释放出来,又可以继续接受其它的连接了。
3)按照“请求-响应”模型进行网络数据交换
这里获得的Socket类型的连接就和客户端的网络连接一样了,只是服务器端需要首先读取发送过来的数据,然后进行逻辑处理以后再发送给客户端,也就是交换数据的顺序和客户端交换数据的步骤刚好相反
InputStream is = ss.getInputStream(); //获得输入流
OutputStream os = ss.getOutputStream(); //获得输出流
4)关闭服务器端连接
ss.close();