java.net.Socket类方法代表客户端和服务器都用来互相通信的套接字。客户端通过实例化而拥有一个Socket对象,然而服务器从accept()方法的返回值获得一个Socket对象。
Socket类有5个客户端用来连接到服务器的构造函数:
方法描述public Socket(String host, int port) throws UnknownHostException, IOException 这个方法努力连接到特定端口指定的服务器。如果这个构造函数不抛出一个异常,连接就是成功的并且客户端将会连接到服务器。
public Socket(InetAddress host, int port) throws IOException 这个方法和之前的构造函数相同,除了主机由一个InetAddress对象表示。
public Socket(String host, int port, InetAddress localAddress, int localPort) throws IOException 连接到指定的主机和端口,在指定地址和端口上的本地主机创建一个套接字。
public Socket(InetAddress host, int port, InetAddress localAddress, int localPort) throws IOException 这个方法和前一个构造函数相同,除了主机由一个InetAddress对象而不是一个String表示。
public Socket() 创建一个不连接的套接字。使用connect()方法来连接这个套接字到服务器。
当套接字构造函数返回时,它并不简单地实例化一个Socket对象,它实际上试图连接到指定的服务器和端口。
在Socket类中一些有趣的方法列举在此。注意客户端和服务器都有一个Socket对象,所以这些方法都能被客户端或者服务器调用。
方法描述public void connect(SocketAddress host, int timeout) throws IOException 这个方法将套接字连接到特定的主机。这个方法仅当使用无参数的构造函数实例化Socket时才需要。
public InetAddress getInetAddress() 这个方法返回其套接字连接的其他电脑的地址。
public int getPort() 返回远端的机器上套接字绑定的端口。
public int getLocalPort() 返回本地机器上套接字绑定的端口。
public SocketAddress getRemoteSocketAddress() 返回远程套接字的地址。
public InputStream getInputStream() throws IOException 返回套接字的输入流。输入流连接到远程套接字的输出流。
public OutputStream getOutputStream() throws IOException 返回套接字的输出流。输出流连接到远程套接字的输入流。
public void close() throws IOException 关闭套接字,这使得这个Socket对象不再能够连接到任何服务器。
3、InetAddress类方法
这个类表示一个网络协议(IP)的地址。这些是在做套接字编程时将会用到的有用的方法:
方法描述static InetAddress getByAddress(byte[] addr) 考虑到原始的IP地址,返回一个InetAddress对象。
static InetAddress getByAddress(String host, byte[] addr) 基于提供的主机名和IP地址创建一个InetAddress。
static InetAddress getByName(String host) 考虑到主机名,决定一个主机的IP地址。
String getHostAddress() 用文本表示返回的IP地址字符串。
String getHostName() 获得这个IP地址的主机名。
static InetAddress InetAddress getLocalHost() 返回本地主机。
String toString() 将IP地址转换为字符串。
4、套接字客户端示例
下列的GreetingClient是一个利用一个套接字连接到服务器的客户端程序,它发送一个问候,并等待响应。
// File Name GreetingClient.java import java.net.*; import java.io.*; 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(); } } }