狂神网络编程笔记

文章目录

  • 网络编程
    • 1.1、概述
    • 1.2、网络通信的要素
    • 1.3、IP
    • 1.4、端口
    • 1.5、通信协议
    • 1.6、TCP
      • 文件上传
      • Tomcat
    • 1.7、UDP
      • 发送信息
      • 咨询
    • 1.8、URL

视频地址

网络编程

1.1、概述

地球村:你在西安,你一个美国的朋友!

信件:

在这里插入图片描述

计算机网络

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

网络编程目的

无线电台、传播交流信息,数据交换,通信

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

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

Javaweb:网页编程 B/S

网络编程·:TCP/IP C/S

1.2、网络通信的要素

如何实现网络的通信?

通信双方地址:

  • IP
  • 端口号
  • 192.168.16.124:5900

规则:网络通信的协议

TCP/IP参考模型

在这里插入图片描述

在这里插入图片描述

小结:

  1. 网络编程中有两个主要的问题
    • 如何准确的定位到网络上的一台或多台主机。
    • 找到主机之后如何进行通信
  2. 网络编程中的要素
    • IP和端口号 ip
    • 网络通信协议 udp,tcp
  3. 万物皆对象

1.3、IP

ip地址:Inet Address

  • 唯一定位一台网络上计算机

  • 127.0.0.1:本机localhost

  • ip地址的分类

    • ipv4/ipv6

      • IPV4 127.0.0.1 ,4个字节组成,0~255,42亿;30亿都在北美,亚洲4亿,2011年就用尽了;
        • IPV6 128位,8个无符号整数!
      2001:0bb2:aaaa:0015:0000:0000:1aaa:1312
      

    • 公网(互联网)—私网(局域网)

      • 192.168.XXXX,专门给组织机构内部使用的
  • 域名:记忆IP问题!

    • IP:www.vip.com
package com.kuang.lesson01;import java.net.InetAddress;
import java.net.UnknownHostException;//测试IP
public class TestInetAddress {public static void main(String[] args) {try {//查询本机地址InetAddress inetAddress1 = InetAddress.getByName("127.0.0.1");System.out.println(inetAddress1);InetAddress inetAddress3 = InetAddress.getByName("localhost");System.out.println(inetAddress3);InetAddress inetAddress4 = InetAddress.getLocalHost();System.out.println(inetAddress4);//查询网站ip地址InetAddress inetAddress2 = InetAddress.getByName("www.baidu.com");System.out.println(inetAddress2);//常用方法//System.out.println(inetAddress2.getAddress());System.out.println(inetAddress2.getCanonicalHostName());//规范的名字System.out.println(inetAddress2.getHostAddress());//ipSystem.out.println(inetAddress2.getHostName());//域名,或者自己电脑的名字} catch (UnknownHostException e) {e.printStackTrace();}}
}

在这里插入图片描述

1.4、端口

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

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

