成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

JAVA教程 第八講 Java網絡編程(二)

瀏覽:2日期:2024-03-05 14:12:50

8.3 基于Socket(套接字)的低層次Java網絡編程

8.3.1 Socket通訊

網絡上的兩個程序通過一個雙向的通訊連接實現數據的交換,這個雙向鏈路的一端稱為一個Socket。Socket通常用來實現客戶方和服務方的連接。Socket是TCP/IP協議的一個十分流行的編程界面,一個Socket由一個IP地址和一個端口號唯一確定。

在傳統的UNIX環境下可以操作TCP/IP協議的接口不止Socket一個,Socket所支持的協議種類也不光TCP/IP一種,因此兩者之間是沒有必然聯系的。在Java環境下,Socket編程主要是指基于TCP/IP協議的網絡編程。

說Socket編程是低層次網絡編程并不等于它功能不強大,恰恰相反,正因為層次低,Socket編程比基于URL的網絡編程提供了更強大的功能和更靈活的控制,但是卻要更復雜一些。由于Java本身的特殊性,Socket編程在Java中可能已經是層次最低的網絡編程接口,在Java中要直接操作協議中更低的層次,需要使用Java的本地方法調用(JNI),在這里就不予討論了。

8.3.2 Socket通訊的一般過

前面已經提到Socket通常用來實現C/S結構。

使用Socket進行Client/Server程序設計的一般連接過程是這樣的:Server端Listen(監聽)某個端口是否有連接請求,Client端向Server端發出Connect(連接)請求,Server端向Client端發回Accept(接受)消息。一個連接就建立起來了。Server端和Client端都可以通過Send,Write等方法與對方通信。

對于一個功能齊全的Socket,都要包含以下基本結構,其工作過程包含以下四個基本的步驟:

(1) 創建Socket;

(2) 打開連接到Socket的輸入/出流;

(3) 按照一定的協議對Socket進行讀/寫操作;

(4) 關閉Socket.

第三步是程序員用來調用Socket和實現程序功能的關鍵步驟,其他三步在各種程序中基本相同。

以上4個步驟是針對TCP傳輸而言的,使用UDP進行傳輸時略有不同,在后面會有具體講解。

8.3.3 創建Socket

java在包java.net中提供了兩個類Socket和ServerSocket,分別用來表示雙向連接的客戶端和服務端。這是兩個封裝得非常好的類,使用很方便。其構造方法如下:

Socket(InetAddress address, int port);

Socket(InetAddress address, int port, boolean stream);

Socket(String host, int prot);

Socket(String host, int prot, boolean stream);

Socket(SocketImpl impl)

Socket(String host, int port, InetAddress localAddr, int localPort)

Socket(InetAddress address, int port, InetAddress localAddr, int localPort)

ServerSocket(int port);

ServerSocket(int port, int backlog);

ServerSocket(int port, int backlog, InetAddress bindAddr)

其中address、host和port分別是雙向連接中另一方的IP地址、主機名和端口號,stream指明socket是流socket還是數據報socket,localPort表示本地主機的端口號,localAddr和bindAddr是本地機器的地址(ServerSocket的主機地址),impl是socket的父類,既可以用來創建serverSocket又可以用來創建Socket。count則表示服務端所能支持的最大連接數。例如:

Socket client = new Socket('127.0.01.', 80);

ServerSocket server = new ServerSocket(80);

注意,在選擇端口時,必須小心。每一個端口提供一種特定的服務,只有給出正確的端口,才能獲得相應的服務。0~1023的端口號為系統所保留,例如http服務的端口號為80,telnet服務的端口號為21,ftp服務的端口號為23, 所以我們在選擇端口號時,最好選擇一個大于1023的數以防止發生沖突。

在創建socket時如果發生錯誤,將產生IOException,在程序中必須對之作出處理。所以在創建Socket或ServerSocket是必須捕獲或拋出例外。

