电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

JAVA教程 第八講 Java網(wǎng)絡編程(三)

瀏覽:133日期:2024-03-05 08:31:24

8.3.10 據(jù)報Datagram通訊

前面在介紹TCP/IP協(xié)議的時候,我們已經(jīng)提到,在TCP/IP協(xié)議的傳輸層除了TCP協(xié)議之外還有一個UDP協(xié)議,相比而言UDP的應用不如TCP廣泛,幾個標準的應用層協(xié)議HTTP,F(xiàn)TP,SMTP…使用的都是TCP協(xié)議。但是,隨著計算機網(wǎng)絡的發(fā)展,UDP協(xié)議正越來越來顯示出其威力,尤其是在需要很強的實時交互性的場合,如網(wǎng)絡游戲,視頻會議等,UDP更是顯示出極強的威力,下面我們就介紹一下Java環(huán)境下如何實現(xiàn)UDP網(wǎng)絡傳輸。

8.3.11 什么是Datagram

所謂數(shù)據(jù)報(Datagram)就跟日常生活中的郵件系統(tǒng)一樣,是不能保證可靠的寄到的,而面向鏈接的TCP就好比電話,雙方能肯定對方接受到了信息。在本章前面,我們已經(jīng)對UDP和TCP進行了比較,在這里再稍作小節(jié):

TCP,可靠,傳輸大小無限制,但是需要連接建立時間,差錯控制開銷大。

UDP,不可靠,差錯控制開銷較小,傳輸大小限制在64K以下,不需要建立連接。

總之,這兩種協(xié)議各有特點,應用的場合也不同,是完全互補的兩個協(xié)議,在TCP/IP協(xié)議中占有同樣重要的地位,要學好網(wǎng)絡編程,兩者缺一不可。

8.3.12 Datagram通訊的表示方法:DatagramSocket;DatagramPacket

包java.net中提供了兩個類DatagramSocket和DatagramPacket用來支持數(shù)據(jù)報通信,DatagramSocket用于在程序之間建立傳送數(shù)據(jù)報的通信連接, DatagramPacket則用來表示一個數(shù)據(jù)報。先來看一下DatagramSocket的構造方法:

 DatagramSocket();

 DatagramSocket(int prot);

 DatagramSocket(int port, InetAddress laddr)

其中,port指明socket所使用的端口號,如果未指明端口號,則把socket連接到本地主機上一個可用的端口。laddr指明一個可用的本地地址。給出端口號時要保證不發(fā)生端口沖突,否則會生成SocketException類例外。注意:上述的兩個構造方法都聲明拋棄非運行時例外SocketException,程序中必須進行處理,或者捕獲、或者聲明拋棄。

用數(shù)據(jù)報方式編寫client/server程序時,無論在客戶方還是服務方,首先都要建立一個DatagramSocket對象,用來接收或發(fā)送數(shù)據(jù)報,然后使用DatagramPacket類對象作為傳輸數(shù)據(jù)的載體。下面看一下DatagramPacket的構造方法 :

 DatagramPacket(byte buf[],int length);

 DatagramPacket(byte buf[], int length, InetAddress addr, int port);

 DatagramPacket(byte[] buf, int offset, int length);

 DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port);

其中,buf中存放數(shù)據(jù)報數(shù)據(jù),length為數(shù)據(jù)報中數(shù)據(jù)的長度,addr和port旨明目的地址,offset指明了數(shù)據(jù)報的位移量。

在接收數(shù)據(jù)前,應該采用上面的第一種方法生成一個DatagramPacket對象,給出接收數(shù)據(jù)的緩沖區(qū)及其長度。然后調用DatagramSocket 的方法receive()等待數(shù)據(jù)報的到來,receive()將一直等待,直到收到一個數(shù)據(jù)報為止。

DatagramPacket packet=new DatagramPacket(buf, 256);

Socket.receive (packet);

發(fā)送數(shù)據(jù)前,也要先生成一個新的DatagramPacket對象,這時要使用上面的第二種構造方法,在給出存放發(fā)送數(shù)據(jù)的緩沖區(qū)的同時,還要給出完整的目的地址,包括IP地址和端口號。發(fā)送數(shù)據(jù)是通過DatagramSocket的方法send()實現(xiàn)的,send()根據(jù)數(shù)據(jù)報的目的地址來尋徑,以傳遞數(shù)據(jù)報。

DatagramPacket packet=new DatagramPacket(buf, length, address, port);

Socket.send(packet);

在構造數(shù)據(jù)報時,要給出InetAddress類參數(shù)。類InetAddress在包java.net中定義,用來表示一個Internet地址,我們可以通過它提供的類方法getByName()從一個表示主機名的字符串獲取該主機的IP地址,然后再獲取相應的地址信息。

