亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Industrial programming >> java

Java - 网络

术语网络编程 是指编写跨多个设备(计算机)执行的程序,其中设备都通过网络相互连接。

J2SE API 的 java.net 包包含一组类和接口,这些类和接口提供低级通信细节,让您可以编写专注于解决手头问题的程序。

java.net 包提供了对两种常见网络协议的支持 -

本章很好地理解了以下两个主题 -

套接字编程

套接字使用 TCP 提供两台计算机之间的通信机制。客户端程序在通信结束时创建一个套接字并尝试将该套接字连接到服务器。

建立连接后,服务器在通信结束时创建一个套接字对象。客户端和服务器现在可以通过写入和读取套接字进行通信了。

java.net.Socket 类表示一个套接字,java.net.ServerSocket 类为服务器程序提供了一种机制来监听客户端并与它们建立连接。

使用套接字在两台计算机之间建立 TCP 连接时会发生以下步骤 -

建立连接后,可以使用 I/O 流进行通信。每个套接字都有一个 OutputStream 和一个 InputStream。客户端的OutputStream连接到服务器的InputStream,客户端的InputStream连接到服务器的OutputStream。

TCP 是一种双向通信协议,因此可以同时在两个流之间发送数据。以下是一些有用的类,它们提供了一套完整的方法来实现套接字。

ServerSocket 类方法

java.net.ServerSocket 服务器应用程序使用该类来获取端口并侦听客户端请求。

ServerSocket 类有四个构造函数 -

Sr.No. 方法和说明
1

public ServerSocket(int port) 抛出 IOException

尝试创建绑定到指定端口的服务器套接字。如果端口已经被另一个应用程序绑定,则会发生异常。

2

public ServerSocket(int port, int backlog) 抛出 IOException

与前面的构造函数类似,backlog 参数指定了等待队列中存储多少传入客户端。

3

public ServerSocket(int port, int backlog, InetAddress address) throws IOException

与前面的构造函数类似,InetAddress 参数指定要绑定到的本地 IP 地址。 InetAddress 用于可能有多个 IP 地址的服务器,允许服务器指定在其哪个 IP 地址上接受客户端请求。

4

public ServerSocket() 抛出 IOException

创建一个未绑定的服务器套接字。使用此构造函数时,请在准备好绑定服务器套接字时使用 bind() 方法。

如果ServerSocket构造函数没有抛出异常,说明你的应用已经成功绑定到指定的端口,可以接受客户端的请求了。

以下是ServerSocket类的一些常用方法 -

Sr.No. 方法和说明
1

公共 int getLocalPort()

返回服务器套接字正在侦听的端口。如果你在构造函数中传入 0 作为端口号并让服务器为你找到端口,则此方法很有用。

2

public Socket accept() 抛出 IOException

等待传入的客户端。假设超时值已使用 setSoTimeout() 方法设置,此方法将一直阻塞,直到客户端连接到指定端口上的服务器或套接字超时。否则,此方法将无限期阻塞。

3

public void setSoTimeout(int timeout)

设置在 accept() 期间服务器套接字等待客户端多长时间的超时值。

4

public void bind(SocketAddress host, int backlog)

将套接字绑定到 SocketAddress 对象中的指定服务器和端口。如果您已经使用无参数构造函数实例化了 ServerSocket,请使用此方法。

当 ServerSocket 调用 accept() 时,该方法在客户端连接之前不会返回。客户端连接后,ServerSocket 在未指定的端口上创建一个新的 Socket,并返回对这个新 Socket 的引用。客户端和服务器之间现在已经建立了 TCP 连接,可以开始通信了。

套接字类方法

java.net.Socket class 表示客户端和服务器都用来相互通信的套接字。客户端通过实例化一个Socket对象得到一个Socket对象,而服务端通过accept()方法的返回值获取一个Socket对象。

Socket 类有五个构造函数,客户端用来连接服务器 -

Sr.No. 方法和说明
1

public Socket(String host, int port) 抛出 UnknownHostException, IOException。

此方法尝试在指定端口连接到指定服务器。如果这个构造函数没有抛出异常,则连接成功,客户端连接到服务端。

2

public Socket(InetAddress host, int port) 抛出 IOException

此方法与前面的构造函数相同,只是主机由 InetAddress 对象表示。

3

