Day 20:网络编程(1)
什么是计算机网络?
指的是分布在不同地域的计算机,通过外部设备连接起来,实现资源共享与数据传输的计算机系统。
通信三要素:
IP:
IP地址
Internet上的每台主机(Host)都有一个唯一的IP地址。IP地址的长度为32位,分为4段,每段8位,用十进制数字表示,每段数字范围为0~255,段与段之间用句点隔开。例如 159.226.1.1。(四个字节)
IP地址类别
IP地址是由网络号和主机号组成
A类地址:8位网络位,24位主机位
B类地址: 16位网络位,16位主机位
C类地址: 24位网络位,8位主机位
特殊的IP地址:127.0.0.1 表示 本机回环地址
端口:
Port地址
如果把IP地址比作一间房子 ,端口就是出入这间房子的门。真正的房子只有几个门,但是一个IP地址的端口 可以有65536(即:2^16)个之多!端口是通过端口号来标记的,端口号只有整数,范围是从0 到65535(2^16-1)。
Port分类(0~65535)
公认端口(WellKnownPorts):从0到1023,它们紧密绑定(binding)于一些服务。
注册端口(RegisteredPorts):从1024到49151。它们松散地绑定于一些服务。
动态和/或私有端口(Dynamicand/orPrivatePorts):从49152到65535。
常用端口
21 FTP
80 HTTP
443 HTTPS
协议:
TCP:Transmission Control Protocol 传输控制协议TCP是一种面向连接(连接导向)的、可靠的、基于字节流的运输层(Transport layer)通信协议。
特点:
面向连接的协议,数据传输必须要建立连接,所以在TCP中需要连接时间。
传输数据大小限制,一旦连接建立,双方可以按统一的格式传输大的数据。
一个可靠的协议,确保接收方完全正确地获取发送方所发送的全部数据。
UDP: User Datagram Protocol的简称, 中文名是用户数据包协议,是 OSI 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。
特点:
每个数据报中都给出了完整的地址信息,因此无需要建立发送方和接收方的连接。
UDP传输数据时是有大小限制的,每个被传输的数据报必须限定在64KB之内。
UDP是一个不可靠的协议,发送方所发送的数据报并不一定以相同的次序到达接收方。
Java网络编程
Java网络编程其实就是实现局域网或互联网之间的数据通信(数据传输)。
Java网络编程要素
通过前面的知识,大家知道了计算机之间的数据传输需要三个要素。(IP(主机名)、端口、协议),Java是OOP语言,所以将其封装为特定的对象,java.net.*
对象映射
IP 主机名 (InetAddress)
端口 数字标识 不用封装为对象
InetAddress
此类表示互联网协议 (IP) 地址。
功能
getLocalHost()
getHostAddress()
getHostName()
getByName(String host)
getAllByName(String host)
细节
使用getByName(String host)通过一个IP地址找主机时,如果IP和Address没有对应在公网上,那么该IP解析不了对应的地址,而且显示为对应IP且查询很慢。
可以getByName(String host)找出域名对应的IP,getAllByName()可以获取多个地址。
import java.net.InetAddress;
import java.net.UnknownHostException; public class Demo1 {
public static void main(String[] args) throws UnknownHostException {
InetAddress address = InetAddress.getLocalHost();
System.out.println(address.getHostAddress());//返回的是字符串
System.out.println(address.getHostName()); InetAddress address1 = InetAddress.getByName("www.baidu.com");
System.out.println(address1);
System.out.println(address1.getHostAddress());//返回的是字符串 }
}
/*InetAddress[] address1 = InetAddress.getAllByName("www.baidu.com");
for(InetAddress a:address1) {
System.out.println(a);
}*/
//百度公司注册了两台服务器
在JAVA中网络通信也叫做Socket(插座)通讯,要求互相通讯的两台机器必须安装Socket。不同的协议有不同的Socket
UDP
将数据极其源和目的封装为数据包,不需要建立连接。
每个数据包大小限制在64K中
因为无连接,所以不可靠
因为不需要建立连接,所以速度快
UDP下的Socket:
DatagramSocket(UDP插座服务)
DatagramPacket(数据包类)
TCP
面向连接,有特有的通道
在连接中传输大数据量
通过三次握手机制连接,可靠协议
通信前必须建立连接,效率稍低
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException; public class Demo2 {
public static void main(String[] args) throws IOException {
//建立udp的服务
DatagramSocket ds = new DatagramSocket();
//准备数据,把数据封装到数据包中。
String data = "fdsfgdsgdsgfdsfg";
//创建了一个数据包
DatagramPacket dp = new DatagramPacket(data.getBytes(),data.getBytes().length ,InetAddress.getLocalHost() , 9090);
//调用udp的服务发送数据包
ds.send(dp);
//关闭资源 ---实际上就是释放占用的端口号
ds.close(); }
}
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket; public class Demo3 {
private void main(String args[]) throws IOException {
// TODO Auto-generated method stub
//建立udp的服务, ,并且要监听一个端口。
DatagramSocket ds = new DatagramSocket(9090);
//准备空的数据包用于存放数据。
byte[] buf = new byte[1024];
DatagramPacket datagramPacket = new DatagramPacket(buf, buf.length);
//receive是一个阻塞型的方法,没有接收到数据包之前会一直等待。 数据实际上就是存储到了byte的自己数组中了。
ds.receive(datagramPacket);
System.out.println(new String(buf,0,datagramPacket.getLength()));
//关闭资源
ds.close(); } }
先在eclipse运行接收端,然后在命令提示符中运行发送端,否则数据丢失。
Day 20:网络编程(1)的更多相关文章
- python学习(20) 网络编程
原文链接:http://www.limerence2017.com/2018/01/02/python20/ python 网络编程和基本的C语言编程一样,效率不是很高,如果为了封装通信库建议采用C/ ...
- python网络编程-socket编程
一.服务端和客户端 BS架构 (腾讯通软件:server+client) CS架构 (web网站) C/S架构与socket的关系: 我们学习socket就是为了完成C/S架构的开发 二.OSI七层 ...
- python网络编程
Socket是网络编程的一个抽象的概念. 通常我们用一个Socket表示"打开了一个网络链接",而打开一个Socket需要知道目标计算机的IP地址和端口号,再指定协议类型即可. 套 ...
- Python之路【第七篇】python基础 之socket网络编程
本篇文章大部分借鉴 http://www.cnblogs.com/nulige/p/6235531.html python socket 网络编程 一.服务端和客户端 BS架构 (腾讯通软件:ser ...
- python 网络编程
一.网络知识的一些介绍 socket是网络连接端点.例如当你的Web浏览器请求www.pythontik.com上的主页时,你的Web浏览器创建一个socket并命令它去连接www.pythontik ...
- 20145205 《Java程序设计》实验报告五:Java网络编程及安全
20145205 <Java程序设计>实验报告五:Java网络编程及安全 实验要求 1.掌握Socket程序的编写: 2.掌握密码技术的使用: 3.客户端中输入明文,利用DES算法加密,D ...
- socket网络编程
一.客户端/服务器架构 C/S架构,包括 1.硬件C/S架构(打印机) 2.软件C/S架构(Web服务) 最常用的软件服务器就是Web服务器,一台机器里放了一些网页或Web应用程序,然后启动服务,这样 ...
- python成长之路【第九篇】:网络编程
一.套接字 1.1.套接字套接字最初是为同一主机上的应用程序所创建,使得主机上运行的一个程序(又名一个进程)与另一个运行的程序进行通信.这就是所谓的进程间通信(Inter Process Commun ...
- android基础(五)网络编程
android 的网络编程一般可以分为两种:基于Socket的,基于Http的. 一.socket与Http socket封装了TCP/IP协议,TPC/IP协议是传输层协议,主要解决数据如何在网络中 ...
随机推荐
- 【剑指Offer面试编程题】题目1510:替换空格--九度OJ
题目描述: 请实现一个函数,将一个字符串中的空格替换成"%20".例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. 输入: 每个 ...
- rally问题合集
rally 执行过程中涉及到keystone的用例,需要调用adminurl,在-/rally/lib/python2.7/site-packages/rally/osclients.py(主机文件的 ...
- Java多线程信号量同步类CountDownLatch与Semaphore
信号量同步是指在不同线程之间,通过传递同步信号量来协调线程执行的先后次序.CountDownLatch是基于时间维度的Semaphore则是基于信号维度的. 1:基于执行时间的同步类CountDown ...
- 实战mysql存储程序与定时器
home198979 实战mysql存储程序与定时器 博客分类: mysql 存储过程定时器eventprocedure实战 需求:一个庞大的日志表,现每天做定时统计一天的总数,放另一个表中,方便查 ...
- 使用 XMLBeans 进行编程
深入考察 XMLBeans 的特性和功能.本文通过一个简单的例子介绍 XMLBeans 技术,然后一步一步地介绍编译和绑定的过程,讨论 XML 游标.标记和 XQuery 表达式等高级特性.本文还 ...
- 记一次菜鸡的低级折腾--WordPress get Webshell(后台文件编辑插马)
挺简单的一个测试站,开始思路错了,一直去网上找WordPress的漏洞,看有没有什么能利用的,未果,因为这个测试站有些地方并不完善,有的漏洞利用不了,菜鸡的我连弱口令都没猜对,没知识就是这么悲哀. 下 ...
- Jackson自定义反序列化
// 设置jackson时间反系列化格式 SimpleModule module = new SimpleModule(); module.addDeserializer(Date.class, ne ...
- Tensorflow官方文档 input_data.py 下载
说明: 本篇文章适用于MNIST教程下载数据集. # Copyright 2015 Google Inc. All Rights Reserved. # # Licensed under the Ap ...
- 一个平凡计算机爱好者的linux进步之路
我从小就对计算机特别感兴趣,小的时候梦想就是拥有一台属于自己的电脑.无奈那时候农村条件限制,学校.家庭都不配备电脑.只好悄悄的跑去网吧研究一番,但毕竟时间有限,生活费有限,也不可能经常去网吧玩,在网吧 ...
- Docker退出容器不关闭容器的方法
进入docker容器后如果退出容器,容器就会变成Exited的状态,那么如何退出容器让容器不关闭呢? 如果要正常退出不关闭容器,请按Ctrl+P+Q进行退出容器,这一点很重要,请牢记! 以下示例为退出 ...