8.3.13 基于UDP的簡單的Client/Server程序設計

有了上面的知識,我們就可以來構件一個基于UDP的C/S 網(wǎng)絡傳輸模型

1. 客戶方程序 QuoteClient.java

import java.io.*;

import java.net.*;

import java.util.*;

public class QuoteClient {

 public static void main(String[] args) throws IOException

 {

if(args.length!=1) {

//如果啟動的時候沒有給出Server的名字,那么出錯退出

 System.out.println('Usage:java QuoteClient ');

 //打印出錯信息

 return; //返回

}

DatagramSocket socket=new DatagramSocklet();

//創(chuàng)建數(shù)據(jù)報套接字

Byte[] buf=new byte[256]; //創(chuàng)建緩沖區(qū)

InetAddress address=InetAddress.getByName(args [0]);

//由命令行給出的第一個參數(shù)默認為Server的名字,通過它得到Server的IP信息

DatagramPacket packet=new DatagramPacket (buf, buf.length, address, 4445);

//創(chuàng)建DatagramPacket對象

socket.send(packet); //發(fā)送

packet=new DatagramPacket(buf,buf.length);

//創(chuàng)建新的DatagramPacket對象,用來接收數(shù)據(jù)報

socket.receive(packet); //接收

String received=new String(packet.getData());

//根據(jù)接收到的字節(jié)數(shù)組生成相應的字符串

System.out.println('Quote of the Moment:'+received );

//打印生成的字符串

socket.close(); //關閉套接口

 }

}

2. 服務器方程序:QuoteServer.java

public class QuoteServer{

 public static void main(String args[]) throws java.io.IOException

 {

new QuoteServerThread().start();

//啟動一個QuoteServerThread線程

 }

}

3. 程序QuoteServerThread.java

import java.io.*;

import java.net.*;

import java.util.*;

//服務器線程

public class QuoteServerThread extends Thread

{

protected DatagramSocket socket=null;

//記錄和本對象相關聯(lián)的DatagramSocket對象

protected BufferedReader in=null;

//用來讀文件的一個Reader

protected boolean moreQuotes=true;

//標志變量,是否繼續(xù)操作

public QuoteServerThread() throws IOException {

//無參數(shù)的構造函數(shù)

this('QuoteServerThread');

//以QuoteServerThread為默認值調用帶參數(shù)的構造函數(shù)

}

public QuoteServerThread(String name) throws IOException {

super(name); //調用父類的構造函數(shù)

socket=new DatagramSocket(4445);

//在端口4445創(chuàng)建數(shù)據(jù)報套接字

try{

in= new BufferedReader(new FileReader(' one-liners.txt'));

//打開一個文件,構造相應的BufferReader對象

}catch(FileNotFoundException e) { //異常處理

System.err.println('Could not open quote file. Serving time instead.');

 //打印出錯信息

}

}

public void run() //線程主體

{

while(moreQuotes) {

 try{

 byte[] buf=new byte[256]; //創(chuàng)建緩沖區(qū)

 DatagramPacket packet=new DatagramPacket(buf,buf.length);

 //由緩沖區(qū)構造DatagramPacket對象

 socket.receive(packet); //接收數(shù)據(jù)報

 String dString=null;

 if(in= =null) dString=new Date().toString();

 //如果初始化的時候打開文件失敗了,

 //則使用日期作為要傳送的字符串

 else dString=getNextQuote();

 //否則調用成員函數(shù)從文件中讀出字符串

 buf=dString.getByte();

 //把String轉換成字節(jié)數(shù)組,以便傳送

 InetAddress address=packet.getAddress();

 //從Client端傳來的Packet中得到Client地址

 int port=packet.getPort(); //和端口號

 packet=new DatagramPacket(buf,buf.length,address,port);

 //根據(jù)客戶端信息構建DatagramPacket

 socket.send(packet); //發(fā)送數(shù)據(jù)報

}catch(IOException e) { //異常處理

 e.printStackTrace(); //打印錯誤棧

 moreQuotes=false; //標志變量置false,以結束循環(huán)

}

}

socket.close(); //關閉數(shù)據(jù)報套接字

}

protected String getNextQuotes(){

//成員函數(shù),從文件中讀數(shù)據(jù)

String returnValue=null;

try {

 if((returnValue=in.readLine())= =null) {

 //從文件中讀一行,如果讀到了文件尾

 in.close( ); //關閉輸入流

 moreQuotes=false;

 //標志變量置false,以結束循環(huán)

 returnValue='No more quotes. Goodbye.';

 //置返回值

 } //否則返回字符串即為從文件讀出的字符串

}catch(IOEception e) { //異常處理

 returnValue='IOException occurred in server';

 //置異常返回值

}

return returnValue; //返回字符串

}

}

