java socket调用接口_Java中socket接口调用

最近一个项目中接口通讯这一块主要是调用银联系统的socket接口,我方是客户端,即发送请求接收返回报文的一方。在贴代码之前,还是要了解一下关于socket的基础知识。

Socket的基本概念

1.建立连接

当需要建立网络连接时,必须有一台机器运行一个程序,随时等候连接,而另一端的程序这对其发出连接请求。这一点同电话系统类似——必须有一方拨打电话,而另一方必须等候电话连通。

建立连接的过程为:

(1)先在服务器端生成一个ServerSocket实例对象,随时监听客户端的连接请求。

(2)当客户端需要连接服务端时,相应地要生成一个Socket实例对象,并发出连接请求,其中host参数指明该主机名,port参数指明该主机端口号。

(3)服务器端通过accept()方法接收到客户端的请求后,开辟一个接口与之进行连接,并生成所需的I/O数据流。

(4)客户端和服务器端的通信都是通过一对InputStream和OutputStream进行的,通信结束后,两端分别关闭对应的Socket接口。

2.连接地址

打电话时,呼叫方必须事先知道所需拨打的号码,而程序建立网络连接时,也同样需要知道地址或主机名称。

另外,网络连接还需要一个端口号(可以将其当作电话的分机号),连接到正确的主机之后,需要对该连接确认特定口令。

3.端口号

在TCP/IP系统中,端口号由16位二进制整数组成,即在0-65535之间。实际应用中,前1024个端口号已经预先定义为一些特定服务,因此一般不能使用,除非想同这些服务器进行连接(如Telnet,SMTP,mail,ftp等)。在两个程序连接之前,彼此之间必须达成一致,即由客户端负责初始化连接,而服务器随时等候请求。只有客户端和服务器端指定端口号一致时连接才会建立。如果系统中两个程序所用端口号不一致,这连接无法建立。

4.网络连接模式

在Java中,TCP/IP接口的连接是由java.net包中的类实现的。如图表示的是Socket连接过程中客户端和服务器端的工作原理。

16cc2111a7ad4f2efd78e28a6540870e.png

每个server端都拥有一个端口号,一台机器上如果运行多个服务,这可能对应多个端口号。通信结束后,两端分别关闭对应的Socket接口,而不影响其他的端口。

Socket通信的基本步骤

使用Socket方式进行网络通信的程序基本结构都是类似的,无论一个Socket通信程序的功能多么齐全、程序多么复杂,其基本结构都是一样的。客户端与服务器端进行通信的过程都包括以下四个基本步骤:

(1)在服务器端指定一个用来等待连接的端口号,在客户端规定一个主机和端口号,从而在客户端和服务器端创建Socket/ServerSocket实例。

(2)打开连接到Socket的输入输出流。

(3)利用输入输出流,按照一定的协议对Socket进行读写操作。

(4)关闭输入输出流和Socket

通常,程序员的主要工作时针对所要完成的功能砸器第(3)步进行编程,第(1)、(2)、(4)步对所有的通信程序来说几乎都是一样的。

Socket类中常用的构造函数

1:Socket(InetAddress address,int port) :该方法用于创建一个链接,向指定的IP地址上指定的端口的服务器端程序发送连接请求

2:Socket(InetAddress address,int port) : 同上,但该方法允许通过主机名字符串向服务器发送连接请求

Socket类中常用的方法

1:InetAddress getLocalAddress() :返回和Socket进行连接的本地的IP地址

2:int getLocalPort() :返回和Socket进行连接的本地的端口号

3:InetAddress getInetAddress():返回Socket建立了连接的服务器的IP地址

4:int getPort():返回和Socket建立了连接的服务器的端口号

5:InputStream getInputStream() :返回当前Socket的输入流(常用)

6:OutputStream getOutStream():返回当前Socket的输出流(常用)

7:void close():关闭当前的Socket 连接

ServerSocket中常用的构造函数

1:ServerSocket(int port) :这是构造方法用于在当前的服务器默认的IP地址上监听一个指定的端口,即在指定的IP和端口创建一个ServerSocket对象

ServerSocket中常用的方法

1:Socket accept() :产生阻塞,监听指定的端口,直至有客户端发来连接请求(常用)

2:void close() :关闭当前ServerSocket

3:InetAddress getInetAddress() :返回ServerSocket监听的本机的IP地址

4:int getLocalPort(): 返回ServerSocket监听的,本机的IP地址上指定的端口号

5:int getSoTimeout()::void setSoTimeout(int timeout) 设置连接过程中没有得到相应的等待期限时间(TimeOut)

6:String toString() : 以字符串的方式返回ServerSocket监听的,本机的IP地址及其端口号

