1.网络编程概述
(1)计算机网络
计算机网络是指将地理位置不同,具有独立功能的多台计算机及其外部设备通过通信线路连接起来的由功能完善的软件实现资源共享和信息传递的系统。
位于同一个网络中的计算机想要实现彼此通信,可以通过编写网络程序来实现,即在不同计算机上编写实现网络连接的程序。
(2)网络编程
Java是 Internet 上的语言,它从语言级上提供了对网络应用程序的 支持,程序员能够很容易开发常见的网络应用程序。
Java提供的网络类库,可以实现网络连接,联网的底层细节被隐藏在 Java 的本机安装系统里,由 JVM (虚拟机)进行控制。并且 Java 实现了一个 跨平台的网络库,程序员面对的是一个统一的网络编程环境。
网络编程的目的:
直接或间接地通过网络与其它计算机进行通讯。
网络编程中有两个主要的问题:
1.如何准确地定位网络上一台或多台主机
2.找到主机后如何可靠高效地进行数据传输。
2.网络通信协议
(1)概述
通过计算机网络可以实现多台计算机的连接,但是不同计算机的操作系统和硬件结构不同,为了提供通信支持,以及两台计算机之间如何进行数据传输,传输数据的格式是怎样的,为此制定了一个网络中计算机之间通信的协议(制定的通信的一种规则),对数据的传输格式,传输速率,传输步骤等做了一系列的规定。
(2)网络通信协议模型
(3)网络层的IP地址
网络层的IP(网际互联协议):.网络中的计算机使用IP地址来进行唯一标识,用来定位多个网络中的一台或者多台主机。(目前IP地址广泛使用的版本是IPv4,使用4字节大小的二进制数表示)
(4)端口
计算机中区分不同应用程序的唯一编号。(例如:计算机同时打开了QQ和微信,朋友通过微信发送了一条消息,请求到计算机时,接受请求的是微信而不是QQ,这就使用了端口号,根据端口号找到微信程序)
0 ~ 1024 未被系统使用或保留的端口号,0 ~ 65535为有效的端口号, 也就是说我们要对一些程序定义端口号的时候,要选择1024 ~ 65535范 围内的整数数字。
比如,MySQL的端口号是3306,SQLServer的端口号是1433,
(5)TCP(传输控制)通信协议
TCP是面向连接的通信协议,可在传输数据前建立连接通道,然后再进行传输数据,它提供了计算机之间通信的可靠无差别的数据传输。(TCP面向连接,安全可靠,传输效率低)
1.传输前,采用“三次握手”方式,是可靠的。
2.TCP协议进行通信的两个应用进程:客户端、服务端。
3.在连接中可进行大数据量的传输。
4.传输完毕,需释放已建立的连接,效率低。
5.在断开时要进行
“四次挥手
(6)TCP通信协议的三次握手和四次挥手
![](https://i-blog.csdnimg.cn/blog_migrate/2d16b306bf16b7efe1956b04d3e9884d.png)
(7)UDP(用户数据报)通信协议
UDP是无连接通信协议,即在数据传输时,数据的发送端和接收端不建立连接,也不需要释放连接,传输过程将数据、源、目的封装成数据包(数据报)。(不安全,效率高)
3.网络编程
(1)TCP网络编程
在java虚拟机中提供好了两个实现TCP程序的类,一个是ServerSocket类用于表示服务器端,另一个是Socket类,用于表示客户端,通信时,首先要创建服务端的ServerSocket对象,想到于开启一个服务,此服务会等待客户端的连接,然后创建代表客户端的Socket对象,然后通过该对象向服务端发出请求,服务端接受请求后才能建立连接。
1. 通信的两端都要有Socket,是两台机器间通信的端点。
2. 网络通信其实就是Socket间的通信。
3.Socket允许程序把网络连接当成一个流,数据在两个Socket间通过IO传输。
(2)客户端和服务端之间连接图
![](https://i-blog.csdnimg.cn/blog_migrate/90c15e4590461a1548283ec92e02bca0.png)
(3)举例实现客户端和服务端之间的简单聊天
package tcpDemo;
import java.io.*;
import java.net.Socket;
import java.util.Scanner;
public class khd {
public static void main(String[] args) {
try {while (true)
{Socket socket=new Socket("127.0.0.1",6666);//
//Socket(host,port),用于在客户端以指定的主机名和端口号创建一个,Socket对象,向服务端建立连接
System.out.println("客户端请输入:");
Scanner scanner=new Scanner(System.in);
String s=scanner.next();
OutputStream outputStream=socket.getOutputStream();//把网络连接当作一个流,获取与Socket相关联的字节输出流,用于向Socket中写数据。
DataOutputStream dataOutputStream=new DataOutputStream(outputStream);//字符处理流,通过包装节点流实现数据字符串的直接传输
dataOutputStream.writeUTF(s);
InputStream inputStream =socket.getInputStream();
DataInputStream dataInputStream=new DataInputStream(inputStream);
System.out.println("服务端发送的为:"+dataInputStream.readUTF());}
} catch (IOException e) {
e.printStackTrace();
}
}
}
package tcpDemo;
import com.sun.security.ntlm.Server;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
public class Fwd {
public static void main(String[] args) {
try {
ServerSocket serverSocketr = new ServerSocket(6666);
System.out.println("服务器启动成功");
String a="1";
while (a.equals("1")) {
Socket socket = serverSocketr.accept();//监听客户端是否发送请求连接到服务器,等待客户端的连接
System.out.println("有客户端连接到了服务器");
InputStream inputStream = socket.getInputStream();
DataInputStream dataInputStream = new DataInputStream(inputStream);
System.out.println("客户端发送的为:"+dataInputStream.readUTF());
System.out.println("服务端请输入");
Scanner scanner = new Scanner(System.in);
String s = scanner.next();
OutputStream outputStream = socket.getOutputStream();
DataOutputStream dataOutputStream = new DataOutputStream(outputStream);
dataOutputStream.writeUTF(s);
}
}
catch(IOException e){
e.printStackTrace();
}
}
}
上述两个代码分别为客户端和服务端,先启动服务端,再启动客户端,进行客户端和服务端之间的连接。