网络编程



目录



一、什么是计算机网络

1.1 概述

地球村:你在北京,有一个西班牙的朋友

类似于邮件流转:有自己的地址和对方的地址和内容等等

网络编程 学习笔记(2021.10.18)_服务端

计算机网络是指将地理位置不同的具有独立功能的多台​​计算机​​及其外部设备,通过通信线路连接起来,在​​网络操作系统​​,​​网络管理软件​​及​​网络通信协议​​的管理和协调下,实现​​资源共享​​和信息传递的计算机系统。

网络编程的目的:无线电台,传播交流信息,数据交换,通信

想达到这个效果需要什么

  1. 定位主机:192.168.15.13: 端口,定位这个计算机上的某个资源
  2. 如何找到主机?

javaweb: 网页编程 B/S

网络编程: 客户端编程 C/S

二、网络通信的两个要素

如何实现网络通信

通信双方地址:

  • ip
  • 端口

网络通信的规则:协议

TCP/IP模型:

网络编程 学习笔记(2021.10.18)_客户端_02

网络编程中有两个主要的问题:

  1. 如何准确定位一台或多台主机
  2. 找到主机后如何通信

网络通信中的要素:

  1. ip和端口号
  2. 网络通信协议udp、tcp

万物皆对象

三、IP地址

ip地址:InetAddress

  • 一个ip地址能准确只找到一台主机
  • 本机地址:127.0.0.1
  • ip地址分类
  • ipv4/ipv6
  • IPv4 127.0.0.1 ,四个字节组成,0~255,一共42亿,三十亿都在北美,2011用尽
  • IPv6 fe80::c46e:e3a3:20fd:8eba%13 ,128位,八个无符号整数
  • 2001:2156:a2c5:6598:ad24:ddd3:253a:1281
  • 公网-私网
  • ABCD类地址
  • 192.168.xxx.xxx,专门给组织内部用的

demo:

package com.xiaowei9s.NetLearn;

import java.net.InetAddress;
import java.net.UnknownHostException;

//测试ip
public class TestIPAddress {
public static void main(String[] args) throws UnknownHostException {
//查询本机地址
InetAddress ip1 = InetAddress.getByName("127.0.0.1");
System.out.println(ip1);
InetAddress ip2 = InetAddress.getByName("localhost");
System.out.println(ip2);
InetAddress ip3 = InetAddress.getLocalHost();
System.out.println(ip3);

//查询网站ip地址
InetAddress ipw = InetAddress.getByName("www.baidu.com");
System.out.println(ipw);

//常用方法
System.out.println(ipw.getHostAddress());//获得ip
System.out.println(ipw.getCanonicalHostName());//获得规范名
System.out.println(ipw.getHostName());//获得域名
//System.out.println(ipw.getAddress());
}
}


四、端口Port

表示计算机上一个程序的进程。

  • 不同的进程有不同的端口号!用来区分软件
  • 被规定位0~65535
  • TCP/UDP 各自端口不冲突,TCP可以为80的同时UDP也可以是80,但是不能有相同协议的两个进程使用同一个端口
  • 端口分类
  • 公有端口:1~1023
  • HTTP 80
  • HTTPS 443
  • FTP 21
  • Telent 23
  • 程序注册端口1024~49151,分配给用户或程序
  • tomcat 8080
  • Mysql 3306
  • Oracle 1521
  • 动态、私有:49152~66535
  • netstat -ano #查看所有端口 netstat -ano|findstr "5353" #查看指定端口 tasklist|findstr "5353" #查看指定端口进程
  • package com.xiaowei9s.NetLearn; import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.SocketAddress; import java.net.UnknownHostException; //测试ip public class TestIPAddressPort { public static void main(String[] args) throws UnknownHostException { InetSocketAddress inetSocketAddress = new InetSocketAddress("127.0.0.1", 8081); InetSocketAddress inetSocketAddress2 = new InetSocketAddress("localhost", 8081); System.out.println(inetSocketAddress); System.out.println(inetSocketAddress2); System.out.println(inetSocketAddress2.getAddress()); System.out.println(inetSocketAddress2.getPort()); System.out.println(inetSocketAddress2.getHostName()); System.out.println(inetSocketAddress2.getHostString()); } }

五、通信协议

协议:约定,解决怎么做的问题,比如大家商量出一个协议如:广场协议,规定了哪个国家必须怎么做

网络通信协议:TCP/IP,协定了速率、传输码率、代码结构、传输控制......

问题:很复杂吗?

大事化小:分层!

TCP/IP协议簇

