网络编程
软件结构
- C/S结构 :全称为Client/Server结构,是指客户端和服务器结构。常见程序有QQ、迅雷等软件。
- B/S结构 :全称为Browser/Server结构,是指浏览器和服务器结构。常见浏览器有谷歌、火狐等。
两种架构各有优势,但是无论哪种架构,都离不开网络的支持。网络编程,就是在一定的协议下,实现两台计算机的通信的程序。
javaweb : 网页编程 B/S
网络编程: TCP/IP (协议) C/S
网络通信协议
- **网络通信协议:**通过计算机网络可以使多台计算机实现连接,位于同一个网络中的计算机在进行连接和通信时需要遵守一定的规则,这就好比在道路中行驶的汽车一定要遵守交通规则一样。在计算机网络中,这些连接和通信的规则被称为网络通信协议,它对数据的传输格式、传输速率、传输步骤等做了统一规定,通信双方必须同时遵守才能完成数据交换。
- TCP/IP协议: 传输控制协议/因特网互联协议( Transmission Control Protocol/Internet Protocol),是Internet最基本、最广泛的协议。它定义了计算机如何连入因特网,以及数据如何在它们之间传输的标准。它的内部包含一系列的用于处理数据通信的协议,并采用了4层的分层模型,每一层都呼叫它的下一层所提供的协议来完成自己的需求。
TCP/IP协议中的四层分别是应用层、传输层、网络层和链路层,每层分别负责不同的通信功能。
链路层:链路层是用于定义物理传输通道,通常是对某些网络连接设备的驱动协议,例如针对光纤、网线提供的驱动。
网络层:网络层是整个TCP/IP协议的核心,它主要用于将传输的数据进行分组,将分组数据发送到目标计算机或者网络。
运输层:主要使网络程序进行通信,在进行网络通信时,可以采用TCP协议,也可以采用UDP协议。
应用层:主要负责应用程序的协议,例如HTTP协议、FTP协议等。
小结:
- 网络编程中有两个主要的问题
-
- 如何准确的定位到网络上的一台或者多台主机
- 找到主机之后如何经行通信
- 网络编程中的要素
-
- IP和端口号 ip,
- 网络通信协议 udp,tcp
- 万物皆对象
ip
ip地址: inetAddress
-
唯一定位一台网络上计算机
-
127.0.0.1: 本机localhost
-
ip地址的分类
-
ipv4/ipv6
IPV4
127.0.0.1 ,4个字节组成,0–255,42亿;30亿都在北美,亚洲4亿,2011年用尽IVP6
:128位 8个无符号整数!
2001:0bb2:aaaa:0015:0000:0000:1aaa 1312
-
公网(互联网)~私网(局域网)
- 192.168.xx.xx专门给组织内部使用的
- ABCD类地址
-
域名:记忆IP问题
- IP:www.baidu.com
-
测试Ip 使用的类为:java.net.InetAddress
;
package com.Jintwo.www;
import java.net.InetAddress;
import java.net.UnknownHostException;
//测试IP
public class TextInetAddress {
public static void main(String[] args) {
try {
//查询本机地址
InetAddress address=InetAddress.getByName("127.0.0.1");
System.out.println(address);
InetAddress address2=InetAddress.getByName("localhost");
System.out.println(address2);
InetAddress address3=InetAddress.getLocalHost();
System.out.println(address3);
//查询网站地址
InetAddress address4=InetAddress.getByName("www.baidu.com");
System.out.println(address4);
//常用方法
System.out.println(InetAddress.getLoopbackAddress());
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
端口
端口表示计算机上的一个程序的进程
-
不同的进程有不同的端口号!用来区分软件
-
被规定0-65535
-
TCP,UDP:65535*2 tcp :80,udp:80吗,单个协议,端口号不能冲突
-
端口分类
- HTTP:80
- HTTPS:443
- FIP:21
- Telent:23
- 程序注册端口:1024-49151非陪用户或者程序
- Tomat:8080
- MySQl:3306
- Oracle:1521
- 动态,私有:49152-65535
netstat -ano #查看所有的端口
netstat -ano|findstr “5900” #查看指定的端口
tasklist|findstr “8696” #查看指定端口的进程
package com.Jintwo.www;
import java.net.InetSocketAddress;
public class TextIntetSocketAddress {
public static void main(String[] args) {
InetSocketAddress address=new InetSocketAddress("127.0.0.1",8080);
InetSocketAddress address2=new InetSocketAddress("localhost",8080);
System.out.println(address);
System.out.println(address2);
System.out.println(address.getAddress());
System.out.println(address.getHostName());
System.out.println(address.getHostString());
System.out.println(address.getPort());
}
}
//结果:
/127.0.0.1:8080
localhost/127.0.0.1:8080
/127.0.0.1
127.0.0.1
127.0.0.1
8080
通信协议
协议:约定,就好比我们现在说的是普通话
网络通信协议:速率,传输码率,代码结构,传输控制。。。
问题:非常的复杂?
大事化小:分层!
TCP/IP协议族:实际上是一组协议
TCP/IP协议
重要:
- TCP:用户传输协议
- UDP:用户数据报协议
出名的协议:
- TCP
- IP:网络互联协议
TCP UDP对比
TCP:打电话
-
连接,稳定
-
三次握手,四次挥手
-
三次握手 最少需要三次,保证稳定连接 A:你凑啥? B: 瞅你咋地? A: 干一场! 四次挥手 A:我要走了! B:我真的要走了吗? B:你真的真的要走了吗? A: 我的真的要走了
-
-
客服端,服务端
UDP:发短信
- 不连接,不稳定
- 客服端,服务端:没有明确的界限
- 不管有,没有准备,都可以发给你。。
- 导弹
- DDOS:洪水攻击!(饱和攻击)
TCP
客户端
- 连接服务器 Socket
- 发送消息
服务器
- 建立服务的端口ServerSocket
- 等待用户的链接 accept
- 接收用的消息
服务端
package com.Jintwo.www;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
public class TextClientDemo {
public static void main(String[] args) throws IOException {
InetAddress address=InetAddress.getByName("127.0.0.1");
//创建一个Socket连接
Socket socket=new Socket(address,9000);
FileInputStream input=new FileInputStream("D:/jin.jpg");
OutputStream fileOutputStream=socket.getOutputStream();
int as=0;
byte[]bytes=new byte[1024];
while((as=input.read(bytes))!=-1) {
fileOutputStream.write(bytes, 0, as);
}
input.close();
fileOutputStream.close();
socket.close();
}
}
客服端
package com.Jintwo.www;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
public class TextClientDemo1 {
public static void main(String[] args) throws IOException {
//1 创建服务
ServerSocket address=new ServerSocket(9000);
//2 监听客服端的连接
Socket socket=address.accept(); //阻塞式监听,会一直等待客户端连接
InputStream input=socket.getInputStream();
File file=new File("D:/LIU.jpg");
if(!file.exists()) {
file.createNewFile();
}
FileOutputStream fileOutputStream=new FileOutputStream(file);
int as=0;
byte[]bytes=new byte[1024];
while((as=input.read(bytes))!=-1) {
fileOutputStream.write(bytes, 0, as);
}
socket.shutdownOutput(); //我已经传输完了
input.close();
fileOutputStream.close();
socket.close();
}
}
UDP
发送短信,不用连接,需要知道对方的地址!
发送消息
package com.Jintwo.www;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class TextUdp {
public static void main(String[] args) throws IOException {
//1 建立一个Socket
DatagramSocket socket=new DatagramSocket();
//2 建立包
String ms="你好,服务器";
//发送给谁
InetAddress address=InetAddress.getByName("127.0.0.1");
int port=9090;
DatagramPacket packet=new DatagramPacket(ms.getBytes(), 0, ms.getBytes().length,address,port);
//3 发送包
socket.send(packet);
//4 关闭流
socket.close();
}
}
接收消息
package com.Jintwo.www;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
//还是要等待客服端的连接!
public class TextUDP1 {
public static void main(String[] args) throws IOException {
//开放端口
DatagramSocket socket=new DatagramSocket(9090);
//接收数据包
byte[]bytes=new byte[1024];
DatagramPacket packet=new DatagramPacket(bytes, 0,bytes.length);
socket.receive(packet);
//关闭连接
System.out.println(packet.getAddress().getHostName());
System.out.println(new String(packet.getData(),0,packet.getData().length));
socket.close();
}
}
多线程在线质询
package com.JinThree.www;
public class Teacher {
public static void main(String[] args) {
new Thread(new TextUDPDome1(5555, "127.0.0.1", 8888)).start();
new Thread(new TextUDPDome2(9999,"学生")).start();
}
}
package com.JinThree.www;
public class Student {
public static void main(String[] args) {
new Thread(new TextUDPDome1(7799, "127.0.0.1", 9999)).start();
new Thread(new TextUDPDome2(8888,"老师")).start();
}
}
package com.JinThree.www;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketException;
import java.net.UnknownHostException;
public class TextUDPDome1 implements Runnable {
DatagramSocket socket=null;
BufferedReader input=null;
String ip;
int toip;
int fromip;
public TextUDPDome1(int fromip, String ip,int toip) {
this.fromip = fromip;
this.ip = ip;
this.toip=toip;
try {
socket=new DatagramSocket(fromip);
input=new BufferedReader(new InputStreamReader(System.in));
} catch (SocketException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void run() {
while(true) {
try {
String data=input.readLine();
byte[]bytes=data.getBytes();
DatagramPacket packet=new DatagramPacket(bytes,0, bytes.length,new InetSocketAddress(this.ip, this.toip));
socket.send(packet);
byte[]count=packet.getData();
String say=new String(count,0,count.length);
if(say.equals("bye")) {
break;
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
socket.close();
}
}
package com.JinThree.www;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class TextUDPDome2 implements Runnable {
DatagramSocket socket=null;
String name;
int toip;
@Override
public void run() {
while(true) {
byte []bytes=new byte[1024];
DatagramPacket packet=new DatagramPacket(bytes, 0,bytes.length);
String say=new String(packet.getData(),0,packet.getData().length);
try {
socket.receive(packet);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(name+"说:"+say);
if(say.equals("bye")) {
break;
}
}
socket.close();
}
public TextUDPDome2(int toip,String name) {
this.toip = toip;
this.name=name;
try {
socket=new DatagramSocket(toip);
} catch (SocketException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
URL
统一资源定位符:定位资源的,定位互联网的某一个资源
DNS 域名解析 www.baicom.com
协议://ip地址:端口/项目的/资源
package com.JinThree.www;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
public class TextUrl {
public static void main(String[] args) throws IOException {
try {
URL url=new URL("https://m10.music.126.net/20201107162421/ee573900d3c6ac18ad274756bb59a37c/yyaac/obj/wonDkMOGw6XDiTHCmMOi/3932163564/fac6/1ece/faa9/2162e53e81abd52dd74bbf7feb2f5ddc.m4a");
HttpURLConnection connection=(HttpURLConnection) url.openConnection();
InputStream input=connection.getInputStream();
BufferedOutputStream bufferedOutputStream=new BufferedOutputStream(new FileOutputStream("D:/AA.m4a"));
byte []bytes=new byte[1024];
int as=0;
while((as=input.read(bytes))!=-1) {
bufferedOutputStream.write(bytes, 0, as);
}
input.close();
bufferedOutputStream.close();
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}