网络编程基础

news/2024/11/29 7:53:24/

网络编程

1.1 概述

计算机网络:

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

网络编程的目的:

  • 传播交流信息,数据交换
  • 通信

想要达到这个效果需要什么:

  1. 如何准确的定位网络上的一台主机 42.242.225.253:端口号,定位到这个计算机上的某个资源
  2. 找到了这个主机,如何传输数据?

Java Web 网页编程 B/S

TCP/IP 网络编程 C/S

1.2 网络通信的要素

如何实现网络的通信?

通信双方的地址:

  • IP
  • 端口号

规则:网络通信的协议

TCP/IP参考模型

image-20230608214257346

小结:

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

    • 如何准确的定位到网络上的一台或者多台主机 IP ping命令一般会发四个包

      PS C:\Users\kevin\Desktop> ping www.baidu.com正在 Ping www.a.shifen.com [14.119.104.189] 具有 32 字节的数据:
      来自 14.119.104.189 的回复: 字节=32 时间=38ms TTL=54
      来自 14.119.104.189 的回复: 字节=32 时间=36ms TTL=54
      来自 14.119.104.189 的回复: 字节=32 时间=36ms TTL=54
      来自 14.119.104.189 的回复: 字节=32 时间=36ms TTL=5414.119.104.189 的 Ping 统计信息:数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
      往返行程的估计时间(以毫秒为单位):最短 = 36ms,最长 = 38ms,平均 = 36ms
      PS C:\Users\kevin\Desktop>
      
    • 找到主机之后如何进行通信

  2. 网络编程中的要素

    • IP和端口号
    • 网络通信协议
  3. 万物皆对象

1.3 IP

ip地址:InetAddress

  • 唯一定位一台网络上的计算机
  • 127.0.0.1:本机 localhost
  • ip地址的分类
    • IP地址分类:ipv4/ipv6
      • IPV4 127.0.0.1 4个字节组成 0~255 42亿个地址:30亿都在北美,亚洲只有4亿。2011年就用尽了
      • IPV6 CDCD:910A:2222:5498:8475:1111:3900:2020 128位。8个无符号整数!
    • 公网(互联网)/私网(局域网)
      • 192.168.xx.xx
      • ABCD类地址
  • 域名:记忆IP问题
    • IP:www.baidu.com