重要:

  • TCP:用户传输协议
  • UDP:用户数据包协议

出名的协议:

  • TCP
  • IP:网络互联协议

TCP/UDP对比:

TCP:打电话

  • 连接、稳定
  • 三次握手 四次挥手
    三次握手:我呼叫你,你回答,我表示可以交流了(三次)
    四次挥手:我说我要走了,你回应说知道了,我说byebye并且真的走了,你也说byebye然后也走了(四次)
  • 客户端、服务端
  • 传输完成释放连接

UDP:发短信

  • 不连接、不稳定
  • 客户端服务端:没有明确界限
  • 不管有没有准备好,都可以发给你
  • 导弹
  • DDOS:洪水攻击(饱和攻击)

六、TCP实现聊天

客户端:

  1. 获取服务器地址
  2. 连接服务器
  3. 发送消息
package com.xiaowei9s.lesson2;

import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.UnknownHostException;

public class TCPClient {
public static void main(String[] args) throws IOException {
//获得地址
InetAddress ipaddress = InetAddress.getByName("127.0.0.1");
//连接服务器
Socket socket = new Socket(ipaddress, 8888);
//发送信息流
OutputStream os = socket.getOutputStream();
os.write("你好服务器".getBytes());
if (os!=null){
os.close();
}
if (socket!=null){
socket.close();
}
}
}


服务端

  1. 建立服务端口
  2. 等待用户连接accept
  3. 接收消息
package com.xiaowei9s.lesson2;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class TCPServer {
public static void main(String[] args) throws Exception {
//建立端口
ServerSocket serverSocket = new ServerSocket(8888);
Socket accept = null;
InputStream is = null;
ByteArrayOutputStream baos = null;
//持续接收信息
while (true){
//等待连接
accept = serverSocket.accept();

//接收信息流
is = accept.getInputStream();

//管道写信息
baos = new ByteArrayOutputStream();
int len;
byte[] buffer = new byte[1024];
while ((len = is.read(buffer)) != -1){
baos.write(buffer,0,len);
}
System.out.println(baos);
if (baos!=null){
baos.close();
}
if (is!=null){
is.close();
}
if (accept!=null){
accept.close();
}
}
}
}


七、TCP实现文件上传

客户端:

  1. 获取服务器地址
  2. 连接服务器
  3. 获得图片
  4. 发送图片
package com.xiaowei9s.lesson3;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;

public class TCPClientFile {
public static void main(String[] args) throws IOException {
//获得地址
InetAddress ipaddress = InetAddress.getByName("127.0.0.1");
//连接服务器
Socket socket = new Socket(ipaddress, 8888);
//获得发送信息流
OutputStream os = socket.getOutputStream();
//获得文件
FileInputStream fis = new FileInputStream(new File("1.png"));
byte[] buffer = new byte[1024];
int len;
while ((len = fis.read(buffer)) != -1){
os.write(buffer,0,len);
}

if (os!=null){
os.close();
}
if (socket!=null){
socket.close();
}
}
}


服务端

  1. 建立服务端口
  2. 等待用户连接accept
  3. 接收并且保存图片
package com.xiaowei9s.lesson3;

import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class TCPServerFile {
public static void main(String[] args) throws Exception {
//建立端口
ServerSocket serverSocket = new ServerSocket(8888);
Socket accept = null;
InputStream is = null;
FileOutputStream fos = null;
//持续接收信息
while (true){
//等待连接
accept = serverSocket.accept();

//接收信息流
is = accept.getInputStream();

//管道写信息
fos = new FileOutputStream("receive.png");
int len;
byte[] buffer = new byte[1024];
while ((len = is.read(buffer)) != -1){
fos.write(buffer,0,len);
}
if (fos!=null){
fos.close();
}
if (is!=null){
is.close();
}
if (accept!=null){
accept.close();
}
}
}
}


八、初识Tomcat

服务端

  • 自定义 S
  • Tomcat S

客户端

  • 自定义 C
  • 浏览器 B

九、UDP信息发送

udp像是发信息,不需要连接到服务器,直接能发

客户端:

  1. 获得地址
  2. 制造包
  3. 发送包
  4. 关闭流
package com.xiaowei9s.lesson4;

import java.net.*;

public class UDPClient {
public static void main(String[] args) throws Exception {
//获得地址
InetAddress ip = InetAddress.getByName("127.0.0.1");
int port = 8111;
DatagramSocket datagramSocket = new DatagramSocket();

//制造数据包
String msg = "你好呀!";
DatagramPacket datagramPacket = new DatagramPacket(
msg.getBytes(), 0, msg.getBytes().length,ip,port);

//发送消息
datagramSocket.send(datagramPacket);

//关闭流
datagramSocket.close();

}
}


