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