Socker通信的程序设计

终于到了贴代码的时间了。。。。。

1.服务器端程序

public static voidmain(String[] args) {//定义ServerSocket和Socket对象

ServerSocket ss = null;

Socket sk;//定义发送字符串,即客户端收到的信息

String sendString = "hello!我是服务端...";//定义OutputStream类

OutputStream s1out;//定义DataOutputStream类

DataOutputStream dos;//通过1314端口建立连接

try{//创建ServerSocket并把传入端口号

ss = new ServerSocket(1314);

}catch(Exception e) {

e.printStackTrace();

}//循环运行监听程序,以监视连接请求

while (true) {try{//监听端口请求,等待连接

sk =ss.accept();//得到与socket相连接的数据流对象

s1out =sk.getOutputStream();

dos= newDataOutputStream(s1out);//发送字符串

dos.writeUTF(sendString);//关闭数据流(但不是关闭Socket连接)

dos.close();

s1out.close();

sk.close();

}catch(Exception e) {

e.printStackTrace();

}

}

}

2.客户端程序

/*** 采用socket连接向服务器发送消息,接受响应信息 注意,如果是通过不同的ip port确定调用接口 这个方法要重写,将ip

* port作为请求条件,现改为传固有参数进来

*

*@paramtext

*@throwsException*/