package com.shu.ip;import java.net.InetAddress;
import java.net.UnknownHostException;//测试ip
public class TestInetAddress {public static void main(String[] args) {try {//查询本机IP地址InetAddress localhost1 = InetAddress.getByName("127.0.0.1");InetAddress localhost2 = InetAddress.getByName("localhost");InetAddress localhost3 = InetAddress.getLocalHost();//查询网站IP地址:百度InetAddress baidu = InetAddress.getByName("www.baidu.com");System.out.println();System.out.println("localhost1: "+ localhost1);System.out.println("localhost2: "+ localhost2);System.out.println("localhost3: "+ localhost3);System.out.println("baidu: "+ baidu);System.out.println();//常用方法System.out.println(baidu.getAddress());   //返回一个字节数组System.out.println(baidu.getCanonicalHostName());   //规范的名字System.out.println(baidu.getHostAddress());  //ipSystem.out.println(baidu.getHostName());   //域名,或者自己电脑的名字} catch (UnknownHostException e) {e.printStackTrace();}}
}
localhost1: /127.0.0.1
localhost2: localhost/127.0.0.1
localhost3: LAPTOP-XIAOSHU/192.168.80.1
baidu: www.baidu.com/14.119.104.189[B@1b6d3586
14.119.104.189
14.119.104.189
www.baidu.com

1.4 端口

端口表示计算机上的一个程序的进程pid

  • 不同的进程有不同的端口号!用来区分软件!

  • 被规定 0~65535

  • TCP/UDP: 65535*2 TCP:80 UDP:80 单个协议下,端口号不能冲突

  • 端口分类:

    • 公有端口:0~1023

      • http:80
      • https:443
      • ftp:21
      • Telent:23
    • 程序注册端口:1024~49151,分配给用户或者程序

      • Tomcat:8080
      • MySQL:3306
      • Oracle:1521
    • 动态、私有端口:49152~65535

      netstat -ano   #查看所有端口
      netstat -ano|findstr "55021"  #查看指定的端口 |:管道流,过滤的意思  先执行netstat -ano,然后在结果中再执行findstr "55021" 
      tasklist|findstr "10832" #查看指定端口的进程PS C:\Users\kevin\Desktop> 
      QQ.exe                       10832 Console                    1     63,728 K
      PS C:\Users\kevin\Desktop>
      
package com.shu.ip;import java.net.InetSocketAddress;public class TestInetSocketAddress {public static void main(String[] args) {InetSocketAddress inetSocketAddress1 = new InetSocketAddress("127.0.0.1", 8080);InetSocketAddress inetSocketAddress2 = new InetSocketAddress("localhost", 8080);System.out.println(inetSocketAddress1);System.out.println(inetSocketAddress2);System.out.println();System.out.println(inetSocketAddress1.getAddress());  //ipSystem.out.println(inetSocketAddress1.getHostName()); //地址System.out.println(inetSocketAddress1.getPort()); //端口}
}
/127.0.0.1:8080
localhost/127.0.0.1:8080/127.0.0.1
activate.navicat.com
8080

image-20230609095103470

image-20230609095123725

1.5 通信协议

协议:约定,就好比我们现在说的普通话。是一种规范

网络通信协议:速率,传输码率,代码结构,传输控制…

TCP/IP协议簇:实际上是一组协议

重要:

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

出名的协议:

  • TCP:
  • IP:网络互连协议

TCP UDP 对比

TCP:打电话

  • 连接 稳定

  • 三次握手 四次挥手

    最少需要三次,保证稳定连接!
    A:你瞅啥?
    B:瞅你咋地!
    A:干一场!A:我要走了!
    B:你真的要走了吗?
    B:你真的真的要走了吗?
    A:我真的要走了!
    
  • 客户端 服务端

  • 传输完成,释放连接,效率低

UDP:发短信

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

1.6 TCP

客户端

package com.shu.tcp;import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;//客户端
public class TcpClientDemo01 {public static void main(String[] args) {Socket socket = null;OutputStream outputStream = null;try {//1、要知道服务器的地址InetAddress serverIp = InetAddress.getByName("127.0.0.1");//2、端口号int port = 9999;//3、创建一个socket连接socket = new Socket(serverIp,port);//4、发送消息 IO流outputStream = socket.getOutputStream();outputStream.write("你好".getBytes());} catch (Exception e) {e.printStackTrace();}finally {//关闭资源if(outputStream != null){try {outputStream.close();} catch (IOException e) {e.printStackTrace();}}if(socket != null){try {socket.close();} catch (IOException e) {e.printStackTrace();}}}}
}

服务器

package com.shu.tcp;import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;//服务端
public class TcpServerDemo01 {public static void main(String[] args) {ServerSocket serverSocket = null;Socket socket = null;InputStream inputStream = null;ByteArrayOutputStream byteArrayOutputStream = null;try {//1、我得有一个地址serverSocket = new ServerSocket(9999);//2、等待客户端连接过来socket = serverSocket.accept();//3、读取客户端的消息inputStream = socket.getInputStream();//管道流byteArrayOutputStream = new ByteArrayOutputStream();byte[] buffer = new byte[1024];int len;while ((len = inputStream.read(buffer))!= -1){byteArrayOutputStream.write(buffer,0,len);}System.out.println("服务器收到了:" + byteArrayOutputStream.toString());} catch (IOException e) {e.printStackTrace();}finally {//关闭资源if(byteArrayOutputStream != null){try {byteArrayOutputStream.close();} catch (IOException e) {e.printStackTrace();}}if(inputStream != null){try {inputStream.close();} catch (IOException e) {e.printStackTrace();}}if(socket != null){try {socket.close();} catch (IOException e) {e.printStackTrace();}}if(serverSocket != null){try {serverSocket.close();} catch (IOException e) {e.printStackTrace();}}}}
}

1.6.1 文件上传

客户端

package com.shu.tcp;import java.io.*;
import java.net.InetAddress;
import java.net.Socket;//客户端
public class TcpClientDemo02 {public static void main(String[] args) {try {//1、创建一个socket连接Socket socket = new Socket(InetAddress.getByName("127.0.0.1"),9000);//2、创建一个输出流OutputStream outputStream = socket.getOutputStream();String rootPath = System.getProperty("user.dir");System.out.println("Compiler root path: " + rootPath);String path = rootPath+"/网络编程/src/Go.jpg";File file = new File(path);System.out.println(file);//3、读取文件FileInputStream fileInputStream = new FileInputStream(file);//4、写出文件byte[] buffer = new byte[1024];int len;while ((len = fileInputStream.read(buffer))!=-1){outputStream.write(buffer,0,len);}//通知服务器,我已经结束了socket.shutdownOutput();  //我已经传输完了//确定服务器接收完毕,才能够断开连接InputStream inputStream = socket.getInputStream();ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();byte[] buffer2 = new byte[1024];int len2;while ((len2 = inputStream.read(buffer2))!=-1){byteArrayOutputStream.write(buffer2,0,len2);}byteArrayOutputStream.close();inputStream.close();System.out.println(byteArrayOutputStream.toString());fileInputStream.close();outputStream.close();socket.close();} catch (IOException e) {e.printStackTrace();}}
}

服务器

package com.shu.tcp;import java.io.*;
import java.net.InetAddress;
import java.net.Socket;//客户端
public class TcpClientDemo02 {public static void main(String[] args) {try {//1、创建一个socket连接Socket socket = new Socket(InetAddress.getByName("127.0.0.1"),9000);//2、创建一个输出流OutputStream outputStream = socket.getOutputStream();String rootPath = System.getProperty("user.dir");System.out.println("Compiler root path: " + rootPath);String path = rootPath+"/网络编程/src/Go.jpg";File file = new File(path);System.out.println(file);//3、读取文件FileInputStream fileInputStream = new FileInputStream(file);//4、写出文件byte[] buffer = new byte[1024];int len;while ((len = fileInputStream.read(buffer))!=-1){outputStream.write(buffer,0,len);}//通知服务器,我已经结束了socket.shutdownOutput();  //我已经传输完了//确定服务器接收完毕,才能够断开连接InputStream inputStream = socket.getInputStream();ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();byte[] buffer2 = new byte[1024];int len2;while ((len2 = inputStream.read(buffer2))!=-1){byteArrayOutputStream.write(buffer2,0,len2);}byteArrayOutputStream.close();inputStream.close();System.out.println(byteArrayOutputStream.toString());fileInputStream.close();outputStream.close();socket.close();} catch (IOException e) {e.printStackTrace();}}
}

image-20230610093307048

1.6.2 Tomcat

服务端

  • 自定义 S
  • Tomcat服务器 S

客户端

  • 自定义 C
  • 浏览器 B
  1. Tomcat启动

image-20230610104219001

  1. Tomcat自定义启动端口号

image-20230610104322428

  1. Windows下中文乱码处理

image-20230610104453477

1.7 UDP

UDP没有客户端、服务端的概念。

1.7.1 发送消息

发送端

package com.shu.udp;import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;//不需要连接服务器
public class UdpClientDemo01 {public static void main(String[] args) throws Exception {//1、建立一个socket//DatagramSocket datagramSocket = new DatagramSocket();DatagramSocket datagramSocket = new DatagramSocket(8080);//2、建个包String msg = "你好啊,服务器!";//发送给谁InetAddress localhost = InetAddress.getByName("localhost");int port = 9090;DatagramPacket datagramPacket = new DatagramPacket(msg.getBytes(),0,msg.getBytes().length,localhost,port);//3、发送包datagramSocket.send(datagramPacket);datagramSocket.close();}
}

接收端

package com.shu.udp;import java.net.DatagramPacket;
import java.net.DatagramSocket;
//还是要等待客户端的连接
public class UdpServerDemo01 {public static void main(String[] args) throws Exception {//开放端口DatagramSocket datagramSocket = new DatagramSocket(9090);//接收数据包byte[] buffer = new byte[1024];DatagramPacket datagramPacket = new DatagramPacket(buffer, 0, buffer.length);datagramSocket.receive(datagramPacket);  //阻塞接收System.out.println(datagramPacket.getAddress().getHostAddress());System.out.println(new String(datagramPacket.getData(),0,datagramPacket.getLength()));datagramSocket.close();}
}

1.7.2 咨询

package com.shu.chat;import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketException;public class UdpSenderDemo01 {public static void main(String[] args) throws Exception {DatagramSocket datagramSocket = new DatagramSocket(8888);//准备数据:控制台读取 System.inBufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));while (true){String data = bufferedReader.readLine();byte[] datas = data.getBytes();DatagramPacket datagramPacket = new DatagramPacket(datas,0,datas.length,new InetSocketAddress("localhost",6666));datagramSocket.send(datagramPacket);if(data.equals("bye")){break;}}datagramSocket.close();}
}
package com.shu.chat;import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;public class UdpReceiverDemo01 {public static void main(String[] args) throws Exception {DatagramSocket datagramSocket = new DatagramSocket(6666);while (true){//准备接收包裹byte[] container = new byte[1024];DatagramPacket datagramPacket = new DatagramPacket(container,0,container.length);datagramSocket.receive(datagramPacket);  //阻塞式接收//断开连接byte[] data = datagramPacket.getData();String receiveData = new String(data, 0, data.length);System.out.println(receiveData);if(receiveData.equals("bye")){break;}}datagramSocket.close();}
}

在线咨询:两个人都可以式发送方,也都可以是接收方

发送方

package com.shu.chat;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;public class TalkSend implements Runnable{DatagramSocket datagramSocket = null;BufferedReader bufferedReader = null;private int fromPort;private String toIp;private int toPort;public TalkSend(int fromPort, String toIp, int toPort) {this.fromPort = fromPort;this.toIp = toIp;this.toPort = toPort;try{datagramSocket = new DatagramSocket(fromPort);bufferedReader = new BufferedReader(new InputStreamReader(System.in));}catch (Exception e){e.printStackTrace();}}@Overridepublic void run() {while (true){String data = null;try {data = bufferedReader.readLine();byte[] datas = data.getBytes();DatagramPacket datagramPacket = new DatagramPacket(datas,0,datas.length,new InetSocketAddress(this.toIp,this.toPort));datagramSocket.send(datagramPacket);if(data.equals("bye")){break;}} catch (IOException e) {e.printStackTrace();}}datagramSocket.close();}
}

接收方

package com.shu.chat;import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;public class TalkReceive implements Runnable{DatagramSocket datagramSocket = null;private int port;private String msgFrom;public TalkReceive(int port,String msgFrom) {this.port = port;this.msgFrom = msgFrom;try {datagramSocket = new DatagramSocket(port);} catch (SocketException e) {e.printStackTrace();}}@Overridepublic void run() {while (true){try {//准备接收包裹byte[] container = new byte[1024];DatagramPacket datagramPacket = new DatagramPacket(container,0,container.length);datagramSocket.receive(datagramPacket);  //阻塞式接收//断开连接byte[] data = datagramPacket.getData();String receiveData = new String(data, 0, data.length);System.out.println(msgFrom+":"+receiveData);if(receiveData.equals("bye")){break;}} catch (IOException e) {e.printStackTrace();}}datagramSocket.close();}
}

学生端

package com.shu.chat;public class TalkStudent {public static void main(String[] args) {//开启两个线程new Thread(new TalkSend(7777,"localhost",9999)).start();new Thread(new TalkReceive(8888,"老师")).start();}
}

老师端

package com.shu.chat;public class TalkTeacher {public static void main(String[] args) {new Thread(new TalkSend(5555,"localhost",8888)).start();new Thread(new TalkReceive(9999,"学生")).start();}
}

image-20230612113804757

1.8 URL

https://www.baidu.com/

URL:统一资源定位符。定位资源的,定位互联网上的某一个资源

DNS域名解析 www.baidu.com --> xxx.xxx.xxx.xxx

协议://ip地址:端口/项目名/资源
package com.shu.url;import java.net.MalformedURLException;
import java.net.URL;public class UrlDemo01 {public static void main(String[] args) throws MalformedURLException {URL url = new URL("http://localhost:8080/helloworld/index.jsp?username=xiaoshu&pwd=123");System.out.println(url.getProtocol());   //得到协议名System.out.println(url.getHost());  //主机ipSystem.out.println(url.getPort());  //端口System.out.println(url.getPath());  //文件路径System.out.println(url.getFile());  //全路径System.out.println(url.getQuery()); //参数}
}
http
localhost
8080
/helloworld/index.jsp
/helloworld/index.jsp?username=xiaoshu&pwd=123
username=xiaoshu&pwd=123

下载网络资源

package com.shu.url;import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;public class UrlDown {public static void main(String[] args) throws Exception {//1.下载地址//URL url = new URL("http://localhost:8080/xiaoshu/SecurityFile.txt");//URL url = new URL("https://p2.music.126.net/TmOHxaGnFNlwNX8aPz66oA==/109951168638913915.jpg?param=200y200");//URL url = new URL("https://m801.music.126.net/20230612143122/c1b529f89cd6159b6be1cc0c49bd0752/jdyyaac/obj/w5rDlsOJwrLDjj7CmsOj/28133411020/b5d7/3857/ac5c/1274e257b2e91849e3290c8b53709ba5.m4a");URL url = new URL("https://m701.music.126.net/20230612151545/0eca07048cfb060e64aaa244d40ccc3c/jdyyaac/obj/w5rDlsOJwrLDjj7CmsOj/23899224434/4ccf/d853/e041/57604a1cd303c3df46cf1ce5e8b8035d.m4a");//2.连接到这个资源 HTTPHttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();InputStream inputStream = urlConnection.getInputStream();//FileOutputStream fileOutputStream = new FileOutputStream("SecurityFile.txt");FileOutputStream fileOutputStream = new FileOutputStream("世界欠你一个微笑^_^.m4a");byte[] buffer = new byte[1024];int len;while ((len=inputStream.read(buffer))!=-1){fileOutputStream.write(buffer,0,len);   //写出这个数据}fileOutputStream.close();inputStream.close();urlConnection.disconnect();  //断开连接}
}

http://www.ppmy.cn/news/348788.html

相关文章

笔记本麦克风声音小解决办法

1. 右键单击任务栏的小喇叭图标 2. 切换到“录制”选项卡,双击“麦克风”打开麦克风属性 3.将“麦克风”和“麦克风加强”调整到合适大小

win10 电脑声音已经设置的很小了但是声音还是很大

win10 电脑声音已经设置的很小了但是声音还是很大 打开设置 选择声音 电影应用音量和设备首选项 在这里设置设置设备的音量。

win11声音小

上周更新了电脑系统,发现声音调到100还是小。于是进行了一番研究。 如果你跟我有一样的问题,可以试着按照如下步骤操作一下。 1、 右键右下角麦克风,打开声音设置 2、 点击播放声音的设备(我这里是我的耳机G633S) 3、…

Java阶段四Day02

Java阶段四Day02 文章目录 Java阶段四Day02VueCli嵌套路由总结项目开发开发流程关于项目项目分析数据库的设计规范(基于阿里巴巴Java开发手册)数据库表设计创建项目关于依赖项关于<build>报错 VueCli嵌套路由 由于Vue Cli工程是单页面的&#xff0c;为了保证能显示各式各…

win10系统声音很大,音频播放声音特小的问题

上午本来想放个视频&#xff0c;用电脑自带的播放器&#xff0c;发现没声&#xff0c;然后把扬声器设成默认设备&#xff0c;系统声音和播放器调到最大后&#xff0c;声音好像有了&#xff0c;但是特小&#xff0c;而且QQ、微信的语音、网页视频声音也都很小&#xff0c;可能不…

电脑视频声音小解决办法

平时我们在看视频时&#xff0c;会发现有些视频声音贼小&#xff0c;比如某盘&#xff0c;那么如何解决呢&#xff1f;这里提供一种简单的解决办法。 下载edge浏览器。&#xff08;如果有则不用下载&#xff09;点击&#xff0c;选择自己合适的版本下载 搜索外部扩展&#xff0…