Java 教程

Java 控制語句

面向物件程式設計

Java 內建類

Java 檔案處理

Java 錯誤和異常

Java 多執行緒

Java 同步

Java 網路

Java 集合

Java 介面

Java 資料結構

Java 集合演算法

高階 Java

Java 雜項

Java API 和框架

Java 類參考

Java 有用資源

Java - Socket shutdownOutput() 方法



描述

Java Socket shutdownOutput() 用於停用此套接字的輸出流。對於 TCP 套接字,任何先前寫入的資料將在 TCP 的正常連線終止序列後傳送。如果在套接字上呼叫 shutdownOutput() 後寫入套接字輸出流,則該流將丟擲 IOException。

宣告

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

public void shutdownOutput() throws IOException

引數

返回值

異常

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

示例

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

以下 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());
            server.shutdownOutput();
            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:60982
Hello from /127.0.0.1:60982
java.net.SocketException: Cannot send after socket shutdown: socket write error
	at java.base/java.net.SocketOutputStream.socketWrite0(Native Method)
	at java.base/java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:110)
	at java.base/java.net.SocketOutputStream.write(SocketOutputStream.java:150)
	at java.base/java.io.DataOutputStream.write(DataOutputStream.java:107)
	at java.base/java.io.DataOutputStream.writeUTF(DataOutputStream.java:401)
	at java.base/java.io.DataOutputStream.writeUTF(DataOutputStream.java:323)
	at com.tutorialspoint.GreetingServer.run(GreetingServer.java:31)

按如下方式檢查客戶端程式 -

輸出

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)
	at com.tutorialspoint.GreetingClient.main(GreetingClient.java:28)
java-socket.htm
廣告