欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java Socket編程(二) Java面向連接的類

 更新時(shí)間:2006年12月23日 00:00:00   作者:  
文章來源:aspcn 作者:孫雯

Java面向連接的類

Sockets有兩種主要的操作方式:面向連接的和無連接的.面向連接的sockets操作就像一部電話,他們必須建立一個(gè)連接和一人呼叫.所有的事情在到達(dá)時(shí)的順序與它們出發(fā)時(shí)的順序時(shí)一樣.無連接的sockets操作就像是一個(gè)郵件投遞,,沒有什么保證,多個(gè)郵件可能在到達(dá)時(shí)的順序與出發(fā)時(shí)的順序不一樣.

到底用哪種模式是郵應(yīng)用程序的需要決定的.如果可靠性更重要的話,用面向連接的操作會(huì)好一些.比如文件服務(wù)器需要他們的數(shù)據(jù)的正確性和有序性.如果一些數(shù)據(jù)丟失了,系統(tǒng)的有效性將會(huì)失去.一些服務(wù)器,比如間歇性地發(fā)送一些數(shù)據(jù)塊.如果數(shù)據(jù)丟了的話,服務(wù)器并不想要再重新發(fā)過一次.因?yàn)楫?dāng)數(shù)據(jù)到達(dá)的時(shí)候,它可能已經(jīng)過時(shí)了.確保數(shù)據(jù)的有序性和正確性需要額外的操作的內(nèi)存消耗,額外的費(fèi)用將會(huì)降低系統(tǒng)的回應(yīng)速率.

無連接的操作使用數(shù)據(jù)報(bào)協(xié)議.一個(gè)數(shù)據(jù)報(bào)是一個(gè)獨(dú)立的單元,它包含了所有的這次投遞的信息.把它想象成一個(gè)信封吧,它有目的地址和要發(fā)送的內(nèi)容.這個(gè)模式下的socket不需要連接一個(gè)目的的socket,它只是簡(jiǎn)單地投出數(shù)據(jù)報(bào).無連接的操作是快速的和高效的,但是數(shù)據(jù)安全性不佳.

面向連接的操作使用TCP協(xié)議.一個(gè)這個(gè)模式下的socket必須在發(fā)送數(shù)據(jù)之前與目的地的socket取得一個(gè)連接.一旦連接建立了,sockets就可以使用一個(gè)流接口:打開-讀-寫-關(guān)閉.所有的發(fā)送的信息都會(huì)在另一端以同樣的順序被接收.面向連接的操作比無連接的操作效率更低,但是數(shù)據(jù)的安全性更高.

SUN一直是網(wǎng)絡(luò)建設(shè)的支持者,所以在Java中支持sockets就不足為奇了.實(shí)際上,Java降低了建立一個(gè)sockets程序的難度.每一個(gè)傳輸模式都被封裝到了不同的類中.面向連接的類將會(huì)首先被我們討論.

在Java中面向連接的類有兩種形式,它們分別是客戶端和服務(wù)器端.客戶端這一部分是最簡(jiǎn)單的,所以我們先討論它.

列表9.1列出了一個(gè)簡(jiǎn)單的客戶端的程序.它向一個(gè)服務(wù)器發(fā)出一個(gè)請(qǐng)求,取回一個(gè)HTML文檔,并把它顯示在控制臺(tái)上.

9.1一個(gè)簡(jiǎn)單的socket客戶端

import java.io.*;
import java.net.*;
/**
* 一個(gè)簡(jiǎn)單的從服務(wù)器取回一個(gè)HTML頁面的程序
* 注意:merlin是本地機(jī)器的名字
*/
public class SimpleWebClient {
public static void main(String args[])
{
try
{
// 打開一個(gè)客戶端socket連接
Socket clientSocket1 = new Socket("merlin", 80);
System.out.println("Client1: " + clientSocket1);
// 取得一個(gè)網(wǎng)頁
getPage(clientSocket1);
}
catch (UnknownHostException uhe)
{
System.out.println("UnknownHostException: " + uhe);
}
catch (IOException ioe)
{
System.err.println("IOException: " + ioe);
}
}
/**
*通過建立的連接請(qǐng)求一個(gè)頁面,顯示回應(yīng)然后關(guān)閉socket
*/
public static void getPage(Socket clientSocket)
{
try
{
// 需要輸入和輸出流
DataOutputStream outbound = new DataOutputStream(
clientSocket.getOutputStream() );
DataInputStream inbound = new DataInputStream(
clientSocket.getInputStream() );
// 向服務(wù)器發(fā)出HTTP請(qǐng)求
outbound.writeBytes("GET / HTTP/1.0\r\n\r\n");
// 讀出回應(yīng)
String responseLine;
while ((responseLine = inbound.readLine()) != null)
{
// 把每一行顯示出來
System.out.println(responseLine);
if ( responseLine.indexOf("") != -1 )
break;
}
// 清除
outbound.close();
inbound.close();
clientSocket.close();
}
catch (IOException ioe)
{
System.out.println("IOException: " + ioe);
}
}
}
回憶一個(gè),一個(gè)客戶端向一個(gè)正在監(jiān)聽的服務(wù)器socket發(fā)出一個(gè)連接.客戶端的sockets是用Socket類建立的.下面的程序建立了一個(gè)客戶端的socket并且連接到了一個(gè)主機(jī):

Socket clientSocket = new Socket("merlin", 80);

