文章目录

基本概念

通过计算机网络可以使多台计算机实现连接,且连接的计算机进行通信时必须遵守一定的规则,这类规则被称为网络通信协议,它对数据的传输格式、速率、步骤等做了统一规定,这些规定是网络中计算机相互完成数据交换的必要前提。

网络通信协议分类
  • UDP:User Datagram Protocol,用户数据报协议;不提供复杂的控制机制,利用IP提供面向无连接的通信服务;效率高,但不安全。
    – 1) 包量较少的通信(DNS、SNMP登录)
    – 2) 视频、音频等多媒体通信(即时通信)
    – 3) 限定于LAN等特定网络中的应用通信
    – 4) 广播通信(广播、多播)
  • TCP:Transmission Control Protocol,传输控制协议;通过三次握手、四次挥手流程 提供可靠的通信传输;安全但效率没有UDP高
    – 1) 文件上传下载
    – 2) 网页浏览
IP地址

是指互联网协议地址(Internet Protocol Address);用来给一个网络中的计算机设备做唯一的网络编号。

  • IPv4:是一个32位的二进制数,通常被分为4个字节,表示成a.b.c.d的形式,其中a.b.c.d都是0-255之间的十进制数,比如192.168.0.1;最多可以表示42亿个地址。
  • IPv6:采用128位地址长工,每16个字节一组,分成8组16进制数,比如ABCD:12F0:EC98:1234:67BA:009A:EFEF:ABAB,IPv6的出现,解决了IPv4网络地址资源紧张的问题。
  • 特殊的IP地址:127.0.0.1
端口号

在计算机与计算通通信过程中,必须保证数据能准确无误的发送到对方的计算机上,除了计算机自身的IP地址外,还需要引入端口号做为通信的必要标识。例如 192.168.0.1:8080

  • 端口号是由两个字节组成的,取值范围在0-65535之间;且0-1024之间的端口号已经被操作系统分配,不能随意使用。
  • 常用的端品号
    – 80: http端口
    – 3306:mysql端口
    –8080: tomcat端口
TCP/IP协议

Java网络编程的基础知识_端口号

TCP通信程序

握手连接

客户端和服务器端必须经过3次握手,建立逻辑连接,才能通信。

Java网络编程的基础知识_java_02

实现方式

客户端向服务器端发送连接请求后,就被动地等待服务器的响应。典型的 TCP 客户端要经过下面三步操作:

  • 创建一个 Socket 实例:构造函数向指定的远程主机和端口建立一个 TCP 连接;
  • 通过套接字的 I/O 流与服务端通信;
  • 使用 Socket 类的 close 方法关闭连接。

服务端的工作是建立一个通信终端,并被动地等待客户端的连接。典型的 TCP 服务端执行如下两步操作:

  • 创建一个 ServerSocket 实例并指定本地端口,用来监听客户端在该端口发送的 TCP 连接请求;
  • 重复执行:
    – 调用 ServerSocket 的 accept()方法以获取客户端连接,并通过其返回值创建一个 Socket 实例;
    – 为返回的 Socket 实例开启新的线程,并使用返回的 Socket 实例的 I/O 流与客户端通信; 通信完成后,使用 Socket 类的 close()方法关闭该客户端的套接字连接。
客户端的实现代码
  • 使用java.net.Socket类创建一个客户端对象,构造方法中指定服务器的IP地址和端口号;
  • 使用Socket对象的方法getOutputStream()获取网络字节输出流;
  • 使用网络字节输出流的方法write,向服务器端发送数据;
  • 使用Socket对象的方法getInputStrem()获取网络字节输入流;
  • 使用网络字节输入流的方法read,读取服务器传回的数据;
  • 释放资源
/**
* TCP通信程序--客户端代码
*
* @author zhuhuix
* @date 2020-06-27
*/
public class TCPClientDemo {
public static void main(String[] args) throws IOException {

Socket socket = new Socket("127.0.0.1", 8088);
OutputStream outputStream = socket.getOutputStream();
outputStream.write("TCP通信程序客户端发送:Hello".getBytes());
InputStream inputStream = socket.getInputStream();
byte[] bytes = new byte[1024];
int len;
len = inputStream.read(bytes);
System.out.println(new String(bytes, 0, len));

socket.close();

}
}
服务端的实现代码
  • 使用java.net.ServerSocket类创建一个服务端对象,构造方法中指定端口号;
  • 使用ServerSocket对象的方法accept(),获取到请求的客户端的Socket对象;
  • 开启新的线程处理客户端Socket对象
    – 使用Socket对象的方法getInputStrem()获取网络字节输入流;
    – 使用网络字节输入流的方法read,读取客户端发送的数据;
    – 使用Socket对象的方法getOutputStream()获取网络字节输出流;
    – 使用网络字节输出流的方法write,向客户端回写数据;
  • 释放资源
/**
* TCP通信程序--服务端代码
*
* @author zhuhuix
* @date 2020-06-27
*/
public class TCPServerDemo {
public static void main(String[] args) throws IOException {

ServerSocket serverSocket = new ServerSocket(8088);
boolean finished = false;
Socket socket;
while (!finished) {
socket= serverSocket.accept();
new Thread(new ServerThread(socket)).start();
}
serverSocket.close();

}

}

// 多线程处理客户端请求
class ServerThread implements Runnable {
private Socket client;

ServerThread(Socket client) {
this.client = client;
}

@Override
public void run() {
try {
InputStream inputStream = client.getInputStream();
byte[] bytes= new byte[1024];
int len;
len = inputStream.read(bytes);
System.out.println(new String(bytes,0,len));
OutputStream outputStream = client.getOutputStream();
outputStream.write("TCP通信程序服务端发送:World".getBytes());
client.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}