网络编程及TCP/UDP协议
网络编程
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协议相关推荐
- 21天学会Java之(Java SE第十三篇):网络编程、TCP/UDP通信
如今,计算机已经成为人们学习.工作.生活必不可少的工具.人们利用计算机可以和亲朋好友在网上聊天,玩网游或发邮件等,这些功能的实现都离不开计算机网络.计算机网络实现了不同计算机之间的通信,而这些必须依靠 ...
- 网络编程入门 TCP/IP 协议 端口 IP 软件结构
目录 一.软件结构 二.网络通信协议 三.协议分类: 四.网络编程三要素:协议,ip,端口号 1.协议 2.IP地址 3.IP地址分类 a.IPv4 b.IPv6 4.IP常用命令 1. 查看本机IP ...
- 网络编程 day03 (linux) UDP 协议的传输 与函数 getsockopt setsockopt sendto(经socket传送数据)recvfrom
1.UDP协议的特点 UDP(User Datagram Protocol)用户数据报协议,是不可靠的无连接的协议.在数据发送前,因为不需要进行连接,所以可以进行高效率的数据传输. 适用情况: 1.发 ...
- 网络编程、tcp udp
什么是网络编程? 网络编程可以让程序与网络上的其他设备中的程序进行数据交互. 网络通信基本模式 常见的通信模式有如下2种形式:Client-Server(CS).Browser/Server(BS) ...
- 网络编程4之UDP协议
一.定义 UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型中一种[无 ...
- 网络原理之TCP/UDP协议
UDP协议 UDP协议端格式 16位UDP长度, 表示整个数据报(UDP首部+UDP数据)的最大长度; 如果校验和出错, 就会直接丢弃 UDP的特点 UDP传输的过程类似于寄信. 无连接: 知道对端的 ...
- 02_11_Java语音进阶||day11_网络编程【TCP|UDP】
第一章 网络编程入门 1.1 软件结构 两种架构各有优势,但是无论哪种架构,都离不开网络的支持."网络编程",就是在一定的协议下,实现两台计算机的通信的程序 1.2 网络编程三要素 ...
- 【QT网络编程】实现UDP协议通信
文章目录 概要:本期主要讲解QT中对UDP协议通信的实现. 一.UDP协议通信 二.Qt中UDP协议的处理 1.QUdpSocket 三.Qt实现UDP通信 1.客户端 2.服务器端 结尾 概要:本期 ...
- 【网络编程】TCP/UDP/HTTP的区别和联系
一.参考资料 TCP/UDP/HTTP的区别和联系_唯爱丶卡卡西的博客-CSDN博客 HTTP.UDP.TCP区别 - 知乎
最新文章
- 设计模式 — Overview
- python使用lxml及request爬取-python用lxml解析网页为什么不完整?
- Java互联网架构-京东国美高并发核心技术“秒杀”
- 零基础学Python:函数的参数详解
- D. Mahmoud and Ehab and the binary string Codeforces Round #435 (Div. 2)
- range函数python_range()函数以及Python中的示例
- c++ 纯虚函数导出
- 吴恩达深度学习 —— 作业2
- AD快捷键及常用操作
- PS_1_认识主界面_新建文档(分辨率)_打开保存(序列动画)
- 何文江先生出任创意信息集团总经理
- 蒂森MC2_B系统调试软件 蒂森MC2_B系统调试软件
- 小型团队项目管理_寻找小型工程团队的项目管理平衡
- 【夜读】做好这6件事,让人受益一生
- window系统 node.js安装 (node-v14安装配置、node-v16及其他版本安装配置)
- [ 网络协议篇 ] 一篇文章让你掌握什么是 数字证书 ?什么是SSL ?什么是 TLS ?
- 解决Android设置环信显示头像和昵称问题
- 角色建模师前景如何?
- web3 solidity 基础 ERC20 大白话搞懂
- Java——速学界面设计之仿Windows记事本的字体窗口
热门文章
- CMap How-to
- Cannot locate the chosen ObjectFactory implementation: spring - [unknown locati
- java课前演讲讲什么_课前演讲讲什么比较有创意(逼格)?
- Dashboard是什么意思 Dashboard怎么用?
- SM2算法第十二篇:数字证书原理
- 第3集丨通往圣贤之路
- 下载Java工具JDK
- 电竞英雄联盟数据API接口 - 【英雄联赛统计】API调用示例代码
- C++中,system的神级用法总和,实现用C++操作系统
- 骁龙8gen1和苹果A15评测哪个好