网络编程:
借助于计算机网络,实现程序间进行信息/数据传输。
计算机网络:
利用通信设备和线路,把不同区域的计算机连接起来,最终实现数据传输。
Java语言是支持网络编程的,将网络的一些实现细节封装起来,对外提供一些类,程序员使用这些类进行编程即可。
网络编程的核心:
1、如何找到计算机网络中某台主机/程序(IP 和 端口号)
2、如何可靠高效的数据传输(通信协议)
网络模型:
OSI 7层模型
TCP/IP 模型 协议进行控制,IP定位
IP :是计算机地址
端口号:是计算机中程序的一个整数编号 有的程序启动时,计算机可以自动的分配,有的可以设置固定的端口号。 端口号不能重复。
通信协议:
在传输数据时,对如何传输进行控制,例如,传输什么内容、速率、出现问题如何解决等。
TCP协议:
Transmission Control Protocol 传输控制协议。
在发送数据前,都会先建立TCP连接,保证网络是否通畅。
采用”三次握手“机制:
1、客户端------>服务器 请求连接
2、服务器----->客户端 做出回应,确认收到请求
3、客户端------>服务器 再次进行一个确认回应
这样客户端与服务器双方都确认了。
问题1 :2次握手是否可行? 答:服务器不能得到确认回应
问题2:4次握手是否可行? 答:产生多余回应
数据传输是可靠的,服务器连接不通会报错。
在数据传输完毕后,断开连接时,采用“四次挥手”机制:
1、客户端------>服务器 发送断开请求
2、服务器----->客户端 确认回复,发送必要数据
3、服务器----->客户端 发送断开请求
4、客户端------>服务器 确认回复
特点:传输可靠,效率相对较低
UDP协议:
User Datagram Protocol 用户数据报协议。
将数据源、数据、目标地址封装成一个个数据包/报,然后发送
发送是否成功不知道
特点:不可靠的。因为不需要建立连接,所以效率高。
TCP编程:
基于TCP协议控制的数据传输
public static void main(String[] args) throws IOException {
Scanner scanner = new Scanner(System.in);
//创建服务器
ServerSocket serverSocket = new ServerSocket(6666);
System.out.println("服务器创建成功,等待客户端连接·····");
//连接
Socket accept = serverSocket.accept();
System.out.println("客户端连接成功");
//服务器接收
InputStream inputStream = accept.getInputStream();
DataInputStream dataInputStream = new DataInputStream(inputStream);
String s = dataInputStream.readUTF();
System.out.println(s);
//服务器发送
OutputStream outputStream = accept.getOutputStream();
DataOutputStream dataOutputStream = new DataOutputStream(outputStream);
System.out.println("服务器输入:");
String ss = scanner.next();
dataOutputStream.writeUTF(s);
dataInputStream.close();
dataOutputStream.close();
accept.close();
}
public static void main(String[] args) throws IOException {
Scanner scanner = new Scanner(System.in);
//创建客户端
Socket socket = new Socket("127.0.0.1", 6666);
//客户端发送
OutputStream outputStream = socket.getOutputStream();
DataOutputStream dataOutputStream = new DataOutputStream(outputStream);
System.out.println("客户端输入:");
String s = scanner.next();
dataOutputStream.writeUTF(s);
//客户端接收
InputStream inputStream = socket.getInputStream();
DataInputStream dataInputStream = new DataInputStream(inputStream);
String ss = dataInputStream.readUTF();
System.out.println(s);
dataOutputStream.close();
dataInputStream.close();
socket.close();
}