3.1 连接服务器
命令格式: telnet 主机 端口号
过程描述:
服务器软件正在远程计算机上连续不断地运行,以等待想要与某端口进行通信的网络信息.当远程计算机上的操作系统接收到一个含有连接到此端口的请求的网络数据包时,它便唤醒正在收听网络信息的服务器,并且建立连接.该连接将保持下去,直到通信的某一方将它中断为止.
3.2 实现服务器
代码步骤:
1. 建立负责监控某端口的服务器套接字
ServerSocket s = new ServerSocket(端口号);
2. 无期限的等待,直到客户机连接到该端口为止
Socket incoming = s.accept();
3. 获得套接字的输入阅读程序和输出写程序
BufferedReader in = new BufferedReader
(new InputStreamReader(incoming.getInputStream()));
PrintWriter out = new PrintWriter
(incoming.getOutputStream(),true /*autoFlush*/);
4. 具体的读写方法
boolean done = true;
while(!done){
String line = in.readLine();
if(line == null) done = true;
else{
out.println(“Echo: ”+line);
if(line.trim().equals(“BYE”))
done = true;
}
}
incoming.close();
out.print(字符串);
5. 其他情况
如果发送二进制数据,将把数据流转换成DataInputStream和DataOutputStreams;
如果发送专门的对象,将改用ObjectInputStream和ObjectOutputStreams;
3.3 发送e-mail
若要发送e-mail,必须建立一个到达端口25(即SMTP端口)的套接字连接.SMTP即简单邮件传输协议,用于描述e-mail邮件的格式.一旦连接都服务器,就可以发送一个邮件标题,后面跟随着邮件信息.
具体的操作步骤:
1. 打开到达邮件服务器的套接字
Socket s = new Socket(主机,25);
PrintWriter out = new PrintWriter(s.getOutputStream());
2. 将下面这些信息发送给打印数据流
HELO sending host
MAIL FROM: <sender email address>
RCPT TO: <recipient email address>
DATA
Mail message
(any number of lines)
…
QUIT
3.4 高级套接字编程
1. 套接字超时
Socket.setSoTimeout(毫秒); 设置一个超时值
2. 半关闭
当客户程序将一个请求发送给服务器时,改服务器必须能够确定该请求何时结束.许多网络协议都是以数据行为单位来运行的.关闭套接字的输出数据流,以此向服务器表示请求的数据的结束,但是仍然使输入数据流保持打开状态,这样就可以读取应答信息.
3. 因特网地址
使用InetAddress类可以主机名与因特网地址之间进行转换;java.net软件包支持IPv6协议的因特网地址;静态方法getByName方法能够返回主机的InetAddress对象;使用getAddress方法来返回IP地址.getLocalHost方法获取本地主机IP地址.
3.5 URL连接
1. URL(通用资源定位符)与URI(通用资源标识符)
获得该资源内容
URL url = new URL(urlString);
InputStream uin = url.openStream();
BufferedReader in = new BufferedReader(new InputStreamReader(uin));
String line;
While((line=in.readLine())!=null){
Process line;
}
URI纯粹是个符号结构,用于指定构成Web资源的字符串的各个不同部分.URL是一种特殊类型的URI,它包含了用于查找某个资源的足够信息.在Java库中,URI类不包含用于访问通用资源标识符设定的资源的任何方法,它的唯一作用是进行分析.URL类则可以打开到达资源的一个字符串.建立URI的规则如下:
[scheme:] schemeSpecificPart [#fragment]
其中,有[scheme:] 绝对URI 否则相对URI, schemeSpecificPart以一个/开头URI是不透明的.采用分层结构的URI的schemeSpecificPart都是如下结构:
[//authority] [path] [?query]
如果基于服务器的URI, authority部分将采用下面的形式:
[user-info@] host [:port]
URI有一些对标识符进行分析处理的方法,查看便知.
2. 使用URLConnection来检索信息
获取URLConnection对象
URLConnection conn = url.openConnection();
设置任何请求的属性
setDoInput,setDoOutput,setIfModifiedSince,setUseCaches,
setAllowUserInteraction,setRequestProperty
连接远程资源
conn.connect();
查询头部信息
getContentType,getContentEncoding,getDate,getExpiration,getLastModified
访问资源数据
getInputStream,getObject
如果访问某个受口令保护的Web页,必须执行下列操作步骤:
以并置的形式输入用户名、冒号和口令
String input = username + “:” + password;
计算产生的字符串的Base64编码
String encoding = base64Encode(input);
调用名字为”Authorization”和值为”Basic”+encoding的setRequestProperty方法
conn. setRequestProperty(”Authorization”, ”Basic”+encoding);
连接远程资源
conn.connect();
查询应答头部信息中第n关键字/值
String key = conn.getHeaderFieldkey(n);
String value = conn.getHeaderField(n);
Map headerFields = conn.getHeaderFields();
3.6 发送表单数据
使用GET方法时,只需要将各个参数附加到URL的结尾处.形式如下:
用+取代所有空格,用%取代所有非数字字符,后随一个两位数的十六进制数.
使用POST方法时,不是将参数附加给URL,而是获取来自URLConnection的输出数据流,并且将名字/值对写入该输出数据流.但仍然必须对这些值进行URL编码,并且用字符&将这些值分开.
URLConnection对象首先将一个请求头部发送给服务器.该头部第一行必须是
Content-Type: type
其中type通过是如下类型之一:
text/plain
text/html
application/octet-stream
application/x-www-form-urlencode
内容类型的后面必须跟随下面这行:
Content-Length: length
头部的结束由一个空行来指明.然后,是发送的数据部分.Web服务器将把头部剥离掉,然后将数据部分发送给服务器脚本程序.
3.7 接收来自Web的信息
Java使用applet来检索接收Web的信息.
2007-08-13