网络编程

1.1、概述

地球村:你在西安,一个在美国

打电话--连接--接了--通话 TCP

发短信--发完了就完事了--接收 UDP(丢包)

计算机网络:

计算机网络系统就是利用通信设备和线路将地理位置不同、功能独立的多个计算机系统互联起来,以功能完善的网络软件实现网络中资源共享和信息传递的系统。通过计算机的互联,实现计算机之间的通信,从而实现计算机系统之间的信息、软件和设备资源的共享以及协同工作等功能,其本质特征在于提供计算机之间的各类资源的高度共享,实现便捷地交流信息和交换思想。

网络编程的目的:

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

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

1.如何准确的定位网络上的一台主机 192.168.16.124:端口,定位到这个计算机上的某个资源

2.找到了这个主机,如何传输数据呢?

javaweb:网页编程 B/S 架构

网络编程:TCP/IP C/S 架构

1.2、网络通信的要素

如何实现网络的通信?

通信双方的地址:

  • ip

  • 端口号

规则:网络通信的协议

TCP/IP参考模型:

小结:

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

如何准确的定位到网络上的一台或者多台主机

找到主机之后如何让进行通信

2.网络编程中的要素

IP 和 端口号

网络通信协议 DUP TCP

1.3、IP

ip地址:InetAddress

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

  • 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
    • 公网(互联网)-私网(局域网)

      • ABCD类地址

      • 192.168.xx.xx

  • 域名:记忆IP问题

    //  测试IP
    public class TestInetAddress {public static void main(String[] args) {try {//  查询本机IP地址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、端口port

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

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

  • 被规定 0~65535

  • TCP、UDP:63335 * 2 TCP: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|finder "5900" # 查看指定端口
      tasklist|finder "8696" # 查看指定端口的进程
    • 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、发送消息

// 客户端
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、简历服务器的端口

2、等待用户的连接 accept

3、接收用户的消息

// 服务端
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();
​// 管道流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();}}}}
}

文件上传

服务器端:

public class TcpServerDemo02 {public static void main(String[] args) throws IOException {// 1. 创建服务ServerSocket serverSocket = new ServerSocket(9000);// 2. 监听客服端的连接Socket socket = serverSocket.accept();// 阻塞式监听,会一致等待客户端连接// 3. 获取输入流InputStream is = socket.getInputStream();// 4. 输出文件FileOutputStream fos = new FileOutputStream("receive");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();}
}

客户端:

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("daxian.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

发短信:不用连接,需要知道对方地址

发送消息

发送消息send:

// 不需要连接服务器
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();}
}

接收消息receive:

// 还是要等待客户端的连接!
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();}
}

咨询

循环发送消息:

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();}
}

循环接收消息:

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();}
}

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

1.8、URL

百度一下,你就知道

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

DNS域名解析

协议://ip地址:端口/项目名/资源
public class URLDemo01 {public static void main(String[] args) throws MalformedURLException {URL url = new URL("http://localhost:8080/helloworld/index.jsp?username=daxian@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());  // 参数}
}
public class URLDown {public static void main(String[] args) throws Exception {// 1. 下载地址URL url = new URL("http://localhost:8080/daxian/SercurityFile.txt");
​// 2. 连接到这个资源 httpHttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
​InputStream inputStream = urlConnection.getInputStream();
​FileOutputStream fos = new FileOutputStream("SercurityFile.txt");
​byte[] buffer = new byte[1024];int len;while ((len=inputStream.read(buffer))!=-1){fos.write(buffer,0,len); // 写出这个数据}fos.close();inputStream.close();urlConnection.disconnect();}
}

网络编程及TCP/UDP协议相关推荐

  1. 21天学会Java之(Java SE第十三篇):网络编程、TCP/UDP通信

    如今,计算机已经成为人们学习.工作.生活必不可少的工具.人们利用计算机可以和亲朋好友在网上聊天,玩网游或发邮件等,这些功能的实现都离不开计算机网络.计算机网络实现了不同计算机之间的通信,而这些必须依靠 ...

  2. 网络编程入门 TCP/IP 协议 端口 IP 软件结构

