计算机网络:
网络概念:由点和线构成,表示诸多对象间的互相联系
作用:为了实现资源共享和信息传递,通过通信线路连接起来的若干计算机
互联网:Internet
万维网:www(world wide web)
物联网:Iot(Interner of things)
网络模型:
OSI参考模型,七层:
应用层:如http协议,SMTP协议(邮件)...
表示层:将数据格式进行传话与加密.
会话层:维持通讯
传输层:如恢复通讯,数据流重用等事情.UDP,TCP
网络层:ip,计算机在互联网的地址
数据链路层:对其数据进行格式化的要求
物理层:硬件设备,如网线,网线接口等
因为OSI过于理想化,所有没有被实现
TCP/IP模型:
应用层
对应OSI模型的应用层,表示层,会话层
对应的协议:HTTP,SMTP,HTTPS
传输层
对应OSI模型的传输层
对应的协议:TCP,UDP协议
网络层
对应OSI模型的网络层
对应的协议:IP
网络接口层
对应OSI模型的数据链路层与物理层
对应协议:以太网协议,ADSL协议等
网络编程需要:IP,端口号,通讯协议
IP
概念:计算机在互联网中的地址
IPV4
4个字节,每个字节由8位组成.所以每段的值0~255
0000 0000 ~ 1111 1111
192.168.7.151
IPV6
16个字节,每个字节8位组成,每段16位,所以每段取值范围0~65535
查看当前计算机IP:
步骤: 1,打开dos命令框
2,输入ipconfig
IP地址的分类:
A类地址:大型网络,主要服务与国家与政府企业
B类地址:中型网络,主要服务与大型实验室等
C类地址:个人网络,咱们普通人与普通企业用的网络
特殊IP:127.0.0.1表示本机
英文localhost 专业名称:回路地址
相关命令: ipconfig 作用:查看当前计算机的ip信息
ping 作用:尝试连接对方
InetAddress类: 作用:表示计算机在网络中的地址
InetAddress ip =InetAddress.getLocalHost();
System.out.println(ip);//获取计算机名称与ip地址
System.out.println(ip.getHostAddress());//获取计算机ip地址
System.out.println(ip.getHostName());//获取计算机名称
端口
概念:程序在计算机中的地址
范围:0~65535
注意: 0~1023:一般被系统占用
1024~49151:注册端口
49152~65535:动态端口:服务端必须确定监听端口号,但是客户端不需要确定端口号,可以交由操作系统动态分配,操作系统可以为每个应用程序分配互不冲突的端口号,系统分配的端口号范围介于 49152 到 65535 之间。
常见的端口:
mysql端口号:3306
Tomcat端口号:8080
http协议端口号:80
Oracle端口号:1521
redis端口号:6379
通信协议:
TCP
中文名:传输控制协议
特点:面向连接,安全可靠,效率低,基于字节流进行通讯的,传输数据大小无限制
三次握手,四次挥手
Java中对应的类:
Socket:客户端
ServerSocket:服务器
UDP
中文名:数据包协议
特点:面向无连接,不安全,效率高,基于数据包格式进行传输,一个数据包最多64kb
俗称:对讲机
//随机生成一个字符串
//因为内部的算法可以保证该字符串不会重复
UUID uuid = UUID.randomUUID();
String str = uuid.toString();
str = str.replace("-", "");//去掉-和空格
System.out.println(str);
基于TCP协议的通讯
客户端需要在服务端有个映射,使用映射来进行操作
服务端
1. 创建ServerSocket
ServerSocket serverSocket = new ServerSocket(9988);//里面参数为端口号
2. 等待客户端连接
Socket server = serverSocket.accept(); //此方法返回值为客户端映射
InputStream is = server.getInputStream();//通过映射获取输入流
byte[] b = new byte[1024];
int len = 0;
while ((len=is.read(b))!=-1) {//读取数据进行操作
String str = new String(b,0,len);
System.out.println(str);//将客户端数据读取到控制台上
}
3. 关闭资源
is.close();
server.close();
serverSocket.close();
客户端
创建客户端Socket
Socket socket = new Socket("127.0.0.1", 9988);//参数:服务器地址,端口号
OutputStream os = socket.getOutputStream();//创建输出流
os.write("为世界上的所有美好而战".getBytes());
关闭资源
os.close();
socket.close();
System.out.println("客户端结束");
试试服务端给客户端发消息
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
@SuppressWarnings("resource")
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(9988);//创建服务端
Socket socket = serverSocket.accept();//使用映射获
InputStream iS = socket.getInputStream();//使用映射获取输入流
byte[] b = new byte [1024];//用此接收
int len = iS.read(b);//读取到b
String string =new String(b,0,len);
System.out.println("服务端接收到客户端说:"+string);
OutputStream oS = socket.getOutputStream();//使用映射输出
oS.write("符号看象限".getBytes());//用字符串输出
oS.flush();
oS.close();
socket.close();
serverSocket.close();
System.out.println("服务端关闭");
}
}
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
public class Cilent {
@SuppressWarnings("resource")
public static void main(String[] args) throws UnknownHostException, IOException {
Socket socket = new Socket("127.0.0.1",9988);
OutputStream oS = socket.getOutputStream();//输出流
oS.write("奇变偶不变".getBytes());
oS.flush();
InputStream iS = socket.getInputStream();//输入流
byte[] b = new byte[1024];
int len = iS.read(b);
String string=new String(b, 0, len);
iS.close();
oS.close();
socket.close();
System.out.println("服务端对客户端说:"+string);
System.out.println("客户端结束");
}
}
试试实现上传
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.UUID;
public class Server {
@SuppressWarnings("resource")
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(9988);
System.out.println("服务端启动");
Socket socket = serverSocket.accept();//获取映射
InetAddress address = socket.getInetAddress();//获取客户端的信息
InputStream iS = socket.getInputStream();//输入流,把客户端的数据拿到
String name = UUID.randomUUID().toString().replace("-","");//创建一个不可能重名的名称
name="E:\\Javanew\\Test"+name+".jpg";
FileOutputStream fos = new FileOutputStream(name);//输入流
byte[]b = new byte[1024];
int len = 0;
while ((len=iS.read(b))!=-1) {
//得客户端主动结束才可以为-1
fos.write(b,0,len);
fos.flush();
}
fos.close();
System.out.println("客户端上传结束");
OutputStream os = socket.getOutputStream();//输出流,准备给服务端反馈
os.write("上传成功".getBytes());
os.flush();
os.close();
iS.close();
socket.close();
serverSocket.close();
}
}
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import javax.swing.text.AbstractDocument.BranchElement;
public class Cilent {
@SuppressWarnings("resource")
public static void main(String[] args) throws UnknownHostException, IOException {
Socket socket = new Socket("127.0.0.1",9988);
OutputStream oS = socket.getOutputStream();
FileInputStream fiS= new FileInputStream("D:\\QQ图片20220325160444.jpg");
byte[]b =new byte[1024];
int len = 0;
while ((len = fiS.read(b))!=-1) {
oS.write(b);
oS.flush();
}
socket.shutdownOutput();//结束客户端输出流
System.out.println("上传结束");
InputStream iS= socket.getInputStream();//接收服务端的输入
byte[]b1 =new byte[1024];//
int len1 = 0;
while ((len1 = iS.read(b1))!=-1) {
String string = new String(b1, 0, len1);
System.out.println(string);
}
iS.close();
fiS.close();
oS.close();
socket.close();
System.out.println("客户端结束");
}
}
上传成功
基于UDP的通讯协议
接收端
DatagramSocket(端口号)
接收端对象.receive(数据包):接收数据
发送端
DatagramSocket()
发送端对象.send(数据包):用于发送数据包
数据包
DatagramPacket
package work3;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class Receive {
@SuppressWarnings("resource")
public static void main(String[] args) throws IOException {
DatagramSocket socket = new DatagramSocket(9988);//创建接收端socket
byte[]b=new byte[1024];
DatagramPacket packet = new DatagramPacket(b, b.length);//接收数据
//用包接收
socket.receive(packet);//用包接收
byte [] b2 = packet.getData();//获取包中数据
int len = packet.getLength();//获取包装数据长度
String str = new String(b2,0,len);
System.out.println("接收到了"+str);
socket.close();
}
}
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
public class Send {
@SuppressWarnings("resource")
public static void main(String[] args) throws IOException {
DatagramSocket socket = new DatagramSocket();//创建发送的sock
byte[]b="为世界上所的美好而战".getBytes();//准备好发送的包
InetAddress address = InetAddress.getByName("127.0.0.1");//接收端ip
/**
* 准备要发送的数据包
* 1参:要发送数据所在的数组
* 2参:开始位置
* 3参:发送的字节长度
* 4参:接收端地址
* 5参:接收端端口号
*/
DatagramPacket packet = new DatagramPacket(b, 0, b.length, address, 9988);
//发送数据
socket.send(packet);
socket.close();
}
}
试一试让两个即时通讯
package tcp02;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* 1.创建服务器Socket
* 2.等待客户端连接。获取客户端映射
* 3.接收客户端消息
*
* 让两个输入输出一直保持同步运行
*
*
*
*/
public class Server {
@SuppressWarnings("resource")
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(9988);//创建服务端
Socket socket = serverSocket.accept();//搞映射
InputStream is = socket.getInputStream(); //用映射搞输入流
ExecutorService pool = Executors.newFixedThreadPool(2); //创2线程
pool.submit(new Runnable() {
@Override
public void run() {
while (true) {// 一直挂着
byte[] b = new byte[1024];
int len;
try {
len = is.read(b);//读取
String str = new String(b, 0, len);
System.out.println("客户端说:"+str);//接收客户端消息,打印
} catch (IOException e) {
e.printStackTrace();
}
}
}
});
pool.submit(new Runnable() {
@Override
public void run() {
while (true) { //挂着
OutputStream os = null;
try {
os = socket.getOutputStream();
} catch (IOException e) {
e.printStackTrace();
}
Scanner scanner = new Scanner(System.in); //输入字符串
String str2=scanner.next();//
try {
os.write(str2.getBytes());//将其输出
} catch (IOException e) {
e.printStackTrace();
}
try {
os.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
}
});
pool.shutdown();
}
}
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import javax.sql.PooledConnection;
public class Client {
@SuppressWarnings("resource")
public static void main(String[] args) throws UnknownHostException, IOException {
Socket socket = new Socket("127.0.0.1",9988);
OutputStream os = socket.getOutputStream();
ExecutorService pool = Executors.newFixedThreadPool(2);
pool.submit(new Runnable() {
@Override
public void run() {
while (true) {
Scanner scanner = new Scanner(System.in);
String str2=scanner.next();
try {
os.write(str2.getBytes());
} catch (IOException e) {
e.printStackTrace();
}//给服务端的信息
try {
os.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
}
});
pool.submit(new Runnable() {
@Override
public void run() {
while (true) {
InputStream is = null;
try {
is = socket.getInputStream();
} catch (IOException e) {
e.printStackTrace();
}
byte[]b = new byte[1024];
int len;
try {
len = is.read(b);
String str = new String(b, 0, len);
System.out.println("服务端说:"+str);
} catch (IOException e) {
e.printStackTrace();
}
}
}
});
pool.shutdown();
}
}