软件结构:
C/S结构:Client/Server结构,指客户端和服务器端结构,常见程序如QQ,迅雷等
B/S结构:Browswe/Server结构,指浏览器和服务器结构。常见的浏览器如谷歌,火狐等
网络编程:就是在一定的协议下,实现两台计算机的通信的程序
网络通信协议:
通过计算机网络可以使多台计算机实现连接,位于同一网络的计算机在进行连接和通信时需要遵守一定的规则,在计算机网络中,这些连接和通信的规则被称为网络通信协议。
TCP/IP协议:是指能够在多个不同网络间实现信息传输的协议簇。TCP/IP协议不仅仅指的是TCP 和IP两个协议,而是指一个由FTP、SMTP、TCP、UDP、IP等协议构成的协议簇, 只是因为在TCP/IP协议中TCP协议和IP协议最具代表性,所以被称为TCP/IP协议。
TCP/IP传输协议是严格来说是一个四层的体系结构,应用层、传输层、网络层和数据链路层都包含其中。
协议分类:
UDP:用户数据报协议(User Datagram Protocol)。无连接通信协议,UDP协议消耗资源小,通信效率高。
但是不能保证数据的完整性。特点:数据被限制在64kb内,超过这个范围就不能发送了
TCP:传输控制协议,面向连接的通信协议。发送端和接收端应该建立逻辑连接,提供了两台计算机之间可靠误差错的数据传输。
在发送数据的准备阶段,客户端和服务器端之间的三次交互,保证连接的可靠
TCP协议可以保证传输数据的安全,所以应用十分广泛,如下载文件、浏览网页等。
网络编程三要素:
1.协议
2.IP地址:互联网协议地址,网络中的计算机设备的唯一编号
3.端口号:
计算机通过网络可以连接在一起,那么计算机之间就可以进行通信了(发送数据。。。),我们通过ip地址可以找到对方的计算机。
注意:我们必须保证数据能准确无误的发送到对方计算机的软件上。
端口号:是一个逻辑端口,我们无法直接看到,可以使用一些软件查看端口号
当我们使用网络软件一打开,那么操作系统就会为网络软件分配一个随机的端口号
或者网络软件在打开的时候和系统要指定的端口号
端口号是由两个字节组成的,取值范围在0-65535之间
注意:1024之前的端口号我们不能使用,已经被系统分配给已知的网络软件了
网络软件的端口号不能重复
我们使用IP地址加端口号,就可以保证数据准确无误的发送到对面计算机的指定软件上了
常用的端口号
1.80端口 网络端口 www.baidu.com:80 正确的网址
2.数据库 mysql:3306 oracle:1521
3.Tomcat服务器:8080
TCP通信程序概述:
TCP通信:面向连接的通信,客户端和服务器端必须得经过3次握手,建立逻辑连接,才能通信(安全)。
通信的步骤:
服务器端先启动
服务器端不会主动地请求客户端
必须使用客户端请求服务器端
客户端和服务器端就会建立逻辑连接
而这个连接中包含了一个对象,这个对象就是IO对象
客户端和服务器端就可以使用IO对象进行通信
通信的数据不仅仅是字符,所以IO对象是字节流对象
①:客户端给服务器端发送数据
OutputStream:你好服务器
②:服务器端读取客户端发送的数据
InputStream:你好服务器
③:服务器端给客户端发送数据
OutputStream:收到谢谢
④:客户端读取服务器端发送的数据
InputStream:收到谢谢
客户端和服务器端进行一次数据交互,需要4个IO流对象。
服务器端必须明确两件事情:
1.多个客户端可以同时和服务器进行交互,服务器必须明确和哪个客户端进行的交互
在服务器端有个方法,叫accept客户端获取到请求的客户端对象
2.多个客户端同时和服务器端进行交互,就需要使用多个IO流对象
服务器没有IO流,服务器可以获取到请求的客户端对象Socket,使用每个客户端Socket中提供的IO流和客户端进行交互。
服务器使用客户端的字节输入流读取客户端发送的数据。
服务器使用客户端的字节输出流给客户端回写数据。
简单记:服务器使用客户端的流和客户端进行交互。
我请你吃饭,但是没钱,和你借10元,请你吃饭
服务器端:Socket s1=server.accept();
TCP通信的客户端代码实现:
/* * TCP通信的客户端:向服务器发送连接请求,给服务器发送数据,读取服务器回写的数据 * 表示客户端的类: * java.net.Socket:该类实现客户端套接字(也称为“套接字”)。 套接字是两台机器之间通讯的端点。 * 套接字:包含了IP地址和端口号的网络单位 * * 构造方法:Socket(String host, int port) :创建流套接字并将其连接到指定主机上的指定端口号。 * 参数: * String host:服务器主机的名称/服务器的IP地址 * int port:服务器的端口号 * * 成员方法:OutputStream getOutputStream() :返回此套接字的输出流。 * InputStream getInputStream() :返回此套接字的输入流。 * void close():关闭套接字。 * 实现步骤: * 1.创建客户端对象,构造方法中绑定服务器的IP地址和端口号 * 2.使用Socket对象中的方法getOutputStream()获取网络字节输出流OutputStream对象 * 3.使用网络字节输出流OutputStream对象中的方法write给服务器发送数据 * 4.使用Socket对象中的方法getInputStream()获取网络字节输入流对象InputStream对象 * 5.使用网络字节输入流对象InputStream对象read读取服务器回写的数据。 * 6.释放资源(Socket) * 注意事项: * 1.客户端和服务器端进行交互,必须使用Socket中提供的网络流,不能使用自己创建的流对象 * 2.当我们创建客户端对象Socket的时候,就会请求服务器和服务器经过3次握手建立连接通路 * 这是如果服务器没有启动,那么就会抛出异常 * 如果服务器已经启动,那么就可以进行交互 */ public class TCPClient { public static void main(String[] args) throws IOException { Socket s=new Socket("127.0.0.1",8888); OutputStream os = s.getOutputStream(); os.write("你好服务器".getBytes()); InputStream is = s.getInputStream(); byte[] bytes=new byte[1024]; int len=is.read(bytes); System.out.println(new String(bytes,0,len)); s.close(); } }
TCP通信的服务器端代码实现:
/* * TCP通信的服务器端:接受客户端的请求,读取客户端发送的数据,给客户端回写数据 * 表示服务器的类: * java.net.ServerSocket:此类实现服务器套接字 * 构造方法: * ServerSocket(int port) :创建绑定到指定端口的服务器套接字。 * * 服务器端必须明确一件事情,必须得知道是哪客户端请求的服务器 * 所以可以使用accept方法获取到请求的客户端对象Socket * 成员方法: * Socket accept() :侦听要连接到此套接字并接受它。 * 服务器端的实现步骤: * 1.创建服务器ServerSocket对象和系统要指定的端口号 * 2.使用ServerSocket对象中的方法accept,获取到请求的客户端对象Socket * 3.使用Socket对象中的方法getInputStream()获取网络字节输入流对象InputStream对象 * 4.使用网络字节输入流对象InputStream对象中的方法read,读取服务器发送的数据。 * 5.使用Socket对象中的方法getOutputStream()获取网络字节输出流OutputStream对象 * 6.使用网络字节输出流OutputStream对象中的方法write给客户端回写数据 * 7.释放资源(Socket,ServerSocket)*/ public class TCPServer { public static void main(String[] args) throws IOException { ServerSocket server=new ServerSocket(8888); Socket socket = server.accept(); InputStream is = socket.getInputStream(); byte[] bytes=new byte[1024]; int len=is.read(bytes); System.out.println(new String(bytes,0,len)); OutputStream os = socket.getOutputStream(); os.write("收到,谢谢!".getBytes()); socket.close(); server.close(); } }