在一个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();
}
}