网络编程(Socket)

一、IP
1、概念:
定义:
互联网协议地址,是分配给用户上网使用的网际协议(英语:Internet Protocol, IP)的设备的数字标签,定义网络上的不同节点(手机,电脑,路由器..)。
常见的IP地址分为IPv4与IPv6两大类:IPv4:32位 IPV6:128位
非注册IP地址(公司内部使用): 192.168.0.0 ~ 192.168.255.255
特殊的IP:
127.0.0.1 本地IP
localhost 本机域名
DNS域名解析器 :把域名转换成主机所在IP地址的中介
2、类 InetAddress :
此类表示互联网协议 (IP) 地址,在 java.net下,用于封装计算机的IP地址和DNS(没有端口)。
InetAddress对象的获取只能通过静态方法

InetAddress对象的获取只能通过静态方法
//static InetAddress getLocalHost()  返回本地主机。 
//static InetAddress getByName(String host)在给定主机名的情况下确定主机的IP地址 
InetAddress ia=InetAddress.getByName("localhost");
System.out.println(ia);

常用方法:

//String getHostAddress() 返回 IP 地址字符串(以文本表现形式)
// String getHostName() 获取此 IP  地址的主机名  
System.out.println(ia.getHostAddress());
System.out.println(ia.getHostName());

运行结果

localhost/127.0.0.1
127.0.0.1
localhost

二、端口
1、概念
定义:
这里的端口指计算机内部或交换机路由器内的端口,而非物理意义上的端口。如果把IP地址比作一间房子 ,端口就是出入这间房子的门,用来区分不同软件。
端口通过端口号来标记,端口号只有整数,大小为 2个字节,范围为0~65535,相同的协议下端口不能冲突
端口自定义越大越好,8000以上,8000以内预留端口号
特殊的端口号:
80: http
8080: tomcat
1521: Oracle端口号
3306: mysql端口号
2、类 InetSocketAddress
InetSocketAddress类是SocketAddress的实现子类,此类实现 IP 套接字地址(IP 地址 + 端口号),不依赖任何协议,用于socket通信。
SocketAddress只是个抽象类,它除了有一个默认的构造方法外,其它的方法都是abstract的,因
此,我们必须使用其唯一子类InetSocketAddress来创造对象。
套接字:
为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与TCP/IP协议交互提供了称为套接字 (Socket)的接口,区分不同应用程序进程间的网络通信和连接。
构造器和常用方法

//InetSocketAddress(String hostname, int port)   
//根据主机名和端口号创建套接字地址。
InetSocketAddress is=new InetSocketAddress("localhost",8888);
System.out.println(is);
//InetAddress getAddress()  获取 InetAddress。 
//String getHostName()  获取 hostname。 
// int getPort()  获取端口
System.out.println(is.getHostName());
System.out.println(is.getPort());

运行结果

localhost/127.0.0.1:8888
localhost
8888

三、URL
1、定义:
统一资源定位符,它是指向互联网“资源”的指针,互联网三大基石之一(http+html)。
例如: 对于http://www.baidu.com:80/index.html?name=zhangsan&age=123#a
协议:http
域名:www.baidu.com
端口:80 默认80
资源:index.html?name=zhangsan&age=123#a
2、URL类

/*
String getFile() 获取此 URL 的文件名。 
String getHost()  获取此 URL 的主机名(如果适用)。 
String getPath()  获取此 URL 的路径部分。 
int getPort()  获取此 URL 的端口号。 
String getProtocol()  获取此 URL 的协议名称。 
String getQuery() 获取此 URL 的查询部分。 
String getRef()获取此 URL 的锚点(也称为“引用”)。 
 */
URL url=new URL("http://www.baidu.com:80/index.html?name=zhangsan&age=123#a");
System.out.println(url.getProtocol());
System.out.println(url.getHost());
System.out.println(url.getFile());
System.out.println(url.getPath());
System.out.println(url.getQuery());
System.out.println(url.getRef());

3、两个相关类
InputStreamReader :
是字节流通向字符流的桥梁:它使用指定的 charset 读取字节并将其解码为字符,继承自类Reader,可以用BufferedReader包裹以提高效率。

URL url=new URL("https://www.taobao.com");
//InputStream openStream()  打开到此 URL 的连接并返回一个用于从该连接读入的 InputStream。 
//InputStream getInputStream() 返回从此打开的连接读取的输入流。 
//转换流  把字节节点流转换成为字符节点流
BufferedReader is=new BufferedReader(new InputStreamReader(url.openStream()));
String msg;
while((msg=is.readLine())!=null) {
    System.out.println(msg);
}
is.close();

HttpURLConnection类:
是Java的标准类,它继承自URLConnection,可用于向指定网站发送GET请求、POST请求。它在URLConnection的基础上提供了如下便捷的方法:

//定义 url
URL url=new URL("https://www.dianping.com");
HttpURLConnection con= (HttpURLConnection) url.openConnection();
//设置和获取属性值
//设置 URL 请求的方法, GET POST等,具体取决于协议的限制。
con.setRequestMethod("GET");
//int getResponseCode() 从 HTTP 响应消息获取状态码。 
System.out.println(con.getResponseCode());  
//String getResponseMessage(); 获取服务器的响应消息。
//String getResponseMethod(); 获取发送请求的方法。

