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
廣告