详解Java如何通过Socket实现查询IP

目录
  • 背景
  • 使用示例
  • 应用例子
    • 应用服务器
    • 获取客户端的IP地址
    • 向客户端发送消息
  • 测试应用程序
    • 建立一个客户端应用程序
    • 运行应用程序
    • 在后台发生了什么
  • 总结

在本文中,我们来学习下如何找到连接到服务器的客户端计算机的IP地址。我们将创建一个简单的客户端-服务器场景,让我们探索用于TCP/IP通信的java.net API。

背景

Java应用程序使用套接字在互联网上进行通信和发送数据。Java为客户端应用程序提供了java.net.Socket类。

java.net.ServerSocket类用于TCP/IP的服务器端套接字实现。我们平时只关注TCP/IP的应用层面。

使用示例

让我们假设我们的系统上有一个应用服务器在运行。这个服务器向客户发送问候信息。在这种情况下,服务器使用一个TCP套接字进行通信。

该应用服务器被绑定到一个特定的TCP端口。它的套接字地址是该端口和本地网络接口的IP地址的组合。由于这个原因,客户应该使用这个特定的套接字地址来连接服务器。

应用例子

现在我们已经定义了我们的用例,让我们开始构建服务器。

应用服务器

首先,我们需要实例化一个ServerSocket,用于监听进入的连接请求。ServerSocket类的构造函数需要一个端口号作为参数。

public class ApplicationServer {

    private ServerSocket serverSocket;
    private Socket connectedSocket;
  