    目录 一.软件结构 二.网络通信协议 三.协议分类: 四.网络编程三要素:协议,ip,端口号 1.协议 2.IP地址 3.IP地址分类 a.IPv4 b.IPv6 4.IP常用命令 1. 查看本机IP ...

  3. 网络编程 day03 (linux) UDP 协议的传输 与函数 getsockopt setsockopt sendto(经socket传送数据)recvfrom

    1.UDP协议的特点 UDP(User Datagram Protocol)用户数据报协议,是不可靠的无连接的协议.在数据发送前,因为不需要进行连接,所以可以进行高效率的数据传输. 适用情况: 1.发 ...

  4. 网络编程、tcp udp

    什么是网络编程? 网络编程可以让程序与网络上的其他设备中的程序进行数据交互. 网络通信基本模式 常见的通信模式有如下2种形式:Client-Server(CS).Browser/Server(BS) ...

  5. 网络编程4之UDP协议

    一.定义 UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型中一种[无 ...

  6. 网络原理之TCP/UDP协议

    UDP协议 UDP协议端格式 16位UDP长度, 表示整个数据报(UDP首部+UDP数据)的最大长度; 如果校验和出错, 就会直接丢弃 UDP的特点 UDP传输的过程类似于寄信. 无连接: 知道对端的 ...

  7. 02_11_Java语音进阶||day11_网络编程【TCP|UDP】

    第一章 网络编程入门 1.1 软件结构 两种架构各有优势,但是无论哪种架构,都离不开网络的支持."网络编程",就是在一定的协议下,实现两台计算机的通信的程序 1.2 网络编程三要素 ...

  8. 【QT网络编程】实现UDP协议通信

    文章目录 概要:本期主要讲解QT中对UDP协议通信的实现. 一.UDP协议通信 二.Qt中UDP协议的处理 1.QUdpSocket 三.Qt实现UDP通信 1.客户端 2.服务器端 结尾 概要:本期 ...

  9. 【网络编程】TCP/UDP/HTTP的区别和联系

    一.参考资料 TCP/UDP/HTTP的区别和联系_唯爱丶卡卡西的博客-CSDN博客 HTTP.UDP.TCP区别 - 知乎

最新文章

  1. 设计模式 — Overview
  2. python使用lxml及request爬取-python用lxml解析网页为什么不完整?
  3. Java互联网架构-京东国美高并发核心技术“秒杀”
  4. 零基础学Python:函数的参数详解
  5. D. Mahmoud and Ehab and the binary string Codeforces Round #435 (Div. 2)
  6. range函数python_range()函数以及Python中的示例
  7. c++ 纯虚函数导出
  8. 吴恩达深度学习 —— 作业2
  9. AD快捷键及常用操作
  10. PS_1_认识主界面_新建文档(分辨率)_打开保存(序列动画)
  11. 何文江先生出任创意信息集团总经理
  12. 蒂森MC2_B系统调试软件 蒂森MC2_B系统调试软件
  13. 小型团队项目管理_寻找小型工程团队的项目管理平衡
  14. 【夜读】做好这6件事,让人受益一生
  15. window系统 node.js安装 (node-v14安装配置、node-v16及其他版本安装配置)
  16. [ 网络协议篇 ] 一篇文章让你掌握什么是 数字证书 ?什么是SSL ?什么是 TLS ?
  17. 解决Android设置环信显示头像和昵称问题
  18. 角色建模师前景如何?
  19. web3 solidity 基础 ERC20 大白话搞懂
  20. Java——速学界面设计之仿Windows记事本的字体窗口

热门文章

  1. CMap How-to
  2. Cannot locate the chosen ObjectFactory implementation: spring - [unknown locati
  3. java课前演讲讲什么_课前演讲讲什么比较有创意(逼格)?
  4. Dashboard是什么意思 Dashboard怎么用?
  5. SM2算法第十二篇:数字证书原理
  6. 第3集丨通往圣贤之路
  7. 下载Java工具JDK
  8. 电竞英雄联盟数据API接口 - 【英雄联赛统计】API调用示例代码
  9. C++中,system的神级用法总和,实现用C++操作系统
  10. 骁龙8gen1和苹果A15评测哪个好