1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > java socket 高级编程_Java高级编程-网络编程详细介绍 (一)

java socket 高级编程_Java高级编程-网络编程详细介绍 (一)

时间:2019-07-09 19:08:35

相关推荐

java socket 高级编程_Java高级编程-网络编程详细介绍 (一)

包中的类和接口提供了可用于低层和高层网络编程的

API。低层 API 可以让你直接访问网络协议,但是为此你不得不使用低层的

TCP 套接字和 UDP 数据包。高层的 API (如 URL, URLConnection 和

httpURLConnection 等类)

可以使你更快的开发网络应用,却不需要写很多代码。

概览 HTTP

超文本传输协议 (Hypertext Transfer Protocol, HTTP)

是一个“请求-回应”的应用协议。这个协议支持一套固定的方法如

GET、POST、PUT、DELETE 等。一般用 GET

方法向服务器请求资源。这里有两个 GET 请求的例子:

GET / HTTP/1.1

GET /names.html HTTP/1.1

另外,你可以使用 GET 和 POST

方法向服务器发送数据,它们向服务器发送数据的方式是不同的:

GET 方法:输入的数据将作为

URL 的一部分发送

POST 方法:输入数据作为一个独立的实体发送

考虑一下下面的 HTML 表单:

< form

action="/servlets/getMarks method="GET"

>

Student#:

< input type=text name=number size=30 >

< input type=submit name=GetMarks value=GetMarks >

< /form >

这个表单会提交到

/servlet/getMarks 由 Servlet

处理。该表单使用了 GET 方法来传输信息。如果用户输入一个学号——比如

556677——并点击 GetMarks 按钮,表单数据就会作为 URL 的一部分传送到

Servlet 中。经过编码之后的 URL

就是:/servlets/getMarks?number=556677。

在使用

POST 方法的情况下,传输数据时不会将数据作为 URL

的一部分;它们会作为一个独立的实体来传输。因此,POST

方法更安全,你也可以用这个方法传输更多的数据。而且用 POST

传输的数据不一定要是文本,用 GET

方法传输的却一定要是文本。

消息息格式

请求消息指定了方法名称 (GET 或者

POST)、URL、协议版本号、头部消息和可选消息。头部消息也许会包含请求信息和客户端信息,如接受的内容类型、浏览器名称以及验证数据。返回消息指定了协议版本、响应代码和原因。不管执行是否成功,响应代码和原因都会报告。一些响应代码如下:

200 OK: Request succeeded.

The requested resource can be found later in this message.

301 Moved Permanently: Requested resource has moved. New location

is specified later in this message.

400 Bad Request: Request message is not understood by the

server.

404 Not Found: Requested document is not found on this

server.

关于 HTTP 和所有返回代码的信息可以在 HTTP 1.1

规范 RFC2616 中找到。

下面是一个请求消息由浏览器到服务器的例子。这里请求的

URL 是 :

GET / HTTP/1.1

Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg,

application/vnd.ms-powerpoint,

application/vnd.ms-excel,

