【图灵干货】Java高级教程第五节:Java 网络编程
2021-10-28 17:18:25
第一,Java网络程序设计。
网路程式设计就是写出若干台装置(电脑)上运行的程式。
java.net包中J2SE的API包括类和接口,这些API提供了低层通信细节。您可以直接使用这些类和接口,将精力集中在解决问题上,而无需关注通信的细节。
java.net包中对两个常用网络协议的支持:
TCP:TCP是传输控制协议的简称,它可以保证两个应用程序间的可靠通信。一般在因特网协议中使用,称为TCP/IP。
UDP:UDP是用户数据报协议的简称,是无连接协议。为要在应用程序间发送的数据提供一个包。
这篇教程的重点是介绍以下两个主题。
Socket编程:这是网络中应用最广的概念,对此我们做了相当详细的解释。
URL处理:这个部分将以另一部分进行讨论,点击此处进一步学习java语言中的URL处理。
第二,Socket编程。
socket使用TCP,在两台机器间提供一种通信机制。客户机程序创建一个套接字,然后尝试连接服务器。
在连接建立后,服务器创建一个Socket对象。通过读写Socket对象并读入Socket对象,客户机和服务器现在可以通信。
java.net.Socket类表示socket,java.net.ServerSocket类为服务器程序提供一种机制来监听客户机,并将其连接到它们。
当下面的步骤用socket在两台计算机之间建立TCP连接时,将出现:
伺服器实例化一个ServerSocket对象,代表在服务器上进行通信。
该服务器调用ServerSocket类的accept()方法,该方法会一直等待直到客户机连接到服务器上给定的端口。
当服务器等待时,一个客户机实例化一个Socket对象,指定服务器名和端口号,以请求连接。
Socket类的构造器尝试将客户机连接到指定的服务器和端口号。当通讯建立后,在客户机上创建Socket对象就可以和服务器通信了。
在服务器端,accept()方法将返回服务器上一个新的socket引用,这个socket连接到客户机的socket。
一旦连接建立起来,通过使用I/O流来进行通信,每个socket都有一个输出流和输入流,客户机的输出流与服务器端的输入流相连,客户端的输入流与服务器端的输出流相连。
TCP是一种双向通信协议,所以数据可以同时通过两个数据流传送.下面是一些类为socket提供的一套完整而有用的方法。
第三,类ServerSocket的方法。
通过使用java.net.ServerSocket类获得一个端口,并监听客户机请求。
ServerSocket类有四种构造方法:
不受约束的服务器套接字创建。若ServerSocket构造方法未引发异常,则表示您的应用程序已成功绑定到指定端口,并监听客户机请求。
下面是ServerSocket类的一些常见方法:
第四,Socket类方法。
java.net.Socket类表示了客户机和服务器用于进行通信的套接字。客户机要获取一个Socket对象,然后服务器得到一个Socket对象,然后通过accept()方法返回返回值。
Socket构造方法返回时,Socket对象并不是真正试图连接到指定服务器和端口的简单Socket对象。
以下是一些有趣的方法,请注意,客户端和服务器端都有一个Socket对象,因此可以被客户端或服务端调用。
第五,InetAddress类的一个方法。
该类代表了因特网协议(IP)地址。在Socket编程时,以下是一些更有用的方法:
第六,Socket客户端实例。
下面是GreetingClient,它是一个客户端程序,它通过socket连接服务器,发送请求,然后等待响应。
GreetingClient.java文件代码:
// 文件名 GreetingClient.java
import java.net.*;
import java.io.*;
public class GreetingClient {
public static void main(string [] args) {
String serverName = args[0];
int port = Integer.parseInt(args[1]);
try {
System.out.println("连接到主机:" + serverName + " ,端口号:" + port);
Socket client = new Socket(serverName, port);
System.out.println("远程主机地址:" + client.getRemoteSocketAddress());
OutputStream outToServer = client.getOutputStream();
DataOutputStream out = new DataOutputStream(outToServer);
out.writeUTF("Hello from " + client.getLocalSocketAddress());
InputStream inFromServer = client.getInputStream();
DataInputStream in = new DataInputStream(inFromServer);
System.out.println("服务器响应: " + in.readUTF());
client.close();
}
catch(IOException e) {
e.printStackTrace();
} } }
七、Socket 服务端实例
如下的GreetingServer 程序是一个服务器端应用程序,使用 Socket 来监听一个指定的端口。
GreetingServer.java 文件代码:
// 文件名 GreetingServer.java
import java.net.*;
import java.io.*;
public class GreetingServer extends Thread {
private ServerSocket serverSocket;
public GreetingServer(int port) throws IOException {
serverSocket = new ServerSocket(port);
serverSocket.setSoTimeout(10000);
}
public void run() {
while(true) {
try {
System.out.println("等待远程连接,端口号为:" + serverSocket.getLocalPort() + "...");
Socket server = serverSocket.accept();
System.out.println("远程主机地址:" + server.getRemoteSocketAddress());
DataInputStream in = new DataInputStream(server.getInputStream());
System.out.println(in.readUTF());
DataOutputStream out = new DataOutputStream(server.getOutputStream());
out.writeUTF("谢谢连接我:" + server.getLocalSocketAddress() + "\nGoodbye!");
server.close(); }catch(SocketTimeoutException s) {
System.out.println("Socket timed out!");
break;
}
catch(IOException e) {
e.printStackTrace(); break;
}
}
}
public static void main(String [] args) {
int port = Integer.parseInt(args[0]);
try {
Thread t = new GreetingServer(port);
t.run();
}
catch(IOException e) {
e.printStackTrace();
} } }
编译以上两个 java 文件代码,并执行以下命令来启动服务,使用端口号为 6066:
$ javac GreetingServer.java
$ java GreetingServer 6066
等待远程连接,端口号为:6066...
新开一个命令窗口,执行以上命令来开启客户端:
$ javac GreetingClient.java
$ java GreetingClient localhost 6066
连接到主机:localhost ,端口号:6066
远程主机地址:localhost/127.0.0.1:6066
服务器响应: 谢谢连接我:/127.0.0.1:6066
下一章节我们将介绍Java高级教程第六节:Java 发送邮件
免费java架构师视频学习地址:免费视频