“核心技术Ⅱ:网络”的版本间差异
跳到导航
跳到搜索
无编辑摘要 |
无编辑摘要 |
||
第1行: | 第1行: | ||
[[category:JavaCore]] | [[category:JavaCore]] | ||
== | == 实现服务端 == | ||
=== | === 手动实现:telnet === | ||
=== | telnet 是一种用于网络编程的调试工具,可以在命令shell中输入telnet来启动它。 | ||
* 在Windows中,需要激活telnet:“控制面板”->“程序”->“打开/关闭Windows特性”->“Telnet客户端”。 | |||
如: | |||
<syntaxhighlight lang="bash"> | |||
telnet time-a.nist.gov 13 | |||
# 用time-a.nist.gov在端口13上建立telnet会话 | |||
</syntaxhighlight> | |||
[[File:连接到服务器端口的客户端.png|600px]] | |||
=== Java实现:socket === | |||
<syntaxhighlight lang="java"> | |||
import java.io.*; | |||
import java.net.*; | |||
import java.util.*; | |||
public class SocketTest lS { | |||
public static void main(String[) args) throwsIOException | |||
{ | |||
try(Socket s = new Socket(”time-a.nist.gov”,13); | |||
Scanner in = new Scanner(s.getInputStream(),”UTF-8'’)) | |||
{ | |||
while (in.hasNextline()) | |||
{ | |||
String line = in.nextline(); | |||
System.out.println(line); | |||
} | |||
} | |||
} | |||
</syntaxhighlight> | |||
如果连接失败,它将抛出一个UnknownHostException异常;如果存在其他问题,它将抛出一个IOException异常。<br/> | |||
(<big>[[网络基础]]</big>) | |||
==== 相关方法 ==== | |||
jva.net.Socket 1.0 | |||
* Socket(String host, int port) | |||
*: 构建一个套接字,用来连接给定的主机和端口。 | |||
* InputStream getlnputStream() | |||
* OutputStream getOutputStream() | |||
*: 获取可以从套接字中读取数据的流,以及可以向套接字写出数据的流。 | |||
=== 套接字超时 === | === 套接字超时 === | ||
从套接字读取信息时,在有数据可供访问之前,读操作将会被阻塞。对于不同的应用,应该确定合理的超时值。 | |||
# 调用“setSoTimeout”方法设置超时值(单位:毫秒): | |||
#: <syntaxhighlight lang="java"> | |||
Socket s = new Socket(. . .); | |||
s.setSoTimeout(lOOOO); | |||
// time out after 10 seconds | |||
</syntaxhighlight> | |||
# 捕获“SocketTimeoutException”异常: | |||
#: 如果已经为套接字设置了超时值,并且之后的读操作和写操作在没有完成之前就超过了时间限制,那么这些操作就会抛出SocketTimeoutException异常; | |||
#: <syntaxhighlight lang="java"> | |||
try | |||
{ | |||
InputStream in = s.getlnputStream(); //read from in | |||
. . . | |||
} | |||
catch(InterruptedIOException exception) | |||
{ | |||
. . . | |||
} | |||
</syntaxhighlight> | |||
# 使用可以超时的无连接套接字: | |||
#* “Socket s = new Socket(String host, int port);”会一直无限期地阻塞下去,直到建立了到达主机的初始连接为止; | |||
#: <syntaxhighlight lang="java"> | |||
Socket s = new Socket(); | |||
s.connect(new InetSocketAddress(host, port), timeout); | |||
</syntaxhighlight> | |||
==== 相关方法 ==== | |||
jva.net.Socket 1.0 | |||
* Socket() 1.1 | |||
*: 创建一个还未被连接的套接字。 | |||
* void connect(SocketAddress address) 1.4 | |||
*: 将该套接字连接到给定的地址。 | |||
* void connect(SocketAddress address, int timeoutlnMi11iseconds) 1.4 | |||
*: 将套接字连接到给定的地址。如果在给定的时间内没有响应,则返回。 | |||
* void setSoTimeout(int timeoutlnMilliseconds) 1.1 | |||
*: 设置该套接字上读请求的阻塞时间。如果超出给定时间,则抛出一个InterruptedIOException异常。 | |||
* boolean isConnected() 1.4 | |||
*: 如果该套接字已被连接,则返回true。 | |||
* boolean isClosed() 1.4 | |||
*: 如果套接宇已经被关闭,则返回true | |||
=== 因特网地址 === | === 因特网地址 === | ||
如果需要在主机名和因特网地址之间进行转换,那么就可以使用“InetAddress”类: | |||
* 只要主机操作系统支持1Pv6格式的因特网地址,java.net包也将支持它; | |||
# 静态的“getByName”方法可以返回代表某个主机的InetAddress对象: | |||
#: 然后,可以使用“getAddress”方法来访问这些字节; | |||
#: <syntaxhighlight lang="java"> | |||
InetAddress address = InetAddress.getByName("time-a.nist.gov"); | |||
byte[] addressButes = address.getAddress(); | |||
</syntaxhighlight> | |||
# 调用“getAllByName”方法来获得所有主机: | |||
#:(一些访问量较大的主机名通常会对应于多个因特网地址,以实现负载均衡) | |||
#: <syntaxhighlight lang="java"> | |||
InetAddress[] addresses= InetAddress.getA11ByName(host) ; | |||
</syntaxhighlight> | |||
# 使用静态的“getlocalHost”方法来得到本地主机的地址: | |||
#: <syntaxhighlight lang="java"> | |||
InetAddress address = InetAddress.getLocalHost(); | |||
</syntaxhighlight> | |||
==== 相关方法 ==== | |||
jva.net.InetAddress 1.0 | |||
* static InetAddress getByName( String host) | |||
* static InetAddress[] getAllByName(String host) | |||
*: 为给定的主机名创建一个InetAddress对象,或者一个包含了该主机名所对应的所有因特网地址的数组。 | |||
* static InetAddress getlocalHost() | |||
*: 为本地主机创建一个InetAddress对象。 | |||
* byte[] getAddress() | |||
*: 返回一个包含数字型地址的字节数组。 | |||
* String getHostAddress() | |||
*: 返回一个由十进制数组成的字符串,各数字间用圆点符号隔开,例如,“129.6.15.28”。 | |||
* String getHostName() | |||
*: 返回主机名。 | |||
== 实现服务器 == | == 实现服务器 == |
2020年12月3日 (四) 07:11的版本
实现服务端
手动实现:telnet
telnet 是一种用于网络编程的调试工具,可以在命令shell中输入telnet来启动它。
- 在Windows中,需要激活telnet:“控制面板”->“程序”->“打开/关闭Windows特性”->“Telnet客户端”。
如:
telnet time-a.nist.gov 13
# 用time-a.nist.gov在端口13上建立telnet会话
Java实现:socket
import java.io.*;
import java.net.*;
import java.util.*;
public class SocketTest lS {
public static void main(String[) args) throwsIOException
{
try(Socket s = new Socket(”time-a.nist.gov”,13);
Scanner in = new Scanner(s.getInputStream(),”UTF-8'’))
{
while (in.hasNextline())
{
String line = in.nextline();
System.out.println(line);
}
}
}
如果连接失败,它将抛出一个UnknownHostException异常;如果存在其他问题,它将抛出一个IOException异常。
(网络基础)
相关方法
jva.net.Socket 1.0
- Socket(String host, int port)
- 构建一个套接字,用来连接给定的主机和端口。
- InputStream getlnputStream()
- OutputStream getOutputStream()
- 获取可以从套接字中读取数据的流,以及可以向套接字写出数据的流。
套接字超时
从套接字读取信息时,在有数据可供访问之前,读操作将会被阻塞。对于不同的应用,应该确定合理的超时值。
- 调用“setSoTimeout”方法设置超时值(单位:毫秒):
Socket s = new Socket(. . .); s.setSoTimeout(lOOOO); // time out after 10 seconds
- 捕获“SocketTimeoutException”异常:
- 如果已经为套接字设置了超时值,并且之后的读操作和写操作在没有完成之前就超过了时间限制,那么这些操作就会抛出SocketTimeoutException异常;
try { InputStream in = s.getlnputStream(); //read from in . . . } catch(InterruptedIOException exception) { . . . }
- 使用可以超时的无连接套接字:
- “Socket s = new Socket(String host, int port);”会一直无限期地阻塞下去,直到建立了到达主机的初始连接为止;
Socket s = new Socket(); s.connect(new InetSocketAddress(host, port), timeout);
相关方法
jva.net.Socket 1.0
- Socket() 1.1
- 创建一个还未被连接的套接字。
- void connect(SocketAddress address) 1.4
- 将该套接字连接到给定的地址。
- void connect(SocketAddress address, int timeoutlnMi11iseconds) 1.4
- 将套接字连接到给定的地址。如果在给定的时间内没有响应,则返回。
- void setSoTimeout(int timeoutlnMilliseconds) 1.1
- 设置该套接字上读请求的阻塞时间。如果超出给定时间,则抛出一个InterruptedIOException异常。
- boolean isConnected() 1.4
- 如果该套接字已被连接,则返回true。
- boolean isClosed() 1.4
- 如果套接宇已经被关闭,则返回true
因特网地址
如果需要在主机名和因特网地址之间进行转换,那么就可以使用“InetAddress”类:
- 只要主机操作系统支持1Pv6格式的因特网地址,java.net包也将支持它;
- 静态的“getByName”方法可以返回代表某个主机的InetAddress对象:
- 然后,可以使用“getAddress”方法来访问这些字节;
InetAddress address = InetAddress.getByName("time-a.nist.gov"); byte[] addressButes = address.getAddress();
- 调用“getAllByName”方法来获得所有主机:
- (一些访问量较大的主机名通常会对应于多个因特网地址,以实现负载均衡)
InetAddress[] addresses= InetAddress.getA11ByName(host) ;
- 使用静态的“getlocalHost”方法来得到本地主机的地址:
InetAddress address = InetAddress.getLocalHost();
相关方法
jva.net.InetAddress 1.0
- static InetAddress getByName( String host)
- static InetAddress[] getAllByName(String host)
- 为给定的主机名创建一个InetAddress对象,或者一个包含了该主机名所对应的所有因特网地址的数组。
- static InetAddress getlocalHost()
- 为本地主机创建一个InetAddress对象。
- byte[] getAddress()
- 返回一个包含数字型地址的字节数组。
- String getHostAddress()
- 返回一个由十进制数组成的字符串,各数字间用圆点符号隔开,例如,“129.6.15.28”。
- String getHostName()
- 返回主机名。