在一个Socket中同时包含了远程服务器的IP地址和端口信息,以及客户本地的IP地址和端口信息。此外,从Socket对象中还可以获得输出流和输入流,分别用于向服务器发送数据,以及接受从服务端发来的数据。以下方法用于获取Socket的有关信息。

Socket socket=new Socket();
        socket.getInetAddress();//获得远程服务器的IP地址
        socket.getPort();//获得远程服务器的端口
        socket.getLocalAddress();//获得客户本地的端口
        socket.getInputStream();//获得输入流。如果Socket还没有连接
                                //或者已经关闭,或者已经通过shutdownInput()
                                //方法关闭输入流,那么此方法会抛出IOException
        socket.getOutputStream();//获得输出流如果Socket还没有连接
                                //或者已经关闭,或者已经通过shutdownOutput()
                                //方法关闭输出流,那么此方法会抛出IOException

如下例子用于访问网页v.qq.com/zt/tqzt/2817466.shtml。该网页位于一个主机名(也叫域名)为v.qq.com的远程服务器上,它监听80端口。在HTTPClient类中,先建立了一个连接到该HTTP服务器的Socket对象,然后发送符合HTTP协议的请求,接着接受从HTTP服务器发回的响应结果。:HTTP协议简介点这里

package 获取Socket的信息;

import java.io.*;
import java.net.Socket;
import java.util.Scanner;

/**
 * HTTPClient类用于访问网页www.baidu.com。现在已经使用安全的http协议即HTTPS了,
 * 该网页位于一个主机名(也叫域名)为“www.baidu.com”的远程HTTP服务器上
 * HTTPS监听443端口,HTTP监听80端口,在HTTPClient类中,先建立了一个
 * 连接到该服务器的Socket对象,然后发送符合HTTP协的请求,接着接受从HTTP服务器上
 * 发回的响应结果。
 */
public class HTTPClient {
    String host="www.baidu.com";
    //String host="www.javathinker.net";
    int port=80;
    Socket socket;

    public  void crteateSocket() throws IOException {
        socket=new Socket("v.qq.com",80);
    }

    public void communicate() {
        //StringBuffer sb=new StringBuffer("GET "+"/zt/tqzt/2817466.shtml"+" HTTP/1.1\r\n");
        StringBuffer sb=new StringBuffer("GET http://v.qq.com/ HTTP/1.1\r\n");

        sb.append("Host:v.qq.com\r\n");
        sb.append("Connection: keep-alive\r\n");
        sb.append("Upgrade-Insecure-Requests: 1\r\n\r\n");

        try {
            //发出HTTP请求
            OutputStream socketOut=socket.getOutputStream();
            socketOut.write(sb.toString().getBytes());
            socket.shutdownOutput();//关闭输出流

            //接受响应结果
            InputStream socketInput=socket.getInputStream();
            //把接收到的字节写到ByteArrayOutputStream中,它具有一个容量自动增长的缓冲区
            ByteArrayOutputStream buffer=new ByteArrayOutputStream();

            /*byte[] buff=new byte[1024];
            int len=1;
            while ((len=socketInput.read(buff))!=-1){//如果返回-1,则表示读到了输入流到了结尾
                buffer.write(buff,0,len);
            }
            System.out.println(new String(buffer.toByteArray()));*/

            /**
             * 值得注意的是,如果接受的网页数据量很大,先把这些数据全部保存在
             * ByteArrayOutputStream的缓存中不是明智的做法,因为这些数据
             * 会占用大量的内存。更有效的方法是利用scanner来读取网页数据:
             */
            Scanner scannerSocket=new Scanner(socket.getInputStream());
            String data;
            while (scannerSocket.hasNextLine()){
                data=scannerSocket.nextLine();
                System.out.println(data);
            }

            /*BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
            String data;
            while ((data=br.readLine())!=null){
                System.out.println(data);
            }*/
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            /*关闭socket,当客户与服务器通信结束,应该及时关闭socket
            以释放Socket所占用的各种资源。Socket的close()方法负责关闭Socket
            当一个socket对象被关闭,就不能再通过他的输入流和输出流进行i/o操作
            ,否则会抛出IOException,为了确保关闭Socket的操作总是被执行,强烈
            建议把这个操作放在finally代码块中。
             */
            if (socket!=null){
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public static void main(String[] args) throws IOException {
        HTTPClient cient=new HTTPClient();
        cient.crteateSocket();
        cient.communicate();
    }
}