標簽: Java
相關文章:
主站蜘蛛池模板: 南京租车,南京汽车租赁,南京包车,南京会议租车-南京七熹租车 | 无痕胶_可移胶_无痕双面胶带_可移无痕胶厂家-东莞凯峰 | ET3000双钳形接地电阻测试仪_ZSR10A直流_SXJS-IV智能_SX-9000全自动油介质损耗测试仪-上海康登 | 广州印刷厂_广州彩印厂-广州艺彩印务有限公司 | 猎头招聘_深圳猎头公司_知名猎头公司 | 不锈钢钢格栅板_热浸锌钢格板_镀锌钢格栅板_钢格栅盖板-格美瑞 | 密集架-密集柜厂家-智能档案密集架-自动选层柜订做-河北风顺金属制品有限公司 | 润滑脂-高温润滑脂-轴承润滑脂-食品级润滑油-索科润滑油脂厂家 | elisa试剂盒价格-酶联免疫试剂盒-猪elisa试剂盒-上海恒远生物科技有限公司 | 重庆磨床过滤机,重庆纸带过滤机,机床伸缩钣金,重庆机床钣金护罩-重庆达鸿兴精密机械制造有限公司 | 兰州UPS电源,兰州山特UPS-兰州万胜商贸 | 深圳VI设计-画册设计-LOGO设计-包装设计-品牌策划公司-[智睿画册设计公司] | 车件|铜件|车削件|车床加工|五金冲压件-PIN针,精密车件定制专业厂商【东莞品晔】 | 焊接烟尘净化器__焊烟除尘设备_打磨工作台_喷漆废气治理设备 -催化燃烧设备 _天津路博蓝天环保科技有限公司 | China plate rolling machine manufacturer,cone rolling machine-Saint Fighter | 智成电子深圳tdk一级代理-提供TDK电容电感贴片蜂鸣器磁芯lambda电源代理经销,TDK代理商有哪些TDK一级代理商排名查询。-深圳tdk一级代理 | 粘度计NDJ-5S,粘度计NDJ-8S,越平水分测定仪-上海右一仪器有限公司 | 恒湿机_除湿加湿一体机_恒湿净化消毒一体机厂家-杭州英腾电器有限公司 | 首页|专注深圳注册公司,代理记账报税,注册商标代理,工商变更,企业400电话等企业一站式服务-慧用心 | 天津货架厂_穿梭车货架_重型仓储货架_阁楼货架定制-天津钢力仓储货架生产厂家_天津钢力智能仓储装备 | 全自动定氮仪-半自动凯氏定氮仪厂家-祎鸿仪器 | 安全阀_弹簧式安全阀_美标安全阀_工业冷冻安全阀厂家-中国·阿司米阀门有限公司 | 步进驱动器「一体化」步进电机品牌厂家-一体式步进驱动 | 3d打印服务,3d打印汽车,三维扫描,硅胶复模,手板,快速模具,深圳市精速三维打印科技有限公司 | 电杆荷载挠度测试仪-电杆荷载位移-管桩测试仪-北京绿野创能机电设备有限公司 | 品牌设计_VI设计_电影海报设计_包装设计_LOGO设计-Bacross新越品牌顾问 | 广州办公室设计,办公室装修,写字楼设计,办公室装修公司_德科 | 液压油缸生产厂家-山东液压站-济南捷兴液压机电设备有限公司 | 四川成人高考_四川成考报名网| 福建省教师资格证-福建教师资格证考试网 | 橡胶粉碎机_橡胶磨粉机_轮胎粉碎机_轮胎磨粉机-河南鼎聚重工机械制造有限公司 | 超声骨密度仪-动脉硬化检测仪器-人体成分分析仪厂家/品牌/价格_南京科力悦 | 回转窑-水泥|石灰|冶金-巩义市瑞光金属制品有限责任公司 | 校园气象站_超声波气象站_农业气象站_雨量监测站_风途科技 | 酒精检测棒,数显温湿度计,酒安酒精测试仪,酒精检测仪,呼气式酒精检测仪-郑州欧诺仪器有限公司 | 上海新光明泵业制造有限公司-电动隔膜泵,气动隔膜泵,卧式|立式离心泵厂家 | 安徽成考网-安徽成人高考网| 周易算网-八字测算网 - 周易算网-宝宝起名取名测名字周易八字测算网 | 成都亚克力制品,PVC板,双色板雕刻加工,亚克力门牌,亚克力标牌,水晶字雕刻制作-零贰捌广告 | 真空包装机-诸城市坤泰食品机械有限公司 | 亳州网络公司 - 亳州网站制作 - 亳州网站建设 - 亳州易天科技 |