java网络编程Day01
java网络编程
网络的概念
两台或多台设备通过一定物理设备连接起来构成了网络
根据覆盖范围对网络进行分类:
- 局域网
- 城域网
- 广域网
ip地址
用于唯一标识网络中的每台计算机/主机
-
ip地址的表现形式:xx.xx.xx.xx
-
每一个十进制数范围0 - 255
-
ip地址的组成:网络地址 + 主机地址 比如192.168.16.69
ip4地址分类
域名
域名(英语:Domain Name),又称网域,是由一串用点分隔的名字组成的Internet上某一台计算机或计算机组的名称,用于在数据传输时对计算机的定位标识(有时也指地理位置)。
由于IP地址具有不方便记忆并且不能显示地址组织的名称和性质等缺点,人们设计出了域名,并通过网域名称系统(DNS,Domain Name System)来将域名和IP地址相互映射,使人更方便地访问互联网,而不用去记住能够被机器直接读取的IP地址数串。
例如:
百度域名:www.baidu.com
ip:220.181.38.150
端口号
所谓的端口,就好像是门牌号一样,客户端可以通过ip地址找到对应的服务器端,但是服务器端是有很多端口的,每个应用程序对应一个端口号,通过类似门牌号的端口号,客户端才能真正的访问到该服务器。为了对端口进行区分,将每个端口进行了编号,这就是端口号 。
可以理解为一个房间的多个门.
- 表示形式:以整数形式,0 - 65535 (两个字节表示端口号 0 - 2 ^ 16 - 1)
- 0 - 1024端口 绝大部分已经被占用(ftp, ssh等),在网络开发中不要使用
- 常见端口:
- tomcat:8080
- mysql:3306
- oracle:1521
- sqlserver:1433
网络通信协议
通信协议(也称传输协议)在电信领域中指的是:在任何物理介质中允许两个或多个在传输系统中的终端之间传播信息的系统标准,也是指计算机通信或网络设备的共同语言。通信协议定义了通信中的语法学、语义学和同步规则以及可能存在的错误检测与纠正。通信协议在硬件、软件或两者之间皆可实现
TCP和UDP协议区别
InetAddress类
常用方法:
方法测试:
//获取本机的InetAddress对象
InetAddress localHost = InetAddress.getLocalHost();
System.out.println(localHost);//sdy-acer/127.0.1.1
//根据主机名获取InetAddress对象
InetAddress host1 = InetAddress.getByName("sdy-acer");
System.out.println(host1);//sdy-acer/127.0.1.1
//根据域名获取InetAddress对象
InetAddress host2 = InetAddress.getByName("www.baidu.com");
System.out.println(host2);//www.baidu.com/220.181.38.149
//通过InetAddress对象获取ip地址/主机域名
String hostAddress = host2.getHostAddress();
System.out.println(hostAddress);//220.181.38.149
String hostName = host2.getHostName();
System.out.println(hostName);//www.baidu.com
Socket套接字
所谓套接字(Socket),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。从所处的地位来讲,套接字上联应用进程,下联网络协议栈,是应用程序通过网络协议进行通信的接口,是应用程序与网络协议栈进行交互的接口 。
实现功能:
编写一个服务端和客户端,服务器端在9999端口监听,客户端连接到服务端,发送"hello, world"到客户端,客户端接收并输出,
客户端
package Socket编程;
import java.io.*;
import java.net.*;
public class Client {
public static void main(String[] args) throws IOException {
//连接服务器(ip, 端口)
//连接本机的9999端口,连接成功返回Socket对象,连接失败抛出异常
Socket socket = new Socket(InetAddress.getLocalHost(), 9999);
System.out.println("连接成功~");
//通过socket获取一个字节输入流
InputStream is = socket.getInputStream();
byte[] buf = new byte[9];
int readLine = 0;
while ((readLine = is.read(q)) != 0) {
System.out.println(new String(buf, 0, readLine));
}
is.close();
socket.close();
}
}
服务器端
package Socket编程;
import java.io.*;
import java.net.*;
public class Server {
public static void main(String[] args) throws IOException {
//在本机9999端口监听
//前提是没有其他服务占用9999端口,否则抛出异常
ServerSocket serverSocket = new ServerSocket(9999);
//如果没有客户端连接9999端口程序会阻塞在这,一直等待连接
//有客户连接后返回Scoket对象,程序继续往下执行
Socket socket = serverSocket.accept();
//通过socket接受一个字节输出流
OutputStream os = socket.getOutputStream();
os.write("hello,world!".getBytes(StandardCharsets.UTF_8));
//关流,养成习惯!
os.close();
socket.close();
}
}
总结一下就是通过socket和对方建立连接,服务器端使用ServerSocket,客户端使用Socket,区别是SweverSocket可以和多个客户端建立链接,主动访问对方的是客户端,所一客户端要通过ip和端口来访问,所以Socket socket = new Socket(InetAddress.getLocalHost(), 9999);
这里在构造方法中给出了本机的ip(因为我是用一台机器做实验)。
网络编程第一天的学习就结束了,算法刷题和java技术栈学习同步进行,并且还在看java核心技术卷,进度可能慢一点,加油!