通过Java创建Socket连接到服务器方式

 更新时间:2022年11月09日 15:43:29   作者:Jeffrey_oWang  
这篇文章主要介绍了通过Java创建Socket连接到服务器方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

1)连接到服务器

一、使用telnet

telnet 是windows上基于网络编程的调试工具,windows 可以在控制面版->程序->打开/关闭Windows特性,然后选择Telnet 客户端来开启windows 上telnet

可以通过两个基本的实验来认识telnet

输入:

telnet time-a.nist.gov 13

得到:

image-20211013155434367

这里通过telnet 命令来连接远程服务器,这里连接的是国家标准和技术研究所所运维的,使用这个命令后会建立和服务13端口的会话,而对应的url 也会转换成ip地址129.6.15.28,随后talent 软件就会发送一个连接请求给地址,请求一个到端口13的连接,一旦建立连接,遍会发送回一行数据然后关闭这个连接,而一般的客户端和服务器之间往往会进行更多的会话。

输入:

telnet horstmann.com 80

返回:

因为这里是访问外网的原因可能迟迟没有给我消息,但是其实我是可以发送一个HTTP 的报文,向这个服务器提交请求

GET / HTTP/1.1
Host:horstmann.com
blank line

这样的GET请求服务器会返回我一个HTML 的页面代码

image-20211013160451201

image-20211013160512059

二、Java连接服务器

public class Test1 {
    public static void main(String[] args) {
        /*创建一个指定地址和端口的套接字,如果创建失败会抛出一个UnknownHostException*/
        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);
            }
        }catch (IOException e) {
            /*如果存在host 不存在之外的异常会抛出一个IOException 异常
            * UnknownHostException是这个异常的子异常
            * */
            e.printStackTrace();
        }
    }
}

套接字一旦创建成功就会建立与服务器对应的连接,java.net.Socket 类中的getInputStream 方法就会返回一个InputStream 对象,该对象可以像任何一个流对象一样去使用,相应的也可以把其中的信息输出在控制台。

image-20211013161701001

Socket 类非常的易用,因为Java库隐藏了建立网络连接和通过连接发送数据的复杂过程,实际上,java.net 包提供的编程接口与操作文件时使用的接口基本相同。

java 支持传输层的TCP协议,也支持UDP协议。

解决超时

1、第一种超时是连接建立成功之后,在有数据可供访问之前,读操作会一直阻塞下去

Socket s = new Socket(...);
s.setTimeout(10000);

通过socket.setTimeOut方法可以设置套接字的超时时间,如果超过这个时间就会抛出SocketTimeoutException 异常,如果此时读操作和写操作在没有完成前就超时,可以通过捕获这个超时异常做出反应。

2、通过Socket 的构造器可以建立与服务器的连接,但是如果一直无法建立连接,就会一直阻塞下去,直到建立了连接。

可以通过:

Socket s =new Socket();
s.connect(new InetSocketAddress(host,port),timeout)

设置超时时间来处理一直无法连接上的问题。

三、因特网地址

就是通过域名来获取IP地址,一般的IP的地址是4字节的,而IPV6是16字节的,这时就可以通过**InetAddress类来实现**

只要主机支持IPV6格式的因特网地址,java.net 包也会支持它

获取指定域名的IP地址:

public class Test1 {
    public static void main(String[] args) throws UnknownHostException {
        String host = "www.baidu.com";
        /*InetAddress address = InetAddress.getByAddress(host);*/
        /*
        一般的域名只会对应一个一个IP地址
        而一些访问量比较大的域名会对应多个IP地址,从而实现负载均衡
        可以通过上面的方法获取一个IP地址
        也可以通过下面的方法获取一个域名对应的多个IP地址
         */
        /*InetAddress 的toString方法会会返回一个字符串类型,进而打印会输出对应的ip地址*/
        InetAddress[] addresses = InetAddress.getAllByName(host);
        for (InetAddress address : addresses){
            System.out.println(address);
        }
    }
}

image-20211013165714501

