一.计算机之间通信需要的条件
1.IP地址
IP地址指的是互联网地址(Internet Protocol Address ) ,是联网设备与互联网之间的唯一标识,在同一个网段中,IP地址是唯一的
IP地址是数字型的,是一个32位的整数,通常将其分成4个8位的二进制数,每8位之间用圆点隔开, 每个8位整数可以转换为一个0~255的十进制整数,例如:202.9.128.88
IPV4:三个点隔开的4组数字 每个数的范围1-255之间
2.端口
数据的发送和接收都需要通过端口出入计算机,端口号用于唯一标识通信实体上进行网络通讯的程序,同一台机器上不能两个程序占用同一个端口
端口号的取值范围:0~65535
常用端口:
mysql:3306
oracle:1521
tomcat:8080
3.通信协议
需要通信的设备之间需要实现相同的通信协议
网络分层:物理层,数据链路层,网络层,传输层,会话层,表示层,应用层
通信协议分类:
- 传输层协议:TCP和UDP
- 网络层IP协议:IPV4和IPV6,互联网协议
- 应用层协议:HTTP
HTTP协议的主要特点可概括如下:
- 1.支持客户/服务器模式。
- 2.简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
- 3.灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
- 4.无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
- 5.无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
二.相关类的使用
1.InetAddress类
Java提供了InetAddress类来代表ip地址,是对ip地址的抽取和封装,有两个子类:Inet4Address,Inet6Address,分别表示IPv4和IPv6
import java.net.InetAddress;
import java.net.UnknownHostException;
public class IpDemo {
public static void main(String[] args) {
InetAddress ia = null;
InetAddress[] aryIa = null;
//获取本机IP相关信息
try {
ia = InetAddress.getLocalHost();
//获取Ip地址
System.out.println("本地IP地址:"+ia.getHostAddress());
System.out.println("本地计算机名:"+ia.getHostName());
//获取www.jingdong.com域名的所有IP地址相关信息
aryIa = InetAddress.getAllByName("www.jingdong.com");
for (InetAddress i : aryIa) {
System.out.println("IP:"+i.getHostAddress()+",计算机名:"+
i.getHostName());
}
} catch (UnknownHostException e) {
e.printStackTrace();
}
}
}
2.URLEncoder类和URLDecoder类
URLEncoder类和URLDecoder类用于完成普通字符串和application/x-www-form-urlencoded MIME字符串之间的转换
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;
public class UrlDemo {
public static void main(String[] args) {
//编码的目的:让字符串能在网上传输
String strEn = "";
String strDe = "";
try {
//加码
strEn = URLEncoder.encode("JavaWeb开发", "GBK");
System.out.println(strEn);
//解码
strDe = URLDecoder.decode(strEn, "GBK");
System.out.println(strDe);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
}
三.基于TCP的网络编程
1.概念:
TCP,Transmission Control Protocol,传输控制协议,基于字节流的传输层通信协议
2.特点:
- 1)安全的
- 2)面向链接的
- 3)传输数据大小限制,一旦连接建立,双方可以按统一的格式传输大的数据
3.TCP的三次握手※※※
- 1)客户端向服务端发送一个请求
- 2)服务端收到请求后,回客户端一个响应
- 3)客户端向收到服务端的响应后,回服务端一个确认信息
四.Socket和ServerSocket
服务器:
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) {
ServerSocket ss = null;
try {
ss = new ServerSocket(8081);//端口号
System.out.println("服务器等待客户端的请求连接......");
//监听客户端有无对服务器的连接请求
Socket socket = ss.accept();
System.out.println("客户端已经和服务器建立连接");
//获取客户端发送的信息
InputStream is = socket.getInputStream();
//字节数组
byte[] ary = new byte[1024];
is.read(ary);
System.out.println("服务器接收到信息:");
System.out.println(new String(ary));
} catch (IOException e) {
e.printStackTrace();
}
}
}
客户端:
package cn.cc.day23;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
public class Client {
public static void main(String[] args) {
//Socket类,封装了三次握手及字节流的读写方法
//声明Socket对象
Socket socket = null;
//创建和对方的连接
try {
socket = new Socket("10.2.154.153",8081);//IP地址,端口名字
//创建输出流
OutputStream ops = socket.getOutputStream();
//通过输出流发送信息
ops.write("谷丰是个大娘们!".getBytes());
//刷新
ops.flush();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}