    public void startServer(int port) throws IOException {
        serverSocket = new ServerSocket(port);
        connectedSocket = serverSocket.accept();
        //...

获取客户端的IP地址

现在我们已经为进入的客户端建立了Socket,让我们看看如何获得客户端的IP地址。Socket实例包含了远程客户端的套接字地址。我们可以使用getRemoteSocketAddress方法来检查这个。

ThegetRemoteSocketAddress方法返回一个类型为SocketAddress的对象。这是一个抽象的Java类。在这个例子中,我们知道它是一个TCP/IP连接,所以我们可以把它转换为InetSocketAddress

InetSocketAddress socketAddress = (InetSocketAddress) connectedSocket.getRemoteSocketAddress();

正如我们已经看到的,一个套接字地址是一个IP地址和端口号的组合。我们可以使用getAddress来获得IP地址。这返回一个InetAddress对象。然而,我们也可以使用getHostAddress来获得IP地址的字符串表示。

String clientIpAddress = socketAddress.getAddress()
    .getHostAddress();

向客户端发送消息

现在,服务器和客户端可以交换问候信息。

String msg = in.readLine();
System.out.println("Message received from the client : " + msg);
PrintWriter out = new PrintWriter(connectedSocket.getOutputStream(), true);
out.println("Hello Client !!");

测试应用程序

现在让我们建立一个客户端应用程序来测试我们的代码。这个客户端将在一个单独的计算机上运行并连接到我们的服务器。

建立一个客户端应用程序

首先,我们需要使用IP地址和端口号与服务建立一个Socket连接。

public class ApplicationClient {
    public void connect(String ip, int port) throws IOException {
        clientSocket = new Socket(ip, port);
    }
}

与服务器应用程序类似,我们将使用BufferedReaderPrintWriter来从套接字中读取和写入。为了向服务器发送消息,让我们创建一个方法来向连接的套接字写入。

public void sendGreetings(String msg) throws IOException {
    out.println(msg);
    String reply = in.readLine();
    System.out.println("Reply received from the server :" + reply);
}

运行应用程序

接下来,让我们运行客户端应用程序,为它选择一个不常用的端口

之后,我们需要从另一台电脑上启动客户端应用程序。在这个例子中,我们假设服务器机器的IP地址是192.168.0.100,端口5000是不常用的,不会影响其他的服务。

java -cp com.javanorth.clientaddress.ApplicationClient 192.168.0.100 5000 Hello

这里,我们假设客户机和服务器在同一个网络上。在客户端与服务器建立成功的连接后,客户端的IP地址将被打印在服务器控制台。

例如,如果客户端的IP地址是192.168.0.102,我们应该能在控制台中看到它。

IP address of the connected client: 192.168.0.102

在后台发生了什么

一般来说,当应用服务器被启动时,ServerSocket使用给定的端口号和通配符IP地址实例化一个套接字对象。之后,它将其状态改为监听,以接收连接请求。然后,当客户端发送一个连接请求时,ServerSocket通过调用accept方法实例化一个新的套接字。

新创建的套接字实例包含服务器的IP地址和端口,以及远程客户端。对于服务器的IP地址,ServerSocket类使用本地网络接口的IP地址,它通过该接口收到传入的请求。然后,为了获得远程客户端的IP地址,它对收到的TCP数据包的IP头进行解码并使用源地址。

总结

在这篇文章中,我们定义了一个客户机-服务器用例,并使用Java套接字编程来查找连接到服务器的客户机的IP地址。

以上就是详解Java如何通过Socket实现查询IP的详细内容,更多关于Java Socket查询IP的资料请关注我们其它相关文章!

(0)

相关推荐

  • java调用淘宝api联网查询ip归属地

    淘宝返回的数据为:{"code":0,"data":{"country":"\u4e2d\u56fd","country_id":"CN","area":"\u534e\u4e1c","area_id":"300000","region":"\u5c71\u4e1c\u7701&

  • Java 根据网址查询DNS/IP地址的方法

    需求: 给定一个URL地址, 例如: http://www.cncounter.com/tools/shorturl.php, 解析对应的IP地址和端口号. 说明: 本文不涉及底层的 DNS 协议, 直接使用Java平台提供的API进行操作. DNS也就是 Domain Name Service,即 域名服务. 我们知道, Java中与网址有关的类包括 java.net.URL 和 java.net.URI 等, 其中 URI 是资源定位符, 可能包括 file: 之类的协议. 所以此处我们使用

  • Java调用新浪api通过Ip查询地区

    代码如下 import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import javax.servlet.http.HttpServletRequest; public class sinaIpUtil { public static void main(

  • 详解Java如何通过Socket实现查询IP

    目录 背景 使用示例 应用例子 应用服务器 获取客户端的IP地址 向客户端发送消息 测试应用程序 建立一个客户端应用程序 运行应用程序 在后台发生了什么 总结 在本文中,我们来学习下如何找到连接到服务器的客户端计算机的IP地址.我们将创建一个简单的客户端-服务器场景,让我们探索用于TCP/IP通信的java.net API. 背景 Java应用程序使用套接字在互联网上进行通信和发送数据.Java为客户端应用程序提供了java.net.Socket类. java.net.ServerSocket类

  • 详解Java Web如何限制访问的IP的两种方法

    前一阵子因为在做项目时碰到了这个功能,现在好好总结一下,至于为什么要限制IP访问,我就不多说了.然后百度了一下,现在主要有两种方式去限制IP访问,第一种是最简单的方便的,第二种是通过过滤器来限制访问.下面我简单介绍一下第一种方式,着重介绍第二种. 第一种方式(Tomcat配置项配置允许或限制IP访问) 这种是最简单的快捷的,主要就涉及Tomcat的server.xml配置. 第一步:找到server.xml文件在哪,在Tomcat的目录下的conf文件夹下. 第二步:打开server.xml文件

  • 详解Java Socket通信封装MIna框架

    核心类 IoService :Mina中将服务端和客户端都看成是服务,这里提供统一接口IoService,这个接口的作用就是用来处理套接字机制.也正是IoService来监听消息返回消息这些步骤,可以说IoService就是我们Mina中核心 IoProcessor:这个接口在另一个线程上,负责检查是否有数据在通道上读写,也就是说它也拥有自己的Selector,这是与我们使用JAVA NIO 编码时的一个不同之处,通常在JAVA NIO 编码中,我们都是使用一个Selector,也就是不区分Io

  • 详解Java网络编程

    一.网络编程 1.1.概述 1.计算机网络是通过传输介质.通信设施和网络通信协议,把分散在不同地点的计算机设备互连起来,实现资源共享和数据传输的系统.网络编程就就是编写程序使联网的两个(或多个)设备(例如计算机)之间进行数据传输.Java语言对网络编程提供了良好的支持,通过其提供的接口我们可以很方便地进行网络编程. 2.Java是 Internet 上的语言,它从语言级上提供了对网络应用程 序的支持,程序员能够很容易开发常见的网络应用程序. 3.Java提供的网络类库,可以实现无痛的网络连接,联

  • 详解Java中的OkHttp JSONP爬虫

    目录 什么是JSOUP 什么是OkHttp 爬虫需要掌握的技术 需要的依赖 JSON入门Demo JSOUP常用方法 使用JSOUP 方式连接 User-Agent(随机) 后台爬虫的三大问题 selenium+phantomjs(维护中…内容重新整理) 什么是JSOUP JSOUP 是一款Java 的HTML解析器,可直接解析某个URL地址.HTML文本内容.它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据. 官网 jsoup实现了WHATWG

  • 一文详解Java etcd的应用场景及编码实战

    目录 一.白话etcd与zookeeper 二.etcd的4个核心机制 三.Leader选举与客户端交互 四.etcd的应用场景 4.1. kubernetes大脑 4.2. 服务注册与发现 4.3. 健康检查与状态变更通知 4.4.分布式锁 4.5.实现消息队列(纯扯淡) 五.etcd安装 六.jetcd的编码实现配置管理 本文首先用大白话给大家介绍一下etcd是什么?这部分内容网上已经有很多了. etcd有哪些应用场景?这些应用场景的核心原理是什么? 最后不能光动嘴不动手.先搭建一个etcd

  • 详解Java编写并运行spark应用程序的方法

    我们首先提出这样一个简单的需求: 现在要分析某网站的访问日志信息,统计来自不同IP的用户访问的次数,从而通过Geo信息来获得来访用户所在国家地区分布状况.这里我拿我网站的日志记录行示例,如下所示: 121.205.198.92 - - [21/Feb/2014:00:00:07 +0800] "GET /archives/417.html HTTP/1.1" 200 11465 "http://shiyanjun.cn/archives/417.html/" &qu

  • 详解java中反射机制(含数组参数)

    详解java中反射机制(含数组参数) java的反射是我一直非常喜欢的地方,因为有了这个,可以让程序的灵活性大大的增加,同时通用性也提高了很多.反射原理什么的,我就不想做过大介绍了,网上一搜,就一大把.(下面我是只附录介绍下) Reflection 是Java被视为动态(或准动态)语言的一个关键性质.这个机制允许程序在运行时透过Reflection APIs取得任何一个已知名称的class的内部信息,包括其modifiers(诸如public, static 等等).superclass(例如O

  • 详解Java中数组判断元素存在几种方式比较

    1. 通过将数组转换成List,然后使用List中的contains进行判断其是否存在 public static boolean useList(String[] arr,String containValue){ return Arrays.asList(arr).contains(containValue); } 需要注意的是Arrays.asList这个方法中转换的List并不是java.util.ArrayList而是java.util.Arrays.ArrayList,其中java.

  • 详解Java Callable接口实现多线程的方式

    在Java 1.5以前,创建线程的2种方式,一种是直接继承Thread,另外一种就是实现Runnable接口.无论我们以怎样的形式实现多线程,都需要调用Thread类中的start方法去向操作系统请求io,cup等资源.因为线程run方法没有返回值,如果需要获取执行结果,就必须通过共享变量或者使用线程通信的方式来达到效果,这样使用起来就比较麻烦. 而自从Java 1.5开始,就提供了Callable和Future,通过它们可以在任务执行完毕之后得到任务执行结果. Callable和Future介

随机推荐