服务端:

  1. 开放端口
  2. 弄个容器
  3. 容器接收信息
  4. 输出内容
  5. 关闭流
package com.xiaowei9s.lesson4;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

public class UDPServer {
public static void main(String[] args) throws Exception {
//开放端口
DatagramSocket ds = new DatagramSocket(8111);

//弄个容器装包
byte[] bytes = new byte[1024];
DatagramPacket pa = new DatagramPacket(bytes, 0, bytes.length);

//获取内容
ds.receive(pa);

//输出内容
System.out.println(new String(pa.getData()));

//关闭流
ds.close();
}
}


十、多线程在线咨询

循环发送:

package com.xiaowei9s.chat;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.*;

public class TalkSend implements Runnable{


int formPort;
int toPort;
DatagramSocket datagramSocket = null;
InetAddress toIp = null;
BufferedReader reader = null;

public TalkSend(int formPort, int toPort, String toIp) {
this.formPort = formPort;
this.toPort = toPort;
try {
this.datagramSocket = new DatagramSocket(formPort);
} catch (Exception e) {
e.printStackTrace();
}
try {
this.toIp = InetAddress.getByName(toIp);
} catch (UnknownHostException e) {
e.printStackTrace();
}
this.reader = reader;
}

@Override
public void run() {

while (true){
//获得输入信息
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

//制造数据包
String msg = null;
try {
msg = reader.readLine();
} catch (IOException e) {
e.printStackTrace();
}
DatagramPacket datagramPacket = new DatagramPacket(
msg.getBytes(), 0, msg.getBytes().length,toIp,toPort);

//发送消息
try {
datagramSocket.send(datagramPacket);
} catch (IOException e) {
e.printStackTrace();
}

if (new String(datagramPacket.getData()).equals("bye")){
break;
}
}

//关闭流
datagramSocket.close();
}
}


循环接收:

package com.xiaowei9s.chat;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

public class TalkReceive implements Runnable{
String msgForm;
int port;
DatagramSocket ds = null;

public TalkReceive(int port,String msgForm) {
this.msgForm = msgForm;
this.port = port;
try {
ds = new DatagramSocket(port);
} catch (SocketException e) {
e.printStackTrace();
}
}


@Override
public void run() {
//弄个容器装包
while (true){
byte[] bytes = new byte[1024];
DatagramPacket pa = new DatagramPacket(bytes, 0, bytes.length);

//获取内容
try {
ds.receive(pa);
} catch (IOException e) {
e.printStackTrace();
}

//输出内容
String msg = new String(pa.getData(),0,pa.getLength());
System.out.println(msgForm+":"+msg);

if (msg.equals("bye")){
break;
}
}


//关闭流
ds.close();
}
}


老师:

package com.xiaowei9s.chat;

public class TalkTea {
public static void main(String[] args) {

new Thread(new TalkReceive(7777,"学生")).start();
new Thread(new TalkSend(8888,9999,"localhost")).start();
}
}


学生:

package com.xiaowei9s.chat;

public class TalkStu {
public static void main(String[] args) {
new Thread(new TalkReceive(9999,"老师")).start();
new Thread(new TalkSend(6666,7777,"localhost")).start();

}
}


十一、URL下载网络资源

URL:统一资源定位符

package com.xiaowei9s.url;

import java.net.MalformedURLException;
import java.net.URL;

public class TestURL {
public static void main(String[] args) throws MalformedURLException {
URL url = new URL("http://127.0.0.1:8080/xiaowei9s/red.txt");
System.out.println(url.getHost());
System.out.println(url.getPort());
System.out.println(url.getAuthority());
System.out.println(url.getFile());
System.out.println(url.getQuery());
System.out.println(url.getProtocol());
}
}


下载网络资源:

package com.xiaowei9s.url;

import javax.net.ssl.HttpsURLConnection;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

public class TestDownLoad {
public static void main(String[] args) throws IOException {
URL url = new URL("http://127.0.0.1:8080/xiaowei9s/red.txt");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
InputStream is = connection.getInputStream();

FileOutputStream os = new FileOutputStream(new File("red.m4d"));

byte[] bytes = new byte[1024];
int len;
while ((len = is.read(bytes))!=-1){
os.write(bytes);
}
os.close();
is.close();
connection.disconnect();

}
}




慢慢来慢慢来