标签:
1 TCP Sockets基础
Sockets是一个编程抽象概念,它是网络上与另一个应用程序通信连接的句柄。Sockets编程将用户代码与TCP/IP协议堆栈的底层实现隔离开,允许用户灵活地实现自己的编程。
基于TCP协议的TCP Sockets需要四个方面的数据:
(1) 本地系统的IP地址。
(2) 本地应用程序正在使用的TCP端口号。
(3) 通信的远程系统的IP地址。
(4) 通信的远程系统响应的TCP端口号。
TCP Sockets的应用模型通常是客户/服务器模型,一个服务器在一个特定端口等待远程计算机请求资源,给予响应。客户程序绑定到这个端口,建立一个可靠连接来用于通信。
面向连接的操作使用TCP协议,在这个模式下的Socket必须在发送数据之前与目的地的Socket取得一个连接。连接建立后,Socket就可以使用一个流接口:打开—读—写—关闭。所有发送
信息都会在另一端以同样的顺序被接收。面向连接的操作比无连接的操作效率低,但是数据的安全性更高。由于Socket使用是双方的,所以在客户端和服务器端的使用稍有不同。
(1) 客户端请求Socket的步骤如下:
① 建立客户端Socket连接;
② 得到Socket的读和写的流;
③ 利用流;
④ 关闭流;
⑤ 关闭Socket。
使用一个服务器端的Socket请求比使用一个客户端Socket请求要麻烦一些。服务器并不是主动地建立连接。相反地,服务器被动地监听客户端的连接请示,然后给它们服务。
(2) 服务器端Socket要完成以下的基本的步骤:
① 建立一个服务器Socket并开始监听;
② 使用accept()方法取得新的连接;
③ 建立输入和输出流;
④ 在已有的协议上产生会话;
⑤ 关闭客户端流和Socket;
⑥ 回到②或者转到⑦;
⑦ 关闭服务器Socket。
1.1 InetAddress类
InetAddress对象表示一个Internet主机地址。这个主机地址可以通过名字和IP地址来标识。名字即主机名,例如本机名字为snowing,为字符串类型;IP地址为192.100.100.43,为四字节的数字,书写形式为a.b.c.d。InetAddress类的几个常用方法如下:
public static InetAddress getByName(String host) throws UnknownHostException 通过名字可以得到主机的IP地址。
public String getHostAddress() 返回IP地址的字符串格式。
public String getHostName() 返回IP地址的主机名。
public static InetAddress getLocalHost() throws UnknownHostException 以InetAddress类封装的格式返回本机地址。
public String toString() 转换成字符串格式。
例:InetAddress对象应用的测试。获取本机地址并转换成字符串输出,输出本地主机名和IP地址。
1 import java.net.*; 2 public class FindHost 3 { 4 public static void main(String[] args) 5 { 6 try 7 { 8 InetAddress h = InetAddress.getLocalHost(); 9 System.out.println("toString():" + h.toString()); 10 System.out.println("getHostName():" +h.getHostName()); 11 System.out.println("getHostAddress():"+h.getHostAddress()); 12 } 13 catch(UnknownHostException e) 14 { 15 System.out.println(e.getMessage()); 16 } 17 } 18 }
1.2 Socket类
Socket是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API),通过Socket,我们才能使用TCP/IP协议。Socket的出现只是使得程序员更方便地使用TCP/IP协议栈而
已,是对TCP/IP协议的抽象,从而形成了我们知道的一些最基本的函数接口。
Socket类用来实现客户端的Socket。常用的构造方法有以下三种:
public Socket() 创建一个无连接的Socket。
public Socket(InetAddress address, int port) 创建流式Socket,将它连接到InetdAdress类指明的主机和port端口上。
public Socket(String host, int port) 创建流式Socket并将它连接到特定host的特定port端口上。
1.2.1 建立客户端程序,访问网址http://www.xjtu.edu.cn,返回网址的首页写入文件xjtu.html。
1. 程序建立的步骤
(1) 建立到 http://www.xjtu.edu.cn且端口为80的Socket连接。
Socket clientSocket = new Socket("www.xjtu.edu.cn", 80);
(2) 初始化字节流。连接建立后的数据传输通过数据输入输出流实现,写文件又通过文件输入输出流来实现。各种流对象的初始化如下:
DataOutputStream outbound = new DataOutputStream(clientSocket.getOutputStream());
DataInputStream inbound = new DataInputStream(clientSocket.getInputStream());
InputStreamReader inS = new InputStreamReader(inbound);
File f = new File("xjtu.html");
FileOutputStream fOut = new FileOutputStream(f);
PrintStream p = new PrintStream(fOut);
(3) 发送请求。
outbound.writeBytes("GET / HTTP/1.0\r\n\r\n");
(4) 返回数据后,循环写入文件。
int c;
while((c = inS.read()) != -1)
p.print((char)c);
(5) 关闭流。
inS.close();
outbound.close();
inbound.close();
clientSocket.close();
标签:
原文地址:http://www.cnblogs.com/feitiannengdou/p/5478534.html