image-20211013165834153

image-20211013165848158

如果想获取本地的IP地址可以通过:

    public static void main(String[] args) throws UnknownHostException {
        InetAddress address = InetAddress.getLocalHost();
        System.out.println(address);
    }

image-20211013170019949

前面输出的是主机名而后面输出的是主机的IP地址

image-20211013170056989

四、用到的API

  • java.netl.Sokcet 类
Socket(String host,int port)

创建一个套接字,指定主机和端口

Socket

创建一个为连接的套接字

InputStream getInputStream()
OutputStream getOutputStream()

获取从套接字中读取数据的流

void connect(SocketAddress address)

将套接字连接到指定的地址

void connect(SocketAddress address,int timeout)

连接到指定地址,如果给定时间内没有响应,则返回

void setTimeout(int timeout)

设置套接字上的读请求的阻塞时间,超出给定时间抛出InterruptedIOException

boolean isConnected()

如果该套接字被连接,则返回true

boolean isClosed()

如果该套接字被关闭返回False

  • java.net.InetAddress类
statci InetAddress getByName(String host)
statci InetAddress[] getAllByName(String host)

给定主机名一个InetAddress 对象,或者一个数组

static InetAddress getLocalHost()

为本机创建一个InetAddress 对象

byte[] getAddress()

返回一个包含数字行地址的字节数组

IP 地址的字节数组表示

String getHostAddress()

返回值一个十进制组成的字符串,各数字用. 隔开

129.6.15.28

String getHostName()

返回主机名

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java GUI实现学生成绩管理系统

    Java GUI实现学生成绩管理系统

    这篇文章主要为大家详细介绍了Java GUI实现学生成绩管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • iReport生成pdf打印的实例代码

    iReport生成pdf打印的实例代码

    下面小编就为大家分享一篇iReport生成pdf打印的实例代码,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-11-11
  • Mybatis解决找不到get方法

    Mybatis解决找不到get方法

    这篇文章主要介绍了Mybatis解决找不到get方法问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • springboot整合阿里云百炼DeepSeek实现sse流式打印的操作方法

    springboot整合阿里云百炼DeepSeek实现sse流式打印的操作方法

    这篇文章主要介绍了springboot整合阿里云百炼DeepSeek实现sse流式打印,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2025-04-04
  • Spring运行时手动注入bean的方法实例

    Spring运行时手动注入bean的方法实例

    spring给我们提供了IOC服务,让我们可以用注解的方式,方便的使用bean的相互引用,下面这篇文章主要给大家介绍了关于Spring运行时手动注入bean的相关资料,需要的朋友可以参考下
    2022-05-05
  • SpringBoot整合FTP使用示例教程

    SpringBoot整合FTP使用示例教程

    这篇文章主要介绍了SpringBoot整合FTP使用示例教程,本文通过示例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2024-08-08
  • java中url任意跳转漏洞的解决

    java中url任意跳转漏洞的解决

    URL任意跳转漏洞是一种安全漏洞,它发生在应用程序没有正确地验证目标URL,允许攻击者将用户重定向到恶意网站,本文就来介绍一下漏洞的解决修复方案,感兴趣的可以了解一下
    2024-06-06
  • SpringBoot结合mockito测试实战

    SpringBoot结合mockito测试实战

    与集成测试将系统作为一个整体测试不同,单元测试更应该专注于某个类。所以当被测试类与外部类有依赖的时候,尤其是与数据库相关的这种费时且有状态的类,很难做单元测试。但好在可以通过“Mockito”这种仿真框架来模拟这些比较费时的类,从而专注于测试某个类内部的逻辑
    2022-11-11
  • Java判断主机是否能ping通代码实例

    Java判断主机是否能ping通代码实例

    这篇文章主要介绍了Java判断主机是否能ping通代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01
  • 详解java如何处理各种批量数据入库

    详解java如何处理各种批量数据入库

    这篇文章主要为大家详细介绍了java如何使用BlockingQueue处理各种批量数据入库,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-11-11

最新评论