Java 教程

Java 控制语句

面向对象编程

Java 内置类

Java 文件处理

Java 错误与异常

Java 多线程

Java 同步

Java 网络编程

Java 集合

Java 接口

Java 数据结构

Java 集合算法

高级 Java

Java 其他

Java APIs 和框架

Java 类引用

Java 有用资源

Java - Socket getInputStream() 方法



描述

Java Socket getInputStream() 方法返回此套接字的输入流。如果此套接字具有关联的通道,则生成的输入流将其所有操作委托给该通道。如果通道处于非阻塞模式,则输入流的读取操作将抛出 IllegalBlockingModeException 异常。

在异常情况下,底层连接可能会被远程主机或网络软件中断(例如,TCP 连接中的连接重置)。当网络软件检测到断开的连接时,返回的输入流将适用以下内容:

  • 网络软件可能会丢弃套接字缓冲的字节。可以使用 read 方法读取网络软件未丢弃的字节。

  • 如果套接字上没有缓冲的字节,或者所有缓冲的字节都已被 read 方法使用,则对 read 的所有后续调用都将抛出 IOException 异常。

  • 如果套接字上没有缓冲的字节,并且套接字尚未使用 close 方法关闭,则 available 方法将返回 0。

关闭返回的 InputStream 将关闭关联的套接字。

声明

以下是 java.net.Socket.getInputStream() 方法的声明。

public InputStream getInputStream() throws IOException

参数

返回值

用于从此套接字读取字节的输入流。

异常

IOException − 如果在创建输入流时发生 I/O 错误,套接字已关闭,套接字未连接,或者套接字输入已使用 shutdownInput() 方法关闭。

示例

以下示例演示了如何使用 Java Socket getInputStream() 方法从使用套接字的服务器获取输入流。第一步,我们创建了一个 GreetingClient 类,其中我们使用命令行参数读取服务器名称和端口。使用提供的服务器名称和端口作为客户端创建一个 Socket 实例。使用 client.getInputStream(),我们读取服务器发送的内容。然后将 InputStream 实例转换为 DataInputStream,然后使用 DataInputStream.readUTF() 方法打印。

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

package com.tutorialspoint;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

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 类在命令行参数指定的端口号上监听客户端:

package com.tutorialspoint;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketTimeoutException;

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...
Just connected to /127.0.0.1:49462
Hello from /127.0.0.1:49462
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-socket.htm
广告