一、概述
目的:网络通信:
1、设备和设备
2、进程和进程
1)不同设备之间
2)本地设备之间
需要解决的问题:
如何准确地发送到对方的主机 - IP地址 - 唯一的定位网络中的一台主机
如何准确的发送到对方主机的进程 - 端口
找到主机后如何可靠高效地进行数据传输,要能看懂 - 协议 - 规定/标准
二、网络通信要素
如何实现网络中的主机互相通信?
~一定的规则(即:网络通信协议。有两套参考模型)
OSI参考模型
TCP/IP参考模型(或TCP/IP协议)
~通信双方地址
IP地址
端口号
2.1、网络协议:
一种规则,人与人交流有语言的规则,计算机之间通过网络交流也要有网络的规则。
2.1.1、OSI参考模型
模型过于理想化,未能在因特网上进行广泛推广
2.1.2、TCP\IP协议
出现较早,事实上的标准。
两种协议之间存在对应关系:
传输控制协议(TCP)和网络互联协议(IP),一组协议,不同功能互相关联
2.1.3、TCP和UDP
TCP协议:
使用TCP协议前,须先建立TCP连接,形成传输数据通道;
传输前,采用三次握手方式,是可靠的;
TCP协议进行通信的两个应用进程:客户端、服务端;
在连接中可进行大数据量的传输;
传输完毕,使用四次挥手方式,释放连接,结束传输,效率低。
UDP协议:
将数据、源、目的封装成数据包,不需要建立连接;
每个数据报的大小限制在64KB内;
因无需连接,故是不可靠的;
发送数据结束时无需释放资源,速度快。
三次握手过程:
四次挥手过程
2.2、IP地址和端口号
2.2.1、IP地址
唯一的标识Internet上的计算机(通信实体)
分类:
IPV4:4个字节组成,4个0~255,如192.168.0.1
IPV6:128位(16个字节),写成8个无符号整数,每个整数用四个十六进制表示
如:3ffe:3201:1401:1280:c8ff:fe4d:db39:198
2.2.2、端口号省略。。。
三、TCP编程_服务器和客户端
目标:
1、客户端能够连接服务器
2、客户端能够给服务器发送字符串并在服务器的控制台打印,直到发送exit表示发送结束
这里见源码及其注释:
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
/*
* 服务器
* */
public class Server {
public static void main(String[] args) throws IOException {
//创建监听套接字 最大端口65535
ServerSocket serverSocket = new ServerSocket(60000);
while (true) {
//创建已连接套接字 - 返回表示有客户端连接
Socket socket = serverSocket.accept();
//获取客户端的IP和端口
System.out.println(socket.getInetAddress().getHostAddress() + ":" + socket.getPort() + "已连接");
int len = 0;
byte[] arr = new byte[1024];
//IO操作
InputStream in = socket.getInputStream();
while(true) {
len = in.read(arr, 0, arr.length);
if(len == -1) {
break;
}
//byte[] --> String
String s = new String(arr, 0, len);
System.out.println(s);
}
//关闭
socket.close();
}
}
}
package day31;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;
public class Client {
public static void main(String[] args) throws IOException {
Scanner sc = new Scanner(System.in);
//创建套接字 -- 如果成功表示和服务器连接成功
Socket socket = new Socket("127.0.0.1", 60000);
//IO操作
OutputStream out = socket.getOutputStream();
while(true) {
//获取用户输入
String s = sc.next();
if(s.equals("exit")) {
break;
}
//将输入的数据发送给服务器
out.write(s.getBytes());
}
//关闭
socket.close();
}
}