1 两种基本软件结构
(1)C/S:指客户端和服务端结构,用户需要安装客户端软件和服务端进行数据交互。
1)优点:可以充分利用用户的计算机资源,和服务端数据传输少;大型游戏,QQ,迅雷使用该种结构。
2)缺点:开发和维护成本高,需要开发和维护两个软件;
(2)B/S:指浏览器和服务端结构,用户直接使用浏览器通过网址访问
1)优点:只需要开发服务端软件,开发和维护成本低;
2)缺点:浏览器的数据处理性能较低,主要用来接收服务端传输数据,数据传输量较大;
2 网络通信协议
(1)网络通信协议是为了能够协调好网络中大量设备进行数据通讯的一种规则,互联网最基本,最广泛的协议是TCP/IP,它是一系列保证网络通信的协议的总称;
(2)TCP/IP协议
1)四层网络模型
四层模型包含应用层,传输层,网络层,数据链路以及物理层,对于java开发,接触到的一般是传输层和应用层,传输层是将底层的数据封装为IO流,使用API中提供的Socket类来获取流;应用层主要是获取传输层中数据流的内容,并对内容以一定的协议进行解析,获取需要的内容,例如http协议可以将浏览器发送过来的请求信息进行解析,得到请求的资源路径,浏览器相关信息等。
2)TCP和UDP协议
TCP和UDP是TCP/IP四层模型中的传输层的两种协议,有各自的特点和应用场景
1)TCP:是一种较可靠的传输协议,传输数据前进行三次握手,断开数据进行四次挥手,传输过程数据大小无限制,应用在网页浏览,邮件,文件下载等;
2)UDP:是一种面向无连接的传输协议,传输数据前不需要建立连接,直接将数据发送,若对方无法接收则丢失数据,所以数据传输不可靠,但是由于省去了连接前的繁琐操作,传输速度较快;传输的每个数据包大小限制在64KB,应用在视频通讯,QQ聊天等。
3)TCP的三次握手
1)第一次:客户端向服务端发送连接请求,确保客户端发送正常,服务端接收正常;
2)第二次:服务端回复确认信息,确保客户端接收正常,服务端发送正常;
3)第三次:客户端再次发送链接确认信息,确认连接;
4)TCP的四次挥手
1)客户端数据传输结束,向服务端发送接收请求;
2)服务端回复结束信息;
3)客户端断开连接;
4)服务端断开连接。
3 网络编程三要素
1)协议:协议是用来保证互联网设备之间的数据传输;
2)IP地址:用来给网络中的每台设备进行唯一编号,保证可以通过IP地址找到对应的设备,分为IPV4和IPV6两种
1)IPV4:32位二进制组成,每8为一组,表示成 a.b.c.d 的形式,例如 192.168.65.100,可以表示42亿个地址;
2)IPV6:128位二进制组成,每16位为一组,分为8组16进制表示,例如ABCD:EF01:2345:6789:ABCD:EF01:2345:6789;
3)端口号:端口号是计算机设备中每个进程的编号,可以保证数据传输到指定计算机设备的指定进程;计算机之间的通信本质是软件和软件之间的数据交互,软件在计算机中运行的体现就是进程。
端口号由2字节表示,可以表示0-65535端口号,0-1023是一些知名的网络服务和应用占用,普通的应用程序需要使用1023以上端口号,如果要使用的端口号被占用,则进程启动失败
4 TCP网络通信
TCP网络通信需要严格区分客户端和服务端,java API中为TCP通信提供了两个类,客户端使用的Socket类和服务端使用的ServerSocket类
(1)Socket 类:该类实现客户端套接字,套接字指的是两台设备之间通讯的端点。
1)构造方法:Socket(String host,int port):指定主机IP地址和端口号,如果host为null,则回传地址(127.x.x.x)
Socket client = new Socket("127.0.0.1", 6666);
2)常用方法:
1)public InputStream getInputStream() : 返回此套接字的输入流。
如果此Scoket具有相关联的通道,则生成的InputStream 的所有操作也关联该通道。
关闭生成的InputStream也将关闭相关的Socket。
2)public OutputStream getOutputStream() : 返回此套接字的输出流。
如果此Scoket具有相关联的通道,则生成的OutputStream 的所有操作也关联该通道。
关闭生成的OutputStream也将关闭相关的Socket。
3)public void close() :关闭此套接字。
一旦一个socket被关闭,它不可再使用。
关闭此socket也将关闭相关的InputStream和OutputStream 。
4)public void shutdownOutput() : 禁用此套接字的输出流。
任何先前写出的数据将被发送,随后终止输出流
(2)ServerSocket类:实现类服务端套接字,等待通过网络的请求
1)构造方法
ServerSocket(int port)创建一个服务端套接字,将其绑定到指定端口
ServerSocket server = new ServerSocket(6666);
2)常用方法
public Socket accept():侦听来自网络的连接请求,如果没有获取连接则阻塞,获取连接后返回一个Socket对象
5 创建一个简单的TCP网络程序
(1)客户端向服务端发送数据
1)【服务端】启动,创建ServerSocket对象,等待连接。
2)【客户端】启动,创建Socket对象,请求连接。
3)【服务端】接收连接,调用accept方法,并返回一个Socket对象。
4) 【客户端】Socket对象,获取OutputStream,向服务端写出数据。
5)【服务端】Scoket对象,获取InputStream,读取客户端发送的数据
(2)服务端向客户端发送程序
6)【服务端】Socket对象,获取OutputStream,向客户端回写数据。
7)【客户端】Scoket对象,获取InputStream,解析回写数据。
8)【客户端】释放资源,断开连接。
服务端程序
public class ServerTCP {
public static void main(String[] args) throws IOException {
System.out.println("服务端启动 , 等待连接 .... ");
// 1.创建 ServerSocket对象,绑定端口,开始等待连接
ServerSocket ss = new ServerSocket(6666);
// 2.接收连接 accept 方法, 返回 socket 对象.
Socket server = ss.accept();
// 3.通过socket 获取输入流
InputStream is = server.getInputStream();
// 4.一次性读取数据
// 4.1 创建字节数组
byte[] b = new byte[1024];
// 4.2 据读取到字节数组中.
int len = is.read(b);
// 4.3 解析数组,打印字符串信息
String msg = new String(b, 0, len);
System.out.println(msg);
//5.关闭资源.
is.close();
server.close();
}
}
客户端程序
public class ClientTCP {
public static void main(String[] args) throws Exception {
System.out.println("客户端 发送数据");
// 1.创建 Socket ( ip , port ) , 确定连接到哪里.
Socket client = new Socket("localhost", 6666);
// 2.获取流对象 . 输出流
OutputStream os = client.getOutputStream();
// 3.写出数据.
os.write("你好么? tcp ,我来了".getBytes());
// 4. 关闭资源 .
os.close();
client.close();
}
}