C/S架构: 即Client/Server(客户端/服务器端)架构,QQ、迅雷。java
B/S架构: 即Browser/Server(浏览器端/服务器端)架构,简化了系统的开发,维护和使用。谷歌、火狐。数据库
B/S架构与C/S架构的区别:编程
C/S架构基于局域网的,而B/S架构基于广域网的基础上。浏览器
硬件环境不一样,C/S创建在专用网络上,小范围的网络,能够专门的服务器提供数据链接和数据交换安全
C/S通常面向的固定用户群体,对信息的安全控制较高较高一点。服务器
对程序架构不一样网络
用户接口不一样:C/S架构大多创建在Windows平台上,B/S创建在浏览器上,不只能够应用在Windows平台上,也能够应用在Unix/Linux等平台上。多线程
两种架构各有优劣,可是不管使用哪一种架构,都离不开网络的支持。网络编程,就是在必定的协议下,实现两台计算机通讯的程序。架构
网络通讯协议:通讯协议是计算机通讯必须听从的一种规则,协议中对数据的传输格式、传输的速率、传输的步骤等都作了统一的规定,通讯双方必须同时遵照,最终实现数据的正常传输和交换。dom
TCP/IP:传输控制协议(TCP)/因特网互联协议(IP),他们俩定义了计算机如何联网、数据如何交换和传输的标准。它的内部包含了一系列用于处理数据通讯的协议,并采用了4层的分层模型,每一层都呼叫下一层所提供的协议来完成本身的请求。
TCP协议:传输控制协议,该协议是面向链接的通讯协议,即数据传输前,在发送端和接收端先创建逻辑链接,而后再传输数据,它提供了两台计算机之间可靠的无差错的数据传输。
三次握手:在数据发送的准备阶段,客户端和服务器之间经过三次交互,保证链接的可靠性。
三次握手:
经过三次握手,创建链接后,客户端和服务器端就能够进行数据传输了。因为这种面相链接的特性,TCP协议可以数据传输的安全。因此应用挺普遍的,下载文件等。
协议:计算机通讯必须遵照的规则。
IP地址:互联网协议地址,俗称IP,IP地址用来给网络中的计算机编订一个惟一的编号。
端口号:端口号就是惟一标识设备中的进程(应用程序)。IP地址是惟一标识网络中的设备。
IP地址分类:
IPv4:是一个32位的二进制数,一般被分为4个字节,表示形式:a.b.c.d ,例如:192.168.53.245 ,其中a.b.c.d都是一个0~255之间的十进制的整数,那么最多可以表示42亿个。
IPv6:为了扩大地址空间,经过IPv6从新定义地址空间,采用128位地址长度,每16个字节分为一组,分红8组十六进制数 ,表示形式:ABCD:EF01:2345:6789:ABCD:EF01:2345:6789,号称互联网中的任何一粒沙子可以编写进去,解决了地址不够的问题。
经过DOS命名查看本机的IP地址:ipconfig
检查网络链接是否正常:ping ip地址
特殊的IP地址:
本机的IP地址:127.0.0.1 localhost 经过hosts文件,能够自定义本身的域名
端口号:如何区分在网络通讯中打开的这些进程(应用程序)?经过端口号能够准确的找到彼此。
端口号:用两个字节表示的整数,它的取值范围是0~65535。 其中,0~1023之间的的端口号被一些知名的应用和网络服务占用了。普通的常规的应用程序只能使用从1024以上的端口号, 若是端口号被另一个服务或者应用程序占用了,会致使当前程序启动失败。
经常使用的端口号:
Tomcat应用服务器:8080
HTTP服务器:80 www.baidu.com:80 80端口能够选择省略不写
数据库服务器:MYSQL:3306 Oracle:1521
目的:实现两台计算机之间的交互,通讯两端要严格区分客户端和服务器端口
服务端须要启动,等待客户端连接
客户端须要主动地连接服务器端,连接成功才能通讯,服务器端口不能够主动连接客户端
在java中,提供两个类,实现TCP通讯:
客户端:建立Socket对象,建立以后就至关于建立了客户端,向服务器端发送连接请求,服务器端回响一个请求表示已经接受,二者就创建了通讯
服务器端:建立ServerSocket对象,建立以后就至关于,开启了一个服务,等待客户端连接
Socket类,实现客户端套接字,套接字指的是两台设备之间通信的端点,
public Socket(String host,int port);--->建立套接字对象并链接到指定主机的指定端口号,若是指定了host是一个null,那么就至关于与指定地址为回送地址【127.x.x.x】,是本机的回送地址,主要用于网络软件测试使用,本机上进程间的通讯。就不会进行网络传输
public InputStream getInputStream();---->获取套接字的输入流
public OutputStream getOutputStream();--->获取套接字输出流
public void close();--->关闭套接字
public void shoutdownOutput();--->禁用套接字输出流
任何先前写入的数据都将会被发送,最后终止输出流
ServerSocket类实现了服务器端套接字,该对象等待经过网络的请求
ServerSocket(int port);--->使用该构造方法子建立ServerSocket建立对象时,就能够将其绑定到一个指定的端口号上面,参数port就是端口号
public Socket accept();--->监听并接受链接,返回一个新的Socket对象,用于和用户端实现通讯。
步骤:
在客户端当中,经过输入流,从硬盘当中读取文件数据到内存
在客户端当中,经过输出流,写入文件数据到服务器端
在服务器端中,经过输入流,读取文件数据到服务器端中
在服务器端中,经过输出流,写入文件数据到服务器硬盘当中
服务端,保存文件的名称若是名称固定,那么最终会致使服务器硬盘,只会保留一个文件,对上传的文件名称优化,
//文件名称定义规则: "beautiful" + System.currentTimeMillis() + new Random().nextInt(1000000) + ".jpg";
服务器端,接收一个文件以后就关闭了,后面的其余客户端没法继续上传文件,使用循环进行改进,能够不断的接收不一样的客户端传输过来的文件。
// 使用循环 while(true) { Socket socket = serverSocket.accept(); .... .... }
服务器端,在接收文件的时候,加入某个客户端给你传输一个大文件,此时就不能再接收其余用户的文件,因此能够用多线程技术优化接收效率。
while(true) { Socket socket = serverSocket.accept(); // 使用多线程技术,提升程序的效率 // 有一个客户端上传文件,就开启一个线程,完成文件的上传 new Thread(new Runnable() { // 重写run方法,设定线程的任务 @Override public void run() { // 使用网络字节输入流对象 InputStream is = socket.getInputStream(); // 指定一个目录 File file = new File("D:\\upload"); if(!file.exits()) { file.mkdirs(); } // 防止同名的文件被覆盖 String filename = "beautiful" + System.currentTimeMillis() + new Random().nextInt(1000000) + ".jpg"; // 构建一个本地的文件字节输出流对象 new FileOutputStream(file + "\\" + filename); // 一读一写完成文件的上传,最终把文件写入到服务器端的硬盘当中。 ..... } }).start(); } // 服务端不关闭 // serverSocket.close();