初识Java网络编程
一、概述:
网络编程是使用程序使两台(或多台)计算机之间进行数据传输,也即是编写在多台计算机上运行的程序,这些设备通过网络连接起来,程序间可以进行通信。
二、java.net包
java.net包提供了一些支持网络编程的类和接口,可直接使用,封装了底层的通信细节,使得开发网络编程变得更加简单。java.net提供了两种常见的网络协议:TCP(传输控制协议)和UDP(用户数据报协议),下面我们主要来分析一些Socket和URL。
三、Socket
Java.net包中的ServerSocket类用于表示服务器套接字,其主要功能是监听客户端的请求,当连接建立时,服务器会创建一个 Socket 对象。客户端和服务器可以通过对 Socket 对象的写入和读取来进行通信。
以下步骤在两台计算机之间使用套接字建立TCP连接时会出现:
- 服务器实例化一个 ServerSocket 对象,表示通过服务器上的端口通信。
- 服务器调用 ServerSocket 类的 accept() 方法,该方法将一直等待,直到客户端连接到服务器上给定的端口。
- 服务器正在等待时,一个客户端实例化一个 Socket 对象,指定服务器名称和端口号来请求连接。
- Socket 类的构造函数试图将客户端连接到指定的服务器和端口号。如果通信被建立,则在客户端创建一个 Socket 对象能够与服务器进行通信。
- 在服务器端,accept() 方法返回服务器上一个新的 socket 引用,该 socket 连接到客户端的 socket。
连接建立后,通过使用 I/O 流在进行通信,每一个socket都有一个输出流和一个输入流,客户端的输出流连接到服务器端的输入流,而客户端的输入流连接到服务器端的输出流。TCP 是一个双向的通信协议,因此数据可以通过两个数据流在同一时间发送。
简单实例:
//服务端程序server
import java.net.*;
import java.io.*;
public class Server {
public static void main(String[] args) {
try {
int port = args[0];
ServerSocket serverSocket = new ServerSocket(port);
System.out.println("监听端口号:port");
//accept一直处于监听,知道收到客户端请求
Socket socket = serverSocket.accept();
//通过socket.getInputStream()获取输入流
InputStream is = socket.getInputStream();
//读取客户端发送的数据
int massage = is.read();
//打印
System.out.println(massage);
is.close();
socket.close();
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
//客户端程序
import java.net.*;
import java.io.*;
public class Client {
public static void main(String[] args) {
try {
String host = args[0];
int port = args[1];
Socket socket = new Socket(host, port);
OutputStream os = socket.getOutputStream();
//把输出流封装在DataOutputStream中
DataOutputStream dos = new DataOutputStream(os);
//使用dos.writeUTF发送字符串
dos.writeUTF("来自客户端内容:Hello server!");
dos.close();
socket.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
//打开命令窗口,进入Server.java路径下,分别输入下面命令
$ javac Server.java
$ java Server 8080
监听端口号:8080
来自客户端内容:Hello server!
//打开另一命令窗口,进入Client.java路径下,分别输入下面命令
$ javac Client.java
$ java Client localhost 8080
四、URL
URL(Uniform Resource Locator)统一资源定位符,格式:protocol://host:port/path?query#fragment
例如:http://www.runoob.com/index.html?language=cn#j2se
URL解析:
-
协议为(protocol):http
-
主机为(host:port):www.runoob.com
-
端口号为(port): 80 ,以上URL实例并未指定端口,因为 HTTP 协议默认的端口号为 80
-
文件路径为(path):/index.html
-
请求参数(query):language=cn
-
定位位置(fragment):j2se,定位到网页中 id 属性为 j2se 的 HTML 元素位置 。
在java.net包中定义了URL类,该类用来处理有关URL的内容。详细参考见:菜鸟教程
【注】参考:菜鸟教程