动车上的书摘-java网络 连接服务器

一.服务器初试-telnet工具

    当我们编写网络程序时,我们应该认识telnet的小工具(unix 和 win 自带)。Telnet协议是TCP/IP协议族中的一员,是Internet远程登陆服务的标准协议和主要方式。它为用户提供了在本地计算机上完成远程主机工作的能力。win自带的telnet要去开启,开启的步骤如下:
                                  动车上的书摘-java网络 连接服务器

注意:第一:打开控制面板,打开程序和功能,看到左边有个“打开或关闭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的网络连接,当其接收到请求,就反馈给客户端。

动车上的书摘-java网络 连接服务器

 

以下,是我提供的telnet的工具常用命令。

            动车上的书摘-java网络 连接服务器

三.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(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 地址字符串(以文本表现形式)。