第一個(gè)參數(shù)是你想要連接的主機(jī)的名稱,第二個(gè)參數(shù)是端口號(hào).一個(gè)主機(jī)名稱指定了目的的名稱.端口號(hào)指定了由哪個(gè)應(yīng)用程序來接收.在我們的情況下,必須指定80,因?yàn)樗悄J(rèn)的HTTP協(xié)議的端口.另外的知名的端口列在表9.1中,看:

知名的端品:

echo 7

daytime 13

daytime 13

ftp 21

telnet 23

smtp 25

finger 79

http 80

pop3 110

因?yàn)镾ocket類是面向連接的,它提供了一個(gè)可供讀寫的流接口.java.io包中的類可以用來訪問一個(gè)已連接的socket:

DataOutputStream outbound = new DataOutputStream(
clientSocket.getOutputStream() );
DataInputStream inbound = new DataInputStream( clientSocket.getInputStream()
);

一旦流建立了,一般的流操作就可以做了:

outbound.writeBytes("GET / HTTP/1.0\r\n\r\n);
String responseLine;
while ( (responseLine = inbound.readLine()) != null)
{
System.out.println(responseLine);
}

以上的小程序請(qǐng)求了一個(gè)WEB頁面并且把它顯示出來.當(dāng)程序完成之后,連接必須關(guān)閉.

outbound.close();
inbound.close();
clientSocket.close();

注意socket流必須首先關(guān)閉.所有的的socket流必須在socket關(guān)閉之前關(guān)閉.這個(gè)小程序非常地簡(jiǎn)單,但是所有的客戶端程序都必須遵首下面的基本的步驟:

1.建立客戶端socket連接.

2.得到socket的讀和寫的流.

3.利用流.

4.關(guān)閉流.

5.關(guān)閉socket.

使用一個(gè)服務(wù)器端的socket只是有一點(diǎn)復(fù)雜,它將在下面講到.

相關(guān)文章

  • Mybatis利用分頁插件PageHelper快速實(shí)現(xiàn)分頁查詢

    Mybatis利用分頁插件PageHelper快速實(shí)現(xiàn)分頁查詢

    如果你也在用MyBatis,建議嘗試該分頁插件,這一定是最方便使用的分頁插件,這篇文章主要給大家介紹了關(guān)于Mybatis利用分頁插件PageHelper快速實(shí)現(xiàn)分頁查詢的相關(guān)資料,PageHelper是一個(gè)Mybatis的分頁插件,負(fù)責(zé)將已經(jīng)寫好的sql語句,進(jìn)行分頁加工,需要的朋友可以參考下
    2021-08-08
  • 淺談java中==以及equals方法的用法

    淺談java中==以及equals方法的用法

    這篇文章主要介紹了淺談java中==以及equals方法的用法,涉及二者的用法示例,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-11-11
  • 基于Java中throw和throws的區(qū)別(詳解)

    基于Java中throw和throws的區(qū)別(詳解)

    下面小編就為大家?guī)硪黄贘ava中throw和throws的區(qū)別(詳解)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-07-07
  • JAVA 格式化JSON數(shù)據(jù)并保存到j(luò)son文件中的實(shí)例

    JAVA 格式化JSON數(shù)據(jù)并保存到j(luò)son文件中的實(shí)例

    這篇文章主要介紹了JAVA 格式化JSON數(shù)據(jù)并保存到j(luò)son文件中的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-10-10
  • SpringBoot實(shí)現(xiàn)前后端分離國(guó)際化的示例詳解

    SpringBoot實(shí)現(xiàn)前后端分離國(guó)際化的示例詳解

    Springboot國(guó)際化可以幫助使用者在不同語言環(huán)境中構(gòu)建應(yīng)用程序,這樣應(yīng)用程序可以有效地適應(yīng)不同語言文化背景下的用戶需求。本文主要介紹了SpringBoot實(shí)現(xiàn)前后端分離國(guó)際化的方法,需要的可以參考一下
    2023-02-02
  • 關(guān)于spring屬性占位符用法

    關(guān)于spring屬性占位符用法

    這篇文章主要介紹了關(guān)于spring屬性占位符用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • 深入理解Java設(shè)計(jì)模式之觀察者模式

    深入理解Java設(shè)計(jì)模式之觀察者模式

    這篇文章主要介紹了JAVA設(shè)計(jì)模式之觀察者模式的的相關(guān)資料,文中示例代碼非常詳細(xì),供大家參考和學(xué)習(xí),感興趣的朋友可以了解
    2021-11-11
  • SpringSecurity權(quán)限控制實(shí)現(xiàn)原理解析

    SpringSecurity權(quán)限控制實(shí)現(xiàn)原理解析

    這篇文章主要介紹了SpringSecurity權(quán)限控制實(shí)現(xiàn)原理解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • Spring jndi數(shù)據(jù)源配置方法詳解

    Spring jndi數(shù)據(jù)源配置方法詳解

    這篇文章主要為大家詳細(xì)介紹了Spring jndi數(shù)據(jù)源的配置方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下解
    2017-07-07
  • Spring Boot 參數(shù)校驗(yàn)的具體實(shí)現(xiàn)方式

    Spring Boot 參數(shù)校驗(yàn)的具體實(shí)現(xiàn)方式

    這篇文章主要介紹了Spring Boot 參數(shù)校驗(yàn)的具體實(shí)現(xiàn)方式,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-06-06

最新評(píng)論