①.计算机网络
地球村:也译为世界村(global village),对地球的一种比喻说法。现代科技的迅速发展,缩小了地球上的时空距离,国际交往日益频繁便利,因而整个地球就如同是茫茫宇宙中的一个小村落。——百度词条
打电话 接听——通话 → TCP通信
发短信 发送了就结束了 → UDP通信
- 计算机网络:计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。
- 网络编程的目的:传播交流信息,数据交换,进行通信
- 想要达到的效果是什么:
如何准确的定位网络上的一台主机:192.168.xxx.xxx:端口,定位到计算机上的某个资源
找到主机,传递数据。
JavaWeb编程:web相关的,网页的编程 B/S架构
网络编程:主要与TCP/IP相关 C/S架构
②.网络通信的要素
进行网络通信的关键是,双方都互相知道对方的地址
IP:公网的IP地址是唯一的
端口号:计算机上具体的哪一个端口
规则:网络通信的协议 http, ftp, … TCP/IP参考模型
TCP/IP参考模型,七层参考协议
③.IP地址
IP地址类:java.net.InetAddress
- 唯一的定义一台网络上的计算机
- 127.0.0.1:本机localhost
- IP地址的分类
IPv4:192.168.0.1,由四个字节组成,0~255,大概有42亿个,30亿都在北美,亚洲4亿,2011年用尽;
IPv6:2001:0b3b:aa15:0000:12e3:34c5:0001:acbc,8个无符号整数 128位
公网(互联网)-私网(局域网)
192.168.xxx.121 提供给组织内部使用的
A、B、C、D类IP地址
域名:为了解决记忆IP问题诞生的
IP:www.jd.com
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Arrays;
//测试IP
public class TestIP {
public static void main(String[] args) {
try {
//查询本机地址
InetAddress address = InetAddress.getByName("127.0.0.1"); //静态方法,只能通过返回值获取对象
System.out.println(address); //输出/127.0.0.1 默认调用toString方法
address = InetAddress.getByName("localhost"); //out: localhost/127.0.0.1
System.out.println(address.toString());
address = InetAddress.getLocalHost();
System.out.println(address.toString()); //LAPTOP-3KN1I8T8/192.168.3.14
//查询网站IP地址
address = InetAddress.getByName("www.baidu.com");
System.out.println(address.toString()); //out: www.baidu.com/14.215.177.38
//常用方法
System.out.println(Arrays.toString(address.getAddress())); //返回一组地址
System.out.println(address.getCanonicalHostName()); //获取规范的IP名
System.out.println(address.getHostAddress()); //获得主机名
System.out.println(address.getHostName()); //获得域名
} catch (UnknownHostException e) {
e.printStackTrace();
}
}
}
④.端口Port
端口表示计算机上的一个程序的进程
- 不同的进程有不同的端口号!端口号是唯一的,用来区分软件。
- 一般端口被规定 0~65535
- 分为TCP,UDP端口 65535*2个—同一个协议下的端口号不能冲突,但是不同协议可以
- 端口分类:
- 公有有端口(0~1023):尽量不要占用
HTTP使用:80端口
HTTPS使用:443端口
FTP使用:21端口
SSH使用:22端口
TELENT:23端口
- 程序注册端口(1024~49151):分配给用户或者程序的
Tomcat :8080
MySQL :3306
Oracle :1521
- 动态,私有端口(49152~65535)
常用doc命令:
netstat -ano ==查看所有端口
netstat -ano|findstr “56950” ==查看指定的端口
tasklist|findstr “8696” ==查看指定端口的进程
Ctrl + Shift + ESC 打开任务管理器
import java.net.InetAddress;
import java.net.InetSocketAddress;
public class InetTest {
public static void main(String[] args) {
//构建了一个本机8080端口的地址
InetSocketAddress sAddress = new InetSocketAddress("127.0.0.1",8080);
System.out.println(sAddress.toString()); //out: /127.0.0.1:8080
sAddress = new InetSocketAddress("localhost",8080);
System.out.println(sAddress.toString()); //out: localhost/127.0.0.1:8080
InetAddress address = sAddress.getAddress(); //返回一个InetAddress对象
String hostName = sAddress.getHostName(); //返回主机的名称
int port = sAddress.getPort(); //返回端口号
}
}
⑤.通信协议
- 协议就如同约定,就好比人类的语言,让个体之间得以交流
- 网络通信协议:速率、传输码率、代码结构、,传输控制…
- TCP/IP协议
TCP:用户传输协议
UDP:用户数据报协议
IP:网络互联协议
TCP与UDP的对比
TCP: 打电话
连接、稳定
三次握手、四次挥手
三次握手:A你瞅啥,B瞅你咋地,A打一架!最少需要三次,保证稳定连接
四次挥手:A:我要断开,B:我知道了,B:真的吗?,A:我真的断开了
区分客户端、服务端UDP:发短信
不连接、不稳定
传输完成、释放链接
客户端与服务端没有明确的界限
不用管是否准备好都可以进行发送
DDOS:洪水攻击,发送大量的无用信息将端口堵塞
⑥.TCP模拟聊天
- 客户端client
1.连接服务器 Socket
2.发送消息
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
//客户端
public class TCPClientDemo1 {
public static void main(String[] args) {
Socket socket = null;
OutputStream os = null;
try {
//1.需要知道服务器的地址,端口号
InetAddress serverIP = InetAddress.getByName("127.0.0.1");
int port = 8091;
//2.创建一个socket连接
socket = new Socket(serverIP,port);
//3.发送消息 IO流
os = socket.getOutputStream();
os.write("你好 ! iFinder".getBytes()); //使用IO流写出数据
} catch (Exception e) {
e.printStackTrace();
}finally {
try{
if(os != null){
os.close();
}
if (socket != null){
socket.close();
}
}catch (Exception e){
e.printStackTrace();
}
}
}
}
- 服务端
1.建立服务端口 ServerSocket
2.等待用户连接 accept
3.接收用户的消息
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
//服务端
public class TCPServerDemo1 {
public static void main(String[] args) {
ServerSocket serverSocket = null;
Socket socket = null;
InputStream is = null;
ByteArrayOutputStream baos = null;
try {
//1.需要一个地址
serverSocket = new ServerSocket(8091);
while(true){ //实现一直监听,反复读取
//2.等待客户端进行连接
socket = serverSocket.accept();
//3.读取客户端的消息
is = socket.getInputStream();
//管道流
baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int temp;
while((temp = is.read(buffer)) != -1){
baos.write(buffer,0,temp);
}
System.out.println(baos);
}
} catch (IOException e) {
e.printStackTrace();
}finally { //关闭流对象,先开后关
try{
if(baos != null){
baos.close();
}
if (is != null){
is.close();
}
if(socket != null){
socket.close();
}
if(serverSocket != null){
serverSocket.close();
}
}catch (Exception e){
e.printStackTrace();
}
}
}
}
⑥.TCP实现文件上传
import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
//TCP实现文件上传 客户端
public class FileUpClient {
public static void main(String[] args) throws Exception{
//1.创建一个Socket连接
Socket socket = new Socket(InetAddress.getByName("127.0.0.1"),9000);
//2.创建一个输出流
BufferedOutputStream TcpBos = new BufferedOutputStream(
socket.getOutputStream());
//3.读取文件流
BufferedInputStream FileBis = new BufferedInputStream(
new FileInputStream("E:/History/胡广生.wav"));
//缓冲流缓冲区的大小为8192
//4.写出文件
int temp;
while((temp = FileBis.read()) != -1){
TcpBos.write(temp);
}
TcpBos.flush();
//通知服务器已经传输完了
socket.shutdownOutput();
//确定服务器接收完毕才能够断开链接
InputStream TcpIs = socket.getInputStream();
//接收客户端信息String byte[]
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len;
while((len = TcpIs.read(buffer)) != -1){
baos.write(buffer,0,len);
}
System.out.println(baos.toString());
//5.关闭流
baos.close();
TcpIs.close();
FileBis.close();
TcpBos.close();
socket.close();
}
}
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
//TCP实现文件上传 服务端
public class FileUpServer {
public static void main(String[] args) throws Exception{
//1.创建服务端口
ServerSocket serverSocket = new ServerSocket(9000);
//2.监听客户端的链接 (阻塞式监听,会一直等待客户端链接)
Socket socket = serverSocket.accept();
//3.获取输入流
BufferedInputStream TcpBis = new BufferedInputStream(
socket.getInputStream());
//4.文件输出
BufferedOutputStream FileBos = new BufferedOutputStream(
new FileOutputStream("E:receive.wav"));
int temp;
while((temp = TcpBis.read()) != -1){
FileBos.write(temp);
}
//通知客户端我接受完了
OutputStream TcpOs = socket.getOutputStream();
TcpOs.write("客户端已接收完毕,可以断开".getBytes(StandardCharsets.UTF_8));
//5.关闭流
TcpOs.close();
FileBos.close();
TcpBis.close();
socket.close();
serverSocket.close();
}
}