8.3.4 客戶端的Socket

下面是一個典型的創建客戶端Socket的過程。

 try{

 Socket socket=new Socket('127.0.0.1',4700);

 //127.0.0.1是TCP/IP協議中默認的本機地址

 }catch(IOException e){

 System.out.println('Error:'+e);

 }

這是最簡單的在客戶端創建一個Socket的一個小程序段,也是使用Socket進行網絡通訊的第一步,程序相當簡單,在這里不作過多解釋了。在后面的程序中會用到該小程序段。

8.3.5 服務器端的ServerSocket

下面是一個典型的創建Server端ServerSocket的過程。

ServerSocket server=null;

try {

 server=new ServerSocket(4700);

 //創建一個ServerSocket在端口4700監聽客戶請求

}catch(IOException e){

 System.out.println('can not listen to :'+e);

}

Socket socket=null;

try {

socket=server.accept();

//accept()是一個阻塞的方法,一旦有客戶請求,它就會返回一個Socket對象用于同客戶進行交互

}catch(IOException e){

System.out.println('Error:'+e);

}

以上的程序是Server的典型工作模式,只不過在這里Server只能接收一個請求,接受完后Server就退出了。實際的應用中總是讓它不停的循環接收,一旦有客戶請求,Server總是會創建一個服務線程來服務新來的客戶,而自己繼續監聽。程序中accept()是一個阻塞函數,所謂阻塞性方法就是說該方法被調用后,將等待客戶的請求,直到有一個客戶啟動并請求連接到相同的端口,然后accept()返回一個對應于客戶的socket。這時,客戶方和服務方都建立了用于通信的socket,接下來就是由各個socket分別打開各自的輸入/輸出流。

8.3.6 打開輸入/出流

類Socket提供了方法getInputStream ()和getOutStream()來得到對應的輸入/輸出流以進行讀/寫操作,這兩個方法分別返回InputStream和OutputSteam類對象。為了便于讀/寫數據,我們可以在返回的輸入/輸出流對象上建立過濾流,如DataInputStream、DataOutputStream或PrintStream類對象,對于文本方式流對象,可以采用InputStreamReader和OutputStreamWriter、PrintWirter等處理。

例如:

PrintStream os=new PrintStream(new BufferedOutputStreem(socket.getOutputStream()));

DataInputStream is=new DataInputStream(socket.getInputStream());

PrintWriter out=new PrintWriter(socket.getOutStream(),true);

BufferedReader in=new ButfferedReader(new InputSteramReader(Socket.getInputStream()));

輸入輸出流是網絡編程的實質性部分,具體如何構造所需要的過濾流,要根據需要而定,能否運用自如主要看讀者對Java中輸入輸出部分掌握如何。

8.3.7 關閉Socket

每一個Socket存在時,都將占用一定的資源,在Socket對象使用完畢時,要其關閉。關閉Socket可以調用Socket的Close()方法。在關閉Socket之前,應將與Socket相關的所有的輸入/輸出流全部關閉,以釋放所有的資源。而且要注意關閉的順序,與Socket相關的所有的輸入/輸出該首先關閉,然后再關閉Socket。

os.close();

is.close();

socket.close();

盡管Java有自動回收機制,網絡資源最終是會被釋放的。但是為了有效的利用資源,建議讀者按照合理的順序主動釋放資源。

8.3.8 簡單的Client/Server程序設計

下面我們給出一個用Socket實現的客戶和服務器交互的典型的C/S結構的演示程序,讀者通過仔細閱讀該程序,會對前面所討論的各個概念有更深刻的認識。程序的意義請參考注釋。

1. 客戶端程序

import java.io.*;

import java.net.*;