四、协议
1、概念
定义:
网络协议是网络上所有设备(网络服务器、计算机及交换机、路由器、防火墙等)之间通信规则的集合,是为了计算机网络中进行数据交换而建立的规则、标准或约定,它规定了通信时信息必须采用的格式和这些格式的意义
分类:
UDP:UserDatagramProtocol,一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。其特点为:非面向连接;传输不可靠;数据可能丢失。 非面向连接的 写信 ,不安全,效率高,协议简单,开销小,大小有限制一般不超过60k
TCP :transfer control protocol,一种面向连接(连接导向)的、可靠的、基于字节流的传输 层(Transport layer)通信协议的点到点的通信 。TCP 三次握手(Three-way Handshake),类似于拨打电话 面向连接的 打电话 ,安全,效率低,开销大 3次握手:1.拨号 2.回访:响应 3.发送数据 ,基于IO穿出数据
2、UDP编程
类DatagramSocket :
此类表示用来发送和接收数据报包的套接字DatagramSocket本身只是码头,不维护状态,不能产生IO流,它的唯一作用就是接收和发送数据报
DatagramPacket
此类表示数据报包。DatagramSocket接收和发送的数据都是通过Datagrampacket对象完成的。
UDP如何实现Socket编程: 发送端和接收端是平等的
发送端基本流程

// 1.创建发送端 DatagramSocket(int port)
DatagramSocket socket = new DatagramSocket(8888);
// 2.准备数据,转为字节数组
String str = "那些你很冒险的梦";
byte[] a = str.getBytes();
a = new byte[0];
// 3.打包 DatagramPacket(byte[] buf, int offset, int length, SocketAddress
DatagramPacket packet = new DatagramPacket(arr, 0, arr.length, new InetSocketAddress("localhost", 9999));
// 4.void send(DatagramPacket p) 从此套接字发送数据报包。
socket.send(packet);
// 5.关闭
socket.close();

接收端流程

//1.构建接受端,指定接受端端口
DatagramSocket socket=new DatagramSocket(9999);
//2.准备字节数组,用来存储接口收据的
byte[] arr=new byte[1024*60];
//3.把字节数组打包 DatagramPacket(byte[] buf, int offset, int length) 
DatagramPacket packet=new DatagramPacket(arr,0,arr.length);
//4.接收 void receive(DatagramPacket p) 从此套接字接收数据报包。 
socket.receive(packet);
//byte[] getData() 返回数据缓冲区。 int getLength() 返回将要发送或接收到的数据的长度。 
//5.处理数据
System.out.println(new String(packet.getData()));
System.out.println(packet.getLength());
//6.关闭
socket.close();

3、TCP编程
客户端基本流程

System.out.println("------------Client-----------");
//1.创建客户端  Socket 指定服务端的ip和端口
Socket client=new Socket("127.0.0.1",9999);
//2.io操作  OutputStream getOutputStream()    返回此套接字的输出流。 
DataOutputStream out=new DataOutputStream(new BufferedOutputStream(client.getOutputStream()));
out.writeUTF("name=hangsan&pwd=123");
//3.关闭
out.flush();
out.close();
client.close();

服务器端基本流程:

//  1.构建服务端  ServerSocket  指定端口
ServerSocket server=new ServerSocket(9999);
//  2.阻塞式监听
Socket socket=server.accept();
System.out.println("一个客户端连接成功");
//  3.一个客户端就是一个socket  IO操作
DataInputStream is=new DataInputStream(new BufferedInputStream(socket.getInputStream()));
String str=is.readUTF();
System.out.println(str);
//  4.关闭
is.close();
socket.close();
server.close();

<meta charset="utf-8">

参考资料:

百度百科

https://blog.csdn.net/u011068702/article/details/52336238#

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,711评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,079评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,194评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,089评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,197评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,306评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,338评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,119评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,541评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,846评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,014评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,694评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,322评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,026评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,257评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,863评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,895评论 2 351

推荐阅读更多精彩内容

  • 一、概念 首先,理清一些概念 TCP/IP和UDP,HTTP协议,Socket 1.TCP/IP和UDP,是网络中...
    _AJH阅读 4,168评论 0 18
  • 1、 Socket通信模型如下: 应用程序通过套接字可以进行通信,可以使用udp协议或者使用tcp协议,当客户端和...
    AiPuff阅读 648评论 0 1
  • 什么是Socket Socket是进程通讯的一种方式,即调用这个网络库的一些API函数实现分布在不同主机的相关进程...
    onlyHalfSoul阅读 663评论 0 1
  • 网络开发的框架 C/S B/S 统一了程序的入口 (浏览器) osi七层模型 TCP(Transmissi...
    Snackk阅读 493评论 0 0
  • 计算机网络概述 网络编程的实质就是两个(或多个)设备(例如计算机)之间的数据传输。 按照计算机网络的定义,通过一定...
    蛋炒饭_By阅读 1,215评论 0 10