Java 教程

Java 控制語句

面向物件程式設計

Java 內建類

Java 檔案處理

Java 錯誤與異常

Java 多執行緒

Java 同步

Java 網路程式設計

Java 集合

Java 介面

Java 資料結構

Java 集合演算法

高階 Java

Java 雜項

Java API 與框架

Java 類參考

Java 有用資源

Java - Socket shutdownInput() 方法



描述

**Java Socket shutdownInput()** 方法將此套接字的輸入流置於**流結束**狀態。傳送到套接字輸入流的任何資料都會被確認然後丟棄。在呼叫 shutdownInput() 方法後進行任何讀取操作,流的 available() 方法將返回 0,其讀取方法將返回 -1 以標記流的結尾。

宣告

以下是 **java.net.Socket.shutdownInput()** 方法的宣告。

public void shutdownInput() throws IOException

引數

返回值

異常

**IOException** − 如果在關閉此套接字時發生 I/O 錯誤。

示例

以下示例演示瞭如何使用 Java Socket shutdownInput() 方法將輸入流置於流結束狀態,該方法來自使用套接字的伺服器。第一步,我們建立了一個 GreetingClient 類,我們使用命令列引數讀取伺服器名和埠。使用提供的伺服器名和埠,建立一個作為客戶端的 Socket 例項。使用 client.getInputStream(),我們讀取伺服器傳送的內容。然後將 InputStream 例項強制轉換為 DataInputStream,然後使用 DataInputStream.readUTF() 方法列印。由於我們在 readUTF() 方法呼叫之前呼叫了 shutdownInput(),因此此程式碼會引發異常,如程式輸出所示。

以下 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();
         client.shutdownInput();
         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();
      }
   }
}

編譯客戶端和伺服器,然後按如下方式啟動伺服器:

Waiting for client on port 6066...
Just connected to /127.0.0.1:60847
Hello from /127.0.0.1:60847
Waiting for client on port 6066...

檢查客戶端程式如下:

輸出

Connecting to localhost on port 6066
Just connected to localhost/127.0.0.1:6066
java.io.EOFException
	at java.base/java.io.DataInputStream.readUnsignedShort(DataInputStream.java:345)
	at java.base/java.io.DataInputStream.readUTF(DataInputStream.java:594)
	at java.base/java.io.DataInputStream.readUTF(DataInputStream.java:569)
	at com.tutorialspoint.GreetingClient.main(GreetingClient.java:28)
java-socket.htm
廣告