一.服务器初试-telnet工具
当我们编写网络程序时,我们应该认识telnet的小工具(unix 和 win 自带)。Telnet协议是TCP/IP协议族中的一员,是Internet远程登陆服务的标准协议和主要方式。它为用户提供了在本地计算机上完成远程主机工作的能力。win自带的telnet要去开启,开启的步骤如下:
注意:第一:打开控制面板,打开程序和功能,看到左边有个“打开或关闭Windows功能 ,打开找到telnet客户端,telnet服务器。把这2项都勾选上,然后确定就可以了第二:作为开发人员,最好关闭防火墙。以免被这个自己的防火墙阻止了一些访问权限。
二.telnet工具的使用
下面我们就用telnet访问服务器,校对下时间。打开cmd界面,请输入:
telnet time-A.timefreq.bldrdoc.gov 13
应该有些延迟,你会看到黑幕中弹出 来自USA的X原子的计量时间:
56853 14-07-15 07:50:43 50 0 0 645.5 UTC(NIST) *
其实,time-A.13timefreq.bldrdoc.gov 是域名,13是端口(port)。返回过来当前日期时间的是端口(13)。远程服务器一直在等待与端口13的网络连接,当其接收到请求,就反馈给客户端。
以下,是我提供的telnet的工具常用命令。
三.Socket实现访问服务器
import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;
import java.util.Scanner;
public class SocketTest
{
public static void main(String[] args)
{
try
{
Socket s = new Socket("time-A.timefreq.bldrdoc.gov",13);
try
{
InputStream inStream = s.getInputStream();
@SuppressWarnings("resource")
Scanner scanner = new Scanner(inStream);
while (scanner.hasNextLine())
{
String line = scanner.nextLine();
System.out.println(line);
}
}
finally
{
s.close();
}
} catch (IOException e)
{
e.printStackTrace();
}
}
}
在上面,我们用Socket来访问time-A.timefreq.bldrdoc.gov,获取时间。其中的关键代码:
InputStream inStream = s.getInputStream();
Scanner scanner = new Scanner(inStream);
第一行代码用来打开套接字没用于是该程序和外部间的通信。一旦套接字打 开,Socket类和getInputStream方法返回一个流对象。然后构造个扫描器进行标准输出。不要看Socket 简单易用,java封装了大量的代码,比如网络连接,数据发送直接的复杂过程…
注意:我们这边讨论都都是关于TCP网络协议,大家都知道UDP比TCP开销要少很多。但是UDP适用于音频流和视频流等传输,他无序传递容易在传输中丢失。
相关资料:
java.net.Socket
Socket(InetAddress address, int port)
创建一个流套接字并将其连接到指定 IP 地址的指定端口号。
返回此套接字的输入流.
java.util.Scanner
Scanner(InputStream source)
构造一个新的 Scanner
,它生成的值是从指定的输入流扫描的。
四.套接字超时
从套接字读取信息,有可能读操作会被阻塞。良好的处理方式:确定合理的超时值。用setSoTimeout方法设置这个超时(单位:毫秒).
Socket s = new Socket(); s.connect(new InetSocketAddress("time-A.timefreq.bldrdoc.gov", 13), 5000);
java.net.Socket
connect(SocketAddress endpoint, int timeout)
将此套接字连接到服务器,并指定一个超时值。
五.因特网地址
因特网地址通常是一串数字表示主机地址。由4个字节构成,IPv6规定16个字节,比如:132.163.1.127.如果主机系统支持IPv6格式,则java.net包也支持它。InetAddress对象的静态方法getByName可以返回其对象。
InetAddress address = InetAddress.getByName(www.baidu.com);
下面演示一个demo,用来获取本机 或者 输入的主机名:
package sedion.jeffli.net;
import java.net.InetAddress;
import java.net.UnknownHostException;
public class InetAddressTest
{
public static void main(String[] args) throws UnknownHostException
{
try
{
if (args.length > 0)
{
String host = args[0];
InetAddress[] address = InetAddress.getAllByName(host);
for (InetAddress inetAddress : address)
{
System.out.println(inetAddress);
}
}
else
{
InetAddress localHostAddress = InetAddress.getLocalHost();
System.out.println(localHostAddress);
}
} catch (Exception e)
{
e.printStackTrace();
}
}
}
java.net.InetAddress
static InetAddress
getAllByName(String host)
在给定主机名的情况下,根据系统上配置的名称服务返回其 IP 地址所组成的数组。
static InetAddress
getByName(String host)
在给定主机名的情况下确定主机的 IP 地址。
static InetAddress
getLocalHost()
返回本地主机。
String
getHostAddress()
返回 IP 地址字符串(以文本表现形式)。
String
getHostAddress()
返回 IP 地址字符串(以文本表现形式)。