public class TalkClient {

public static void main(String args[]) {

try{

Socket socket=new Socket('127.0.0.1',4700);

//向本機的4700端口發出客戶請求

BufferedReader sin=new BufferedReader(new InputStreamReader(System.in));

//由系統標準輸入設備構造BufferedReader對象

PrintWriter os=new PrintWriter(socket.getOutputStream());

//由Socket對象得到輸出流,并構造PrintWriter對象

BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream()));

//由Socket對象得到輸入流,并構造相應的BufferedReader對象

String readline;

readline=sin.readLine(); //從系統標準輸入讀入一字符串

while(!readline.equals('bye')){

//若從標準輸入讀入的字符串為 'bye'則停止循環

os.println(readline);

//將從系統標準輸入讀入的字符串輸出到Server

os.flush();

//刷新輸出流,使Server馬上收到該字符串

System.out.println('Client:'+readline);

//在系統標準輸出上打印讀入的字符串

System.out.println('Server:'+is.readLine());

//從Server讀入一字符串,并打印到標準輸出上

readline=sin.readLine(); //從系統標準輸入讀入一字符串

} //繼續循環

os.close(); //關閉Socket輸出流

is.close(); //關閉Socket輸入流

socket.close(); //關閉Socket

}catch(Exception e) {

System.out.println('Error'+e); //出錯,則打印出錯信息

}

}

}