public Socket(String host, int port, InetAddress localAddress, int localPort) 抛出 IOException。

连接到指定的主机和端口,在本地主机上的指定地址和端口创建一个socket。

4

public Socket(InetAddress host, int port, InetAddress localAddress, int localPort) 抛出 IOException。

此方法与前面的构造函数相同,不同之处在于主机由 InetAddress 对象而不是 String 表示。

5

公共套接字()

创建一个未连接的套接字。使用 connect() 方法将此套接字连接到服务器。

当 Socket 构造函数返回时,它并不是简单地实例化一个 Socket 对象,而是实际尝试连接到指定的服务器和端口。

这里列出了 Socket 类中一些感兴趣的方法。注意客户端和服务端都有一个 Socket 对象,所以这些方法可以被客户端和服务端调用。

Sr.No. 方法和说明
1

public void connect(SocketAddress host, int timeout) 抛出 IOException

此方法将套接字连接到指定的主机。只有在使用无参数构造函数实例化 Socket 时才需要此方法。

2

公共 InetAddress getInetAddress()

此方法返回此套接字连接的另一台计算机的地址。

3

公共 int getPort()

返回远程机器上套接字绑定的端口。

4

公共 int getLocalPort()

返回套接字在本地机器上绑定的端口。

5

公共 SocketAddress getRemoteSocketAddress()

返回远程套接字的地址。

6

public InputStream getInputStream() 抛出 IOException

返回套接字的输入流。输入流连接到远程套接字的输出流。

7

public OutputStream getOutputStream() 抛出 IOException

返回套接字的输出流。输出流连接到远程套接字的输入流。

8

public void close() 抛出 IOException

关闭套接字,这使得这个 Socket 对象不再能够再次连接到任何服务器。

InetAddress 类方法

此类表示 Internet 协议 (IP) 地址。以下是您在进行套接字编程时需要的以下有用方法 -

Sr.No. 方法和说明
1

静态 InetAddress getByAddress(byte[] addr)

返回给定原始 IP 地址的 InetAddress 对象。

2

静态 InetAddress getByAddress(String host, byte[] addr)

根据提供的主机名和 IP 地址创建 InetAddress。

3

静态 InetAddress getByName(字符串主机)

根据主机名确定主机的 IP 地址。

4

字符串 getHostAddress()

以文本形式返回 IP 地址字符串。

5

字符串 getHostName()

获取此 IP 地址的主机名。

6

静态 InetAddress InetAddress getLocalHost()

返回本地主机。

7

字符串 toString()

将此 IP 地址转换为字符串。

套接字客户端示例

下面的 GreetingClient 是一个客户端程序,它通过套接字连接到服务器并发送问候语,然后等待响应。

示例

// File Name 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("Connecting to " + serverName + " on port " + port);
         Socket client = new Socket(serverName, port);
         
         System.out.println("Just connected to " + 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("Server says " + in.readUTF());
         client.close();
      } catch (IOException e) {
         e.printStackTrace();
      }
   }
}

套接字服务器示例

以下 GreetingServer 程序是一个服务器应用程序示例,它使用 Socket 类在命令行参数指定的端口号上侦听客户端 -

示例

// File Name 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("Waiting for client on port " + 
               serverSocket.getLocalPort() + "...");
            Socket server = serverSocket.accept();
            
            System.out.println("Just connected to " + server.getRemoteSocketAddress());
            DataInputStream in = new DataInputStream(server.getInputStream());
            
            System.out.println(in.readUTF());
            DataOutputStream out = new DataOutputStream(server.getOutputStream());
            out.writeUTF("Thank you for connecting to " + 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.start();
      } catch (IOException e) {
         e.printStackTrace();
      }
   }
}

编译客户端和服务端,然后启动服务端如下-

$ java GreetingServer 6066
Waiting for client on port 6066...

检查客户端程序如下 -

输出

$ java GreetingClient localhost 6066
Connecting to localhost on port 6066
Just connected to localhost/127.0.0.1:6066
Server says Thank you for connecting to /127.0.0.1:6066
Goodbye!

java

  1. Java 运算符
  2. Java 评论
  3. Java if...else 语句
  4. Java for-each 循环
  5. Java 字符串
  6. Java 接口
  7. Java 匿名类
  8. Java try-with-resources
  9. Java 注释
  10. Java 断言
  11. Java 向量
  12. Java - 网络