  • 被规定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"5900"#查看指定的端口
      tasklistfindstr"8696"#查看指定端口的进程
      strl+shift+esc 打开任务管理器
      
package com.kuang.lesson01;import java.net.InetSocketAddress;public class TestInetSocketAddress {public static void main(String[] args) {InetSocketAddress socketAddress = new InetSocketAddress("127.0.0.1", 8080);InetSocketAddress socketAddress2 = new InetSocketAddress("localhost", 8080);System.out.println(socketAddress);System.out.println(socketAddress2);System.out.println(socketAddress.getAddress());System.out.println(socketAddress.getHostName());//地址System.out.println(socketAddress.getPort());//端口 }
}

在这里插入图片描述

在这里插入图片描述

1.5、通信协议

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

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

**问题:**非常的复杂?

大事化小:分层!

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

重要:

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

出名的协议:

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

在这里插入图片描述

TCP UDP对比

TCP:打电话

  • 连接,稳定

  • 三次握手四次挥手

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

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

UDP:发短信

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

1.6、TCP

客户端

  1. 连接服务器Socket
  2. 发送消息
package com.kuang.lesson02;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 os =null;try {//1.要知道服务器的地址.端口号InetAddress serverIP = InetAddress.getByName("127.0.0.1");int port=9999;//2.创建一个socket连接socket = new Socket(serverIP,port);//3.发送消息 IO流os = socket.getOutputStream();os.write("你好,欢迎学习狂神说Java".getBytes());} catch (Exception e) {e.printStackTrace();}finally {if (os!=null){try {os.close();} catch (IOException e) {e.printStackTrace();}}if (socket!=null){try {socket.close();} catch (IOException e) {e.printStackTrace();}}}}
}

在这里插入图片描述

服务器

  1. 建立服务的端口ServerSocket
  2. 等待用户的连接 accept
  3. 接收用户的消息
package com.kuang.lesson02;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 is =null;ByteArrayOutputStream baos =null;try {//1.我得有一个地址serverSocket = new ServerSocket(9999);while (true){//2.等待客户端连接过来socket = serverSocket.accept();//3.读取客户端的消息is = socket.getInputStream();/*byte[] buffer=new byte[1024];int len;while ((len=is.read(buffer))!=-1){String msg=new String((buffer,0,len);System.out.println(msg);}*///管道流baos = new ByteArrayOutputStream();byte[] buffer = new byte[1024];int len;while ((len=is.read(buffer))!=-1){baos.write(buffer,0,len);}System.out.println(baos.toString());}} catch (IOException e) {e.printStackTrace();}finally {//关闭资源if (baos!=null) {try {baos.close();} catch (IOException e) {e.printStackTrace();}}if (is!=null){try {is.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();}}}}
}

在这里插入图片描述

文件上传

服务器端:

package com.kuang.lesson02;import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;public class TcpServerDemo02 {public static void main(String[] args) throws Exception {//1.创建服务ServerSocket serverSocket = new ServerSocket(9000);//2.监听客户端的连接Socket socket = serverSocket.accept();//阻塞式监听,会一直等待客户连接//3.获取输入流InputStream is = socket.getInputStream();//4.文件输出FileOutputStream fos = new FileOutputStream(new File("receive.jpg"));byte[] buffer = new byte[1024];int len;while ((len=is.read(buffer))!=-1){fos.write(buffer,0,len);}//通知客户端我接受完毕了OutputStream os = socket.getOutputStream();os.write("我接受完毕了,你可以断开了".getBytes());//关闭资源fos.close();is.close();socket.close();serverSocket.close();}
}

客户端:

package com.kuang.lesson02;import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;public class TcpClientDemo02 {public static void main(String[] args) throws Exception {//1.创建一个socket连接Socket socket = new Socket(InetAddress.getByName("127.0.0.1"), 9000);//2.创建一个输出流OutputStream os = socket.getOutputStream();//3.读取文件FileInputStream fis = new FileInputStream(new File("tx.jpg"));//4.写出文件byte[] buffer = new byte[1024];int len;while ((len=fis.read(buffer))!=-1){os.write(buffer,0,len);}//通知服务器,我已经结束了socket.shutdownOutput();//我已经传输完了!//确定服务器接收完毕,从才够断开连接InputStream inputStream = socket.getInputStream();//String byte[]ByteArrayOutputStream baos = new ByteArrayOutputStream();byte[] buffer2= new byte[1024];int len2;while ((len2=inputStream.read(buffer2))!=-1){baos.write(buffer2,0,len2);}System.out.println(baos.toString());//5.关闭资源baos.close();inputStream.close();fis.close();os.close();socket.close();}
}

在这里插入图片描述

在这里插入图片描述

Tomcat

服务器端

  • 自定义S
  • Tomcat服务器S:Java后台开发!

在这里插入图片描述

在这里插入图片描述

客户端

  • 自定义C
  • 浏览器B

1.7、UDP

发短信:不用连接,需要直到对方的地址!

发送信息

package com.kuang.lesson03;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.建立一个socketDatagramSocket socket = new DatagramSocket();//2.建个包String msg = "你好啊,服务器";//发送给谁InetAddress localhost = InetAddress.getByName("localhost");int port = 9090;//数据,数据的长度起始,要发送给谁DatagramPacket packet = new DatagramPacket(msg.getBytes(), 0, msg.getBytes().length, localhost, port);//3.发送包socket.send(packet);//4.关闭流socket.close();}
}接收端
```java
package com.kuang.lesson03;import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;//还是要等待客户端的连接!
public class UdpServerDemo01 {public static void main(String[] args) throws Exception {//开放端口DatagramSocket socket = new DatagramSocket(9090);//接收数据包byte[] buffer = new byte[1024];DatagramPacket packet = new DatagramPacket(buffer, 0, buffer.length);//接受socket.receive(packet);//阻塞接受System.out.println(packet.getAddress().getHostAddress());System.out.println(new String(packet.getData(), 0, packet.getLength()));//关闭连接socket.close();}
}

在这里插入图片描述

咨询

循环发送消息

package com.kuang.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 socket = new DatagramSocket(8888);//准备数据,控制台读取 System.inBufferedReader reader = new BufferedReader(new InputStreamReader(System.in));while (true) {String data = reader.readLine();byte[] datas = data.getBytes();DatagramPacket packet = new DatagramPacket(datas, 0, datas.length, new InetSocketAddress("localhost", 6666));socket.send(packet);if (data.equals("bye")) {break;}}socket.close();}
}

在这里插入图片描述

package com.kuang.chat;import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;public class UdpReceiveDemo01 {public static void main(String[] args) throws Exception {DatagramSocket socket = new DatagramSocket(6666);while (true) {//准备接收包裹byte[] container = new byte[1024];DatagramPacket packet = new DatagramPacket(container, 0, container.length);socket.receive(packet);//阻塞式接收包裹//断开连接 byebyte[] data = packet.getData();String receiveData = new String(data, 0, data.length);System.out.println(receiveData);if (receiveData.equals("bye")) {break;}}socket.close();}
}

在这里插入图片描述

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

package com.kuang.chat;import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;public class TalkRecevice  implements Runnable{DatagramSocket socket =null;private int port;private String msgFrom;public TalkRecevice(int port,String msgFrom) {this.port=port;this.msgFrom=msgFrom;try {socket =new DatagramSocket(port);} catch (Exception e) {e.printStackTrace();}}@Overridepublic void run() {while (true) {try {//准备接收包裹byte[] container = new byte[1024];DatagramPacket packet = new DatagramPacket(container, 0, container.length);socket.receive(packet);//阻塞式接收包裹//断开连接 byebyte[] data = packet.getData();String receiveData = new String(data, 0, data.length);System.out.println(msgFrom+":"+receiveData);if (receiveData.equals("bye")) {break;}} catch (IOException e) {e.printStackTrace();}}socket.close();}
}
package com.kuang.chat;import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;public class TalkSend implements Runnable {DatagramSocket socket = null;BufferedReader reader = 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 {socket = new DatagramSocket(fromPort);reader = new BufferedReader(new InputStreamReader(System.in));} catch (Exception e) {e.printStackTrace();}}@Overridepublic void run() {while (true) {try {String data = reader.readLine();byte[] datas = data.getBytes();DatagramPacket packet = new DatagramPacket(datas, 0, datas.length, new InetSocketAddress(this.toIP, this.toPort));socket.send(packet);if (data.equals("bye")) {break;}} catch (Exception e) {e.printStackTrace();}}socket.close();}
}
package com.kuang.chat;public class TalkStudent {public static void main(String[] args) {//开启两个线程new Thread(new TalkSend(7777,"localhost",9999)).start();new Thread(new TalkRecevice(8888,"老师")).start();}
}

在这里插入图片描述

package com.kuang.chat;public class TalkTeacher {public static void main(String[] args) {//开启两个线程new Thread(new TalkSend(5555,"localhost",8888)).start();new Thread(new TalkRecevice(9999,"学生")).start();}
}

在这里插入图片描述

1.8、URL

https://www.baidu.com/

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

DNS域名解析 www.baidu.com xxx.x…x…x…

协议://ip地址P:端口/项目名/资源
package com.kuang.lesson04;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.isp?username==kuangshen&password=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());//参数}
}

在这里插入图片描述

package com.kuang.lesson04;import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;public class UrlDown {public static void main(String[] args) throws Exception {//1.下载地址URL url = new URL("https://p1.music.126.net/obj/wo3DlcOGw6DClTvDisK1/3252225007/548b/a898/ffcd/ab81d70d93416576524757b3ca570c99.png");//2.连接到这个资源 HTTPHttpURLConnection urlConnection =(HttpURLConnection)  url.openConnection();InputStream inputStream = urlConnection.getInputStream();FileOutputStream fos = new FileOutputStream("网易云.png");byte[] buffer= new byte[1024];int len;while ((len=inputStream.read(buffer))!=-1){fos.write(buffer,0,len);//写出这个数据}fos.close();inputStream.close();urlConnection.disconnect();//断开连接}
}

在这里插入图片描述


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部