application/msword, */*

Accept-Language: en-ca

Accept-Encoding: gzip, deflate

User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows 98; YComp

5.0.0.0)

Host:

Connection: Keep-Alive

Cookie: SUN_ID=24.80.19.177:28346100732290;

SunONEUserId=24.80.19.177:86521021960770然后这里是服务器对这个请求的回复消息:

HTTP/1.1 200 OK

Server: Netscape-Enterprise/6.0

Date: Mon, 14 Oct 2002 15:18:04 GMT

Content-type: text/html

Connection: close

概览 包的高层

API

包中含有高层 API。它们实现了一些最常用的基于 TCP

的协议,如 HTTP 和 FTP 等。其中两个主要的类是 URL 和

URLConnection。另一个有用的类是 HttpURLConnection,它是

URLConnection 的子类,支持 HTTP 的特性。

URL (Uniform Resource Locator,统一资源定位器) 是一个描述

Internet 中文档 (或者其它常见的资源) 位置的地址。URL

的样子就像这样:

protocol://machineName:port/resource

注意 URL 类不是基于 HTTP 的,这一点非常重要。它支持

FTP、HTTPS 和 FILE 协议。所以,对于 URL 类来说,下面所有 URL

都是有效的。

http://localhost:8080/myApplication

/index.html

ftp://

ftp://

https://www.

file:///C:/j2sdk1.4/docs/api/index.html

你在浏览器里输入一个 URL 的时候,浏览器产生一个 HTTP GET

(或者 POST) 命令寻找 (或者查询) URL

请求的资源。如果没有指定要查询的的资源,被查询的就会是默认文档

(通常是 index.html)。

读取 URL 的内容

让我们以一个简单的应用程序开始,它将会直接从 URL

读取内容。不妨先尝试一下使用低层的套接字来读取,请看示例代码

1。在这个例子中,用户在命令行输入资源的 URL,然后在 80 端口 (默认的

HTTP 服务器端口号)

打开一个套接字并建立相应的输入输出流。输出流用来向 HTTP 服务器发送

HTTP 命令 (比如 GET),输入流则用来读取 HTTP

服务器的返馈。注意,在这个例子中,服务器回应的头信息也会被读入

(这是 URL 内容之外的东西)。

示例代码 1: ReadURL1.java

import .*;

import java.io.*;

public class ReadURL1 {

public static void main(String argv[]) throws

Exception {

final int

HTTP_PORT = 80;

if(argv.length

!= 1)

{System.out.println("Usage: java ReadURL1

");System.exit(0);

}Socket

socket = new Socket(argv[0],

HTTP_PORT);BufferedWriter out = new BufferedWriter(new

OutputStreamWriter(socket.getOutputStream()));BufferedReader in = new BufferedReader(new

InputStreamReader(socket.getInputStream()));out.write("GET /index.html

HTTP/1.0\n\n");out.flush();String

line;StringBuffer

sb = new

StringBuffer();while((line

= in.readLine()) != null)

{sb.append(line);}

out.close();

in.close();

System.out.println(sb.toString());

}

}// end code

你运行这个例子的时候请注意,URL 必须是一个域名如

或者 IP 地址。不能加上 http:// 作为 URL

的一部分。如果你要解决这个问题,你就得解析输入的内容并找出它使用什么协议,端口号和要请求什么资源。你也可以使用

URL 类,它提供了一些非常有用的方法,如

getProtocal、getPort、getHost 和 getFile 等。

使用 URL 类

要从 URL 读取内容,可以用 URL 类非常容易的实现,就像示例代码

2 所展示的那样。这使得直接从 URL

读取内容变得简单。用这种方法读取的内容不包含服务器回应的头信息,所以不需要你去解析它们了。运行这个例子时要输入有效的

URL ,就像 protocol://domainName:port/resource 这样。URL

类会解析输入的 URL 并处理低层的麻烦的工作。

示例代码 2:ReadURL2.java

import .*;

import java.io.*;

public class ReadURL2 {

public static void main(String argv[]) throws Exception {

if(argv.length != 1) {

System.out.println("Usage: java ReadURL2 ");

System.exit(0);

}

URL url = new URL(argv[0]);

BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));

String line;

StringBuffer sb = new StringBuffer();

while ((line = in.readLine()) != null) {

sb.append(line);

}

in.close();

System.out.println(sb.toString());

}

}

在你运行 ReadURL2 的时候,你会看到你输入的 URL

所请求的文档内容命令窗口中显示出来。

如果你想做除了读取之外的其它事情,请使用 openConnection

来建立到 URL 的连接。这个方法返回一个 URLConnection

对象,你可以用这个对象来与 URL 通信,如读、写、查询等。一但

openConnetion 方法创建了连接,你就可以使用

getContentType、getContentLength、getContentEncoding

等非常有用的方法了。

使用 URLConnection 类

我们现在要创建一个从

获取股票信息的应用程序来演示如何使用

URLConnection。为了获取特别的股票信息,用户输入股票标号 (比如

SUNW、IBM 或者 MOT),由应用程序从 Yahoo Quote

服务器获取相应的股票信息。应用程序会显示出该股票的名称、价格和日期。

有两种方法 (可以用在这个应用程序中的) 用来从 Yahoo Quote

服务器获取股票信息。

你可以看到第一种方法的结果是一行文本,解析时会比第二种容易许多,也快许多,因为第二种方法的结果含有大量的文字,包括许多广告和格式化信息。所以我用第一种方法实现这个关于股票的应用程序,它由两个类组成:Stock.java

和 StockReader.java。

Stock.java 类

这个类将从 Yahoo Quote 服务器获得的字符串解析成字段

(例如股票名称、价格和日期)。示例代码 3

中展示了一个实现的例子。示例代码 4 中的 StockReader

类会用到这个工具类。

示例代码 3:Stock.java

public class Stock {

private static String name, time, price;

// Given a quote from the server,

// retrieve the name, price, and date of the

stock

public static void parse(String data) {

int index =

data.indexOf('"');

name =

data.substring(++index,(index = data.indexOf('"', index)));

index +=3;

time = data.substring(index,

(index = data.indexOf('-', index))-1);

index

+=5;price = data.substring(index,

(index = data.indexOf('>', index)));

}// Get the name of the stock

frompublic static String getName(String record)

{

parse(record);

return(name);

}// Get the price of the stock from

public static String getPrice(String record)

{

parse(record);

return(price);

}// Get the date of the stock

public static String getDate(String record)

{

parse(record);

return

time;

}

}

StockReader.java 类

这个类的任务是连接到 Yahoo Quote

服务器,并从服务器上获取股票行情。它使用 Stock

类解析从服务器返回的字符串。示例代码 4 是它的一个实现。

示例代码 4:StockReader.java

import java.io.*;

import .*;

public class StockReader {

public static void main(String argv[]) throws

Exception {

String quoteFormat =

"&f=slc1wop";

if (argv.length != 1) {

System.err.println("Usage:java StockReader ");

System.exit(1);

}

URL url = new URL("/d/quotes.csv?");

URLConnection connection =

url.openConnection();

connection.setDoOutput(true);

PrintWriter out = new

PrintWriter(connection.getOutputStream());

out.println("s=" + argv[0] +

quoteFormat);

out.close();

BufferedReader in = new

BufferedReader(

new

InputStreamReader(connection.getInputStream()));

String line =

in.readLine();

/* DEBUG

while ((line = in.readLine())

!= null) {

System.out.println("Got:

"+ line);

}

*/

