java学习笔记16-【网络编程】

1.1软件结构
分为C/S结构和B/S结构,C/S结构全称为Client/Server,客户端/服务器端结构,常见的有QQ\迅雷等
B/S全称是Browser/Server,浏览器/服务器结构,常见的有谷歌\火狐\IE浏览器等

网络编程,就是在一定的协议下,实现两台计算机之间通信的程序

1.2网络通信协议
网络通信协议,是计算机必须遵守的规则,只有遵守这些规则,计算机之间才能进行通信.协议中对数据的传输格式,传输速率,传输步骤等进行了统一的规定,双方必须同时遵守,最终完成数据交换

TCP/IP协议:传输控制协议(TransmissionControlProtocol),因特网互联协议(InternetProtocol),是Internet最基本最广泛的协议.它定义了计算机如何连入因特网,以及数据如何在它们之间传输的标准.它的内部包含了一些列的用于处理数据通信的协议,并采用了4层的分层模型,每一层都呼叫它的下一层所提供的协议来完成自己的需求.
四层分别是应用层(HTTP等),传输层(TCP,UDP),网络层(IP等),物理层/数据链路层(由底层网络定义的协议)

java.net包中包含的类和接口,它们提供低层次的通信细节,我们可以直接使用这些类和接口,来专注于网络程序的开发,而不用考虑通信细节.
java.net包提供了两种最常见的协议的支持 TCP UDP

TCP协议是面向连接的协议,即在传输数据之前,发送端和接收端之间需要先建立逻辑连接,然后再传输数据 它提供了两台计算机之间可靠无差错的数据传输
三次握手:TCP协议中,在发送数据的准备阶段,客户端和服务端之间会进行三次交互,以保证连接的可靠
第一次握手:客户端向服务器端发送连接请求,等待服务器端确认
第二次握手:服务器端向客户端发送确认响应,通知客户端接收到连接请求
第三次握手:客户端再次向服务器端发送确认信息,确认连接.

完成三次握手后,客户端和服务器端就建立了连接,可以传输数据.因为TCP协议面向连接的特性,可以保证传输数据的安全,所以应用十分广泛.如下载,浏览网页等

UDP协议,用户数据报协议(UserDatagramProtocol).该协议是一个面向无连接的协议.传输数据时,不需要建立连接,不管对方端服务是否开启,直接将数据,数据源和目的地封装到数据包中,直接发送.因为无连接,所有传输的速度很快.如视频会议,QQ聊天等.但是数据容易丢失.是一种不可靠协议.每个数据包的大小,限制在64K以内

网络编程三要素
1.协议:计算机网络必须遵守的规则
2.ip地址
3.端口号

ip地址,指互联网协议地址(InternetProtocolAddress) ip地址用来给网络中的计算机设备做唯一的编号

ipv4是一个32位的二进制数,通常用4个字节表示,a.b.c.d 每个字节是8位,表示成十进制的数字就是256个,所以每个字母的取值都是0-255 能表示的ip地址数约为42亿个,在2011年已经被耗尽
ipv6是一个128位的二进制数,共16个字节,分成8组16进制数来表示,号称可以为全世界每粒沙子编上地址,这样就解决了网络地址资源不足的问题

常用命令 ipconfig查看本机IP地址 ping ip地址检查网络是否联通
特殊的ip地址 127.0.0.1本机地址 localhost本机地址

端口号
网络的通信本质上是两个进程之间的通信,那么一个计算机上这么多进程,如何区分呢,ip地址可以在网络上唯一标识计算机设备,那么端口号就可以在计算机上的唯一标识进程
端口号用两个字节表示的整数,取值范围是0-65535 如果一个进程的端口号被占用,那么会启动失败

利用协议+IP地址+端口号 三元组合就可以唯一标识一个网络中的进程,该进程就可以与其他进程进行交互

TCP通信能够实现两台计算机之间的数据交互,通信的两端需要严格的区分客户端和服务端.通信的步骤如下:
1.服务器端必须事先启动,等待客户端连接
2.客户端主动连接服务器端,连接成功才能通信,服务器端不能主动连接客户端

java中提供了两个类用于实现TCP通信协议,
分别为java.net.Socket 客户端 向服务器端发送连接请求,等待服务器端响应后,建立连接,开始进行通信
java.net.SocketServer 服务器端 事先启动,等待客户端连接

Socket类,该类实现客户端套接字.套接字指的是两台设备之间通讯的端点
构造方法public Socket(String host,int port) 即指定一个ip地址及端口号 如果指定的host是null,则代表指定地址是回送地址
回送地址:指本机回送地址(loopback Address)(127.x.x.x),主要用于网络软件测试和本地进程间通信,无论什么程序,一旦使用本地回送地址发送数据,立即返回,不进行任何网络传输

成员方法 getInPutStream() getOutPutStream() 返回此套接字的输入流和输出流 如果此Socket有相关联的通道,那么它的输入输出流也关联该通道,关闭它生成的输入或输出流后,此Socket也将被关闭
close()关闭此套接字,该套接字将不能使用 它相关的输入输出流也将被关闭
shutdownOutPut()禁用此套接字的输出流 任何先前写出的数据将会被发送,随后终止输出流

ServerSocket类,该类实现了服务器套接字,该类的对象等待通过网络的连接请求
构造方法 public SocketServer(int port)
成员方法:public Scoket accept() 侦听并接收连接返回一个新的Socket对象,用于和客户端进行通信.该方法会一直阻塞到建立连接

文件上传优化分析:1.文件名写死的问题 可以用系统时间命名,防止最终只写了一个文件,反复覆盖的问题 System.currentTimeMillis()+".txt"
2.循环接收的问题 服务器端只接受一个文件就关闭是不符合实际的,可以加while(TRUE) 循环

浏览器的工作原理是遇到一个图片后会开启一个新的线程来单独处理,所以服务器端我们加入多线程技术

猜你喜欢

转载自blog.csdn.net/wwzzh1989/article/details/89209039