“核心技术Ⅱ:网络”的版本间差异

来自Wikioe
跳到导航 跳到搜索
无编辑摘要
无编辑摘要
第1行: 第1行:
[[category:JavaCore]]
[[category:JavaCore]]


== 连接到服务器 ==
== 实现服务端 ==
=== 使用telnet ===
=== 手动实现:telnet ===
=== 用Java 连接到服务器 ===
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会话

连接到服务器端口的客户端.png

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()
    获取可以从套接字中读取数据的流,以及可以向套接字写出数据的流。

套接字超时

从套接字读取信息时,在有数据可供访问之前,读操作将会被阻塞。对于不同的应用,应该确定合理的超时值。

  1. 调用“setSoTimeout”方法设置超时值(单位:毫秒):
    Socket s = new Socket(. . .); 
    s.setSoTimeout(lOOOO); 
    // time out after 10 seconds
    
  2. 捕获“SocketTimeoutException”异常:
    如果已经为套接字设置了超时值,并且之后的读操作和写操作在没有完成之前就超过了时间限制,那么这些操作就会抛出SocketTimeoutException异常;
    try
    {
       InputStream in = s.getlnputStream();   //read from in 
       . . .
    }
    catch(InterruptedIOException exception)
    {
       . . .
    }
    
  3. 使用可以超时的无连接套接字:
    • “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包也将支持它;
  1. 静态的“getByName”方法可以返回代表某个主机的InetAddress对象:
    然后,可以使用“getAddress”方法来访问这些字节;
    InetAddress address = InetAddress.getByName("time-a.nist.gov");
    byte[] addressButes = address.getAddress();
    
  2. 调用“getAllByName”方法来获得所有主机:
    (一些访问量较大的主机名通常会对应于多个因特网地址,以实现负载均衡)
    InetAddress[] addresses= InetAddress.getA11ByName(host) ;
    
  3. 使用静态的“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()
    返回主机名。

实现服务器

服务器套接字

为多个客户端服务

半关闭

可中断套接字

获取Web 数

URL 和URI

使用URLConnection 获取信息

提交表单数据

发送E-mail