网络编程:
java语言中,提供了一套统一的编程接口,很多细节已经底层化,所以可以无痛的网络通信编程
提供的是Socket套接字技术
-
常用的通信协议
-
TCP(信息传递协议)/IP(地址信息协议):通信之前,需要建立连接,之后,要断开连接,一般有一个作为服务器端,一个作为客户端
主要将通讯模式分成4个层: 应用层 传输层 IP层 编程接口层
-
UDP:不需要建立连接,相对来说,开销比较小,效率高,不安全
类型:java.net.InetAddress
提供了用于获取描述主机和IP的信息功能
常用方法:
static InetAddress getByName(String host)
返回一个指定字符串主机的地址对象
主机名:可以使用IP来描述,还可以使用域名来使用(通常域名会邦定一个IP地址)
String getHostName()
返回描述主机的字符串名称
String getHostAddress()
返回描述主机的IP地址
static InetAddress getLocalHost()
返回本地主机地址对象
/**
* InetAddress类型的学习
*/
public class Test01 {
public static void main(String[] args) {
try {
InetAddress addr =
InetAddress.getByName("www.baidu.com");
System.out.println(addr.getHostAddress());
System.out.println(addr.getHostName());
InetAddress local = addr.getLocalHost();
/*本地IP联网状态下,是网络终端的服务器随机分配的IP*/
System.out.println(local.getHostAddress());
System.out.println(local.getHostName());
/* 不联网状态下,我们的本地IP和主机名
* 可以使用127.0.0.1和localHost来替代
*/
InetAddress lo = InetAddress.getByName("127.0.0.1");
System.out.println(lo);
lo = InetAddress.getByName("localHost");
System.out.println(lo);
} catch (UnknownHostException e) {
e.printStackTrace();
}
}
}
套接字编程
Socket
在客户端使用,连接成功后会获取一个Socket对象
ServerSocket
在服务器端使用创建服务器端套接字对象,被连接后,获取一个Socket对象
注意:通信是使用各自获取的Socket对象来通信
编写步骤:
服务器对象
服务器等待被连接
客户端连接服务器(成功与否)
客户端与服务端通信
断开连接
端口号:是一个16位,无符号二进制整数,0-65535
和IP一起用来指定一个运行中程序的位置
所以这么说:端口号是运行程序的唯一标识符,即程序运行时,端口号不能碰撞
通常0-1023是操作系统预定义的端口,所以,我们在自定义时,应该尽可能使用1024-65535范围的数
ServerSocket类的使用
构造器:
ServerSocket(int port)
创建一个指定端口号的ServerSocket对象
常用方法:
Socket accept()
等待客户端连接,返回客户端对象
void close()
关闭套接字
InetAddress getInetAddress()
获取服务端的地址
int getLocalPort()
获取服务端口号
SocketAddress getLocalSocketAddress()
获取
Socket类的使用
构造器:
Socket(String host, int port)
向指定的主机名和指定端口号的服务发送请求连接,连接成功,获取Socket对象
常用方法:
void close()
关闭套接字
InetAddress getInetAddress()
返回套接字所连接服务器的地址。
int getPort()
返回套接字所连接远程机器的窗口号
int getLocalPort()
返回本地端口
InputStream getInputStream()
获取输入流对象,接收远程机器发送的信息
OutputStream getOutputStream()
获取输出流对象,向远程机器发送信息
/**
* 服务器端编程:ServerSocket
*/
public class Server {
private ServerSocket server;
public Server() {
/*
* 构造器ServerSocket(int port)
* 使用指定的端口号来创建一个服务套接字对象
*/
try {
server = new ServerSocket(8088);
} catch (IOException e) {
e.printStackTrace();
}
}
private void start() {
try {
System.out.println("-----等待被连接-----");
/*
* Socket accept()
* 有阻塞效果,等待被客户端连接
*/
Socket socket = server.accept();
System.out.println("-----连接成功-----");
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Server server = new Server();
server.start();
}
}
/**
* 客户端的编写
*/
public class Client {
private Socket socket;
public Client() {
try {
System.out.println("-----正在努力连接服务器-----");
socket = new Socket("localHost", 8088);
System.out.println("-----连接服务器成功-----");
} catch (IOException e) {
e.printStackTrace();
}
}
private void start() {
}
public static void main(String[] args) {
Client client = new Client();
client.start();
}
}