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.pswp.cn/news/533056.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/533056.shtml
英文地址,請注明出處:http://en.pswp.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系列打造,在游戲的部分特性上有著各種的提升,以及各種專屬的表達,比基巖版能多一些不同的玩法,在這里有著各種不同的玩法以及模式等待你的加…