標簽: Java
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
成人性生交大片免费看在线播放 | 久久综合久久综合这里只有精品| 日韩欧美国产一区二区三区| 免费欧美日韩国产三级电影| 亚洲欧美日产图| 亚洲人成在线播放网站岛国| 在线观看不卡| 中文字幕一区二区三区精华液| 欧美激情日韩| 国产精品免费人成网站| 欧美激情视频一区二区三区在线播放| 日韩女优av电影在线观看| 国内成+人亚洲+欧美+综合在线| 在线观看一区不卡| 青青草91视频| 久久青草久久| 首页国产欧美日韩丝袜| 久久精品人人| 日日摸夜夜添夜夜添国产精品 | 日韩免费在线观看| 国产精品99久久不卡二区| 欧美日韩视频第一区| 免费一区二区视频| 欧美在线免费视屏| 国产综合久久久久久鬼色| 欧美人牲a欧美精品| 韩国成人精品a∨在线观看| 欧美日韩成人在线| 国产精品羞羞答答xxdd| 91精品国产综合久久婷婷香蕉| 精品一区二区在线免费观看| 欧美一区二区三区喷汁尤物| 国产精品99久久久久久有的能看| 8x8x8国产精品| 懂色中文一区二区在线播放| 精品少妇一区二区三区| av影院午夜一区| 欧美国产乱子伦| 红桃视频国产一区| 亚洲精品日日夜夜| 久久精品日产第一区二区| 日韩电影免费在线观看网站| 欧美日韩一区中文字幕| 国产高清精品在线| 欧美成人高清电影在线| 9人人澡人人爽人人精品| 国产欧美精品区一区二区三区| 亚洲午夜在线观看| 亚洲图片欧美一区| 欧美在线观看一区| hitomi一区二区三区精品| 中文字幕欧美区| 一本色道久久| 日韩专区中文字幕一区二区| 欧美日韩国产综合一区二区| 大桥未久av一区二区三区中文| 国产亚洲一二三区| 日韩视频在线一区二区三区| 五月天欧美精品| 色系网站成人免费| 国产一区二区三区观看| 精品福利二区三区| 亚洲大胆女人| 人人精品人人爱| 91精品国产综合久久精品| 农村妇女精品| 亚洲精品久久7777| 欧美日韩国产免费| 97国产一区二区| 一区二区三区 在线观看视频| 在线亚洲一区二区| 国产成人av电影| 亚洲欧美综合另类在线卡通| 久久看片网站| 国产成人综合视频| 国产视频一区二区三区在线观看| 尤物精品在线| 老司机精品视频一区二区三区| 26uuu亚洲| 国产伦精品一区二区三区| 久久99国产乱子伦精品免费| 国产女人水真多18毛片18精品视频 | 欧美激情在线一区二区三区| 国产精品视区| 成人丝袜高跟foot| 亚洲精品国产视频| 欧美久久久久久久久久| 欧美激情91| 亚洲成人激情自拍| 日韩欧美视频一区| 中文日韩在线| 国产ts人妖一区二区| 亚洲欧美国产77777| 欧美日韩精品系列| 粉嫩aⅴ一区二区三区四区| 亚洲欧美成人一区二区三区| 欧美日本在线播放| 亚洲天堂激情| 精品一区免费av| 亚洲日本在线视频观看| 欧美日韩国产精选| 雨宫琴音一区二区在线| 青草av.久久免费一区| 久久久久久久久久看片| 亚洲一区三区在线观看| 成人综合日日夜夜| 亚洲午夜在线视频| 亚洲精品一区二区三区香蕉| 一本色道久久综合亚洲91| 久久亚洲免费视频| 在线观看精品一区| 黄色日韩在线| 国产一区二区三区观看| 亚洲猫色日本管| 日韩三级中文字幕| 国产精品推荐精品| 91一区在线观看| 日本vs亚洲vs韩国一区三区二区 | 欧美电影免费观看高清完整版在 | 精品二区久久| 国产揄拍国内精品对白| 综合自拍亚洲综合图不卡区| 在线播放中文字幕一区| 亚洲欧美日韩国产| 国内精品久久久久国产盗摄免费观看完整版| 久久国产日韩欧美精品| 一区二区不卡在线视频 午夜欧美不卡在| 欧美一区二区三区在线观看| 性高湖久久久久久久久| 欧美久久九九| 国产999精品久久久久久绿帽| 日韩高清在线不卡| 一区二区三国产精华液| 国产精品网曝门| 日韩一级视频免费观看在线| 91豆麻精品91久久久久久| 一道本一区二区| 欧美婷婷在线| 91在线丨porny丨国产| 国产精品系列在线播放| 蜜桃视频在线观看一区| 一区二区三区欧美视频| 亚洲精品一区在线观看| 538prom精品视频线放| 色婷婷亚洲一区二区三区| 99成人在线| 欧美三区在线| 99视频国产精品| 国产美女精品人人做人人爽| 亚洲一区二区偷拍精品| 国产欧美精品一区aⅴ影院| 日韩亚洲欧美中文三级| 欧洲精品视频在线观看| 麻豆久久久9性大片| aa成人免费视频| 国语自产精品视频在线看8查询8| 99久久久国产精品| 成人综合在线网站| 粉嫩绯色av一区二区在线观看| 国产一区在线视频| 日本午夜一本久久久综合| 亚洲国产乱码最新视频 | 国产亚洲一区二区三区四区| 精品少妇一区二区三区在线视频| 欧美日韩国产精选| 欧美色精品天天在线观看视频| 色哟哟亚洲精品| 色婷婷国产精品| 91成人免费在线| 欧美视频一区在线| 欧美图片一区二区三区| 久久伊人一区二区| 鲁大师成人一区二区三区| 六月丁香综合| 免费永久网站黄欧美| 一本一本久久a久久精品综合妖精| 国外成人免费视频| 韩日成人在线| 伊人久久亚洲影院| 91久久国产综合久久蜜月精品| 激情综合激情| 亚洲国产专区校园欧美| 亚洲美女少妇无套啪啪呻吟| 亚洲精选91| 亚洲一区二区三区四区中文| 美女黄网久久| 在线免费观看日本一区| 欧美日韩在线一区二区| 3d动漫精品啪啪一区二区竹菊| 91精品综合久久久久久| 欧美性生活影院| 69堂成人精品免费视频| 日韩一区二区免费在线观看| 日韩精品一区二区三区swag| 久久综合国产精品| 国产网红主播福利一区二区| 中文字幕日韩欧美一区二区三区| 一区二区在线观看免费视频播放 | 蜜桃视频第一区免费观看| 国产一区欧美日韩|