摘要: 摘要: 原创出处: http://www.cnblogs.com/Alandre/ 泥沙砖瓦浆木匠 希望转载,保留摘要,谢谢!
旅途中书的陪伴,3.5元钢笔的记忆,伴随我Java的学习。-泥沙砖瓦浆木匠
一.服务器初试-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 地址的指定端口号。
getInputStream()
返回此套接字的输入流.
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();
下面演示一个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)
static InetAddress
getLocalHost()
String
getHostAddress()
String
getHostAddress()
六.感谢知识来源和小结
来自:java基础书籍。