public staticString sendBySocket(String text, String ip, int port)throwsException {log.info("开始建立socket连接");

Socket socket= newSocket(ip, port);

InputStream is=socket.getInputStream();

InputStreamReader isr= new InputStreamReader(is, "GBK");//2.获取客户端输出流

OutputStream dos =socket.getOutputStream();

log.info("连上服务端");//3.向服务端发送消息

dos.write(text.getBytes());

dos.flush();

log.info("成功向服务器发送消息");//4.获取输入流,并读取服务器端的响应信息

BufferedReader br = newBufferedReader(isr);

String returnInfo=br.readLine();

log.info("服务器端返回数据为:" +returnInfo);//4.关闭资源

br.close();

isr.close();

is.close();

dos.close();

socket.close();returnreturnInfo;

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/533056.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

protobuf java 编译_Maven项目中,编译proto文件成Java类

新建Maven项目新建一个 Maven 项目:pom定义了最小的maven2元素,即:groupId,artifactId,version。 groupId:项目或者组织的唯一标志,并且配置时生成的路径也是由此生成,如org.codehaus.mojo生成的相对路径为&#xff1a…

java 结构体数组初始化_C数组结构体联合体快速初始化

背景C89标准规定初始化语句的元素以固定顺序出现,该顺序即待初始化数组或结构体元素的定义顺序。C99标准新增指定初始化(Designated Initializer),即可按照任意顺序对数组某些元素或结构体某些成员进行选择性初始化,只需指明它们所对应的数组…

java override 访问权限_java基础之——访问修饰符(private/default/protected/public)

1. 访问修饰符介绍java中的访问修饰符包含了四种:private、default(没有对应的保留字)、protected和public。它们的含义如下:private:如果一个元素声明为private,那么只有同一个类下的元素才可以访问它。default:如果一…

python中scrapy可以爬取多少数据_python中scrapy框架爬取携程景点数据

———————————————————————————————[版权申明:本文系作者原创,转载请注明出处]文章出处:https://blog.csdn.net/sdksdk0/article/details/82381198作者:朱培 ID:sdksdk0——————…

python灰色关联度分析代码_灰色关联分析法步骤 - osc_uwnmtz9n的个人空间 - OSCHINA - 中文开源技术交流社区...

https://wenku.baidu.com/view/dc356290af1ffc4fff47ac0d.html?rec_flagdefault&sxts1538121950212利用灰色关联分析的步骤是:1.根据分析目的确定分析指标体系,收集分析数据。设n个数据序列形成如下矩阵:其中m为指标的个数&a…

aio 系统原理 Java_Java新一代网络编程模型AIO原理及Linux系统AIO介绍

从JDK 7版本开始,Java新加入的文件和网络io特性称为nio2(new io 2, 因为jdk1.4中已经有过一个nio了),包含了众多性能和功能上的改进,其中最重要的部分,就是对异步io的支持,称为Java AIO(asynchronous IO)。因为AIO的实…

centos mysql 5.5 art_Linux CentOS6.5下编译安装MySQL 5.5.51''''

一、编译安装MySQL前的准备工作安装编译源码所需的工具和库yum install gcc gcc-c ncurses-devel perl安装cmake,从http://www.cmake.org下载源码并编译安装wget http://www.cmake.org/files/v2.8/cmake-2.8.10.2.tar.gztar -xzvf cmake-2.8.10.2.tar.gzcd cmake-2.…

java修改默认字符编码_设置默认的Java字符编码?

如何以编程方式正确设置JVM(1.5.x)使用​​的默认字符编码?我已经读过-Dfile.encoding 以前是以往的方式去为旧的JVM …我没有那么奢侈的原因,我不会进入。我努力了:System.setProperty("file.encoding", "UTF-8");并且属…

java api 第一个类是_JAVA常用API:String 类的常用方法

字符串是一个对象,有很多方法可以使用1. length();返回字符串的长度String str "abcd";int len str.length();2. isEmpty(); 仅当当length()为0时返回true,否则返回falseboolean b str.isEmpty();3. getBytes();返回字符串中每个字符的ASCII码(使用平台…

关于java内容_关于java一些概念性的内容

PO:persistant object持久对象最形象的理解就是一个PO就是数据库中的一条记录。好处是可以把一条记录作为一个对象处理,可以方便的转为其它对象。--------------------------------------------------------------------------------BO:busin…

java订单类_基于Java创建一个订单类代码实例

这篇文章主要介绍了基于Java创建一个订单类代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下需求描述定义一个类,描述订单信息订单id订单所属用户(用户对象)订单所包含的商品(不定数量个商品对…

java请假审批怎么实现_java实现请假时间判断

笔记:需求分析:每周上班6天夏季早上8:30-12:00下午14:00-17:30冬季早上8:30-12:00下午14:30-18:00请假最低为半天按照上午8:00-12:00,下午14:00-18:00计算,包括了夏季和冬季时间,规律分布如下public String getDouble(HttpServletRequest request) throws ParseException {//参…

mariadb mysql 5.6_MySQL / MariaDB 5.5 升级到 MySQL 5.6

RHEL 及 CentOS 7 默认的资库系统是 MariaDB 5.5 (等同 MySQL 5.5), 虽然现时 MySQL 最新版是 5.7, 但一般上升级都建议一级一级上, 而 MySQL 5.6 比 5.5 也提高了效能及提供更多功能, 以下是在 RHEL 及 CentOS 从原来的 MySQL 5.5 或 MariaDB 5.5, 升级到 MySQL 5.6 的步骤。1…

iText报表Java_(例)Java生成PDF报表 iText

// 导入IO库类import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.util.ArrayList;// 导入 PO&#x…

mysql update修改数据_MySQL UPDATE:修改数据(更新数据)

在 MySQL 中,可以使用 UPDATE 语句来修改、更新一个或多个表的数据。UPDATE 语句的基本语法使用 UPDATE 语句修改单个表,语法格式为:UPDATE SET 字段 1值 1 [,字段 2值 2… ] [WHERE 子句 ][ORDER BY 子句] [LIMIT 子句]语法说明如下&#xf…

java堆内存 数据结构_JAVA内存区域

首先解释下内存溢出和内存泄露之间的区别,为后面的学习做些铺垫:1、内存溢出和内存泄露的区别和联系内存溢出 out of memory:是指程序申请内存时,没有足够的内存供申请者使用,或者说,给了你一块存储int类型…

java jsp的指令_[javaEE] jsp的指令

jsp的指令:jsp的指令(directive)是为jsp引擎而设计的,他们并不直接产生任何可见输出,而是告诉引擎如何处理jsp页面中的其他部分页面头部的page指令pageEncoding"utf-8"%>配置错误页面:web.xml500/500.jsp404/404.jsp…

JAVA不能满屏_java – 全屏幕视频,不拉伸视频

像这样,你可以自己设置视频的属性。使用SurfaceView(给你更多的视图控制),将其设置为fill_parent以匹配整个屏幕android:orientation"vertical"android:layout_width"match_parent"android:layout_height"fill_parent">…

java异常标记_java.lang.RuntimeException:错误:0D0680A8:asn1编码例程:ASN1_CHECK_TLEN:错误的标记...

我收到此错误(在标题中).我不确定为什么,请帮忙.代码如下:public static String decryptRSA(Context mContext, byte[] message) throws Exception {InputStream in mContext.getResources().openRawResource(R.raw.publicrsakey);X509EncodedKeySpec x509EncodedK…

正版我的世界怎么下载java_mcjava正版下载-mc我的世界java安卓正式版极速下载v1.0.1 - 趣趣手游网...

mc我的世界java安卓正式版带你体验最为精彩的多人联机对战玩法,游戏专为java系列打造,在游戏的部分特性上有着各种的提升,以及各种专属的表达,比基岩版能多一些不同的玩法,在这里有着各种不同的玩法以及模式等待你的加…