in.close();

System.out.println("Name: "+

Stock.getName(line));

System.out.println("Price: "+

Stock.getPrice(line));

System.out.println("Date: "+

Stock.getDate(line));

}

}

将数据提交到网页服务器

在上面的例子中,数据是作为 URL

的一部分被送到服务器的,使用的 GET 方法。现在来看一个使用 POST

方法发送数据的例子。这个例子中,/cgi-bin

中的 CGI 脚本 (名为 .cgi) 需要 name 和 email 值。如果用户提交 Sally

McDonald 作为 name 值,smc@ 作为 email 值,CGI

脚本会获取输入并对消息进行解析、解码,再将提交的内容返回给客户端。这个

CGI 脚本做事情并不多,但我们要用它来演示如何向服务器提交数据。

还有一点非常重要——请注意使用 POST 方法时,消息内容的类型是

application/x-www-form-urlencoded,这种类型会:

指定常规数据编码

将空格转换为加号 (+)

将非文本内容转换成十六进制数后接百分号 (%) 的形式

在每个 name=value 对之间放置 & 符号

根据这个编码规则,消息 (name=Sally McDonald and

email=smc@) 在发送给 CGI 脚本之前必须被编码成:

name=Sally+McDonald&email=smc@

CGI

脚本收到这个已编码的消息后会对它进行解码。不过非常幸运,你不必为手工进行编码操作。你可以使用

.URLEncoder

类来对消息进行编码,就像下面的例子中那样。相应地你可以使用

.URLDecoder 来对消息进行解码。

示例代码 5 中是这个例子的实现 (使用 HttpURLConnection

类),它展示了如何使用 POST 方法向服务器发送数据。你会看到:

为 CGI 脚本打开连接和 I/O 流

设置请求方法为 POST

使用 URLEncoder.encode 方法对消息进行编码 (URLDecoder.decode

方法可以用于解码)

向 CGI 脚本发送已经编码的消息

接收服务器返回的消息并在控制台打印出来

示例代码 5:PostExample.java

import java.io.*;

import .*;

public class PostExample {

public static void main(String[] argv) throws Exception {

URL url = new URL("/cgi-bin/names.cgi");

HttpURLConnection connection = (HttpURLConnection) url.openConnection();

connection.setRequestMethod("POST");

connection.setDoOutput(true);

PrintWriter out = new PrintWriter(connection.getOutputStream());// encode the messageString name = "name="+URLEncoder.encode("Qusay Mahmoud", "UTF-8");

String email = "email="+URLEncoder.encode("qmahmoud@", "UTF-8");

// send the encoded messageout.println(name+"&"+email);

out.close();

BufferedReader in= new BufferedReader(new InputStreamReader(connection.getInputStream()));String line;

while ((line = in.readLine()) != null) {

System.out.println(line);

}in.close();

}

}

文章引用自:/art/3737/0824/879705_1.html

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。