第一章 网络编程入门
1.1 软件结构
- C/S结构:客户端和服务器结构,常见的有:QQ、迅雷等软件
- B/S结构:浏览器和服务器结构,常见的有:谷歌、火狐等
1.2网络通信协议
- 网络通信协议
- TCP/IP协议:传输控制协议/因特网互联协议。四层模型(应用层、传输层、网络层、数据链路层和物理层)
1.3协议分类:
- UDP:用户数据报协议。面向无连接的通信协议,当一台计算机向另一台计算机发送数据时,发送端不会确认接收端是否存在,就会发送数据,同样接收端在收到数据时,也不会向发送端反馈是否接收到数据。
优点:消耗资源小,通信效率高,通常用于音频、视频和普通数据的传输。
缺点:不能保证数据的完整性,偶尔会丢失少量数据包。 - TCP:传输控制协议。面向连接的通信协议,传输数据前,先建立逻辑连接,再传输数据,提供了两台计算机间可靠的无差错的数据传输。
在TCP连接中必须要明确客户端与服务器,由客户端发送连接请求,每次连接的创建都要经过“三次握手”。保证数据传输安全。 - 三次握手
1、第一次握手:客户端向服务器发送连接请求,等待服务器确认。
2、第二次握手:服务器向客户端回送一个响应。通知客户端收到了连接请求。
3、第三次握手:客户端再次向服务器发送确认信息,确认连接。
1.4网络编程三要素
①协议
②IP地址
- ipv4 32位的二进制数,通常被分为四个字节,可以表示2^32≈42亿个
- ipv6 128位的十六进制数,每16个字节一组,分成8组,可以表示16^128个
特殊的IP地址:127.0.0.1、localhost
③端口号
- 是一个逻辑端口,无法直接看到。由两个字节组成,取值范围在0-65535之间
注意:
1、1024之前的端口号已经不能使用了,被系统分配到已知的网络软件了
2、端口号不能重复 - 使用IP+端口号就能保证数据准确无误地发送到对方计算机的指定软件上了
常见的端口号:
1、80端口 网络端口 如:www.baidu.com:80
2、数据库 mysql:3306 oracle:1521
3、Tomcat服务器:8080
第二章:TCP通信程序
2.1概述
两端通信步骤:
1、服务端程序,需要事先启动,等待客户端的连接
2、客户端主动连接服务器端,连接成功才能实现通信。服务端不可以主动连接客户端。
在Java中,提供了两个类来实现TCP通信程序
1、客户端:java.net.Socket
类表示,创建Socket对象,向服务端发出连接请求,服务端响应请求,两者建立连接开始通信。
2、服务端:java.net.ServerSocket
类表示。创建 ServerSocket 对象,相当于开启一个服务,并等待客户端 的连接。
2.2 Socket类
Socket 类:该类实现客户端套接字,套接字指的是两台设备之间通讯的端点。 构造方法public Socket(String host, int port) :
创建套接字对象并将其连接到指定主机上的指定端口号。如果指 定的host是null ,则相当于指定地址为回送地址。
例如:
Socket client = new Socket("127.0.0.1", 6666);
成员方法包括:getInputStream、getOutputStream、close、shutdownOutput.
具体实现:
客户端类:
package com.silencoco._NET;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public class TCPClient {
public static void main(String[] args) throws IOException {
/**
* 设置IP、端口号
* 使用socket中的getOutputStream方法获取os对象
* 使用outputStream中的write给服务器发送数据
*
* getInputStream获取,read读取
* 释放资源
*/
Socket socket = new Socket("127.0.0.1",8888);
// socket.getOutputStream().write(Integer.parseInt("向服务器发送数据..."));
OutputStream os = socket.getOutputStream();
os.write("客户端发出请求".getBytes());
InputStream is = socket.getInputStream();
byte[] bytes = new byte[1024];
int len = is.read(bytes);
System.out.printf(new String(bytes,0,len));
socket.close();
}
}
服务器类:
package com.silencoco._NET;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
/**
* 创建ServerSocket对象,指定端口号,
* 使用ServerSocket对象中的accept获取到请求的客户端对象Socket
* 使用socket对象中国年的getInputStream获取输入流
* read读取
* 在用socket.getOutputStream write 回写数据
* close
*/
public class TCPServer {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(8888);
Socket socket = serverSocket.accept();
InputStream is = socket.getInputStream();
byte[] bytes = new byte[1024];
int len = is.read(bytes);
System.out.printf(new String(bytes,0,len));
OutputStream os = socket.getOutputStream();
os.write("服务器收到请求并响应".getBytes());
serverSocket.close();
socket.close();
}
}