国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發(fā)設計 > 正文

Java第十一次課-網(wǎng)絡編程

2019-11-17 04:03:45
字體:
供稿:網(wǎng)友
第九章
網(wǎng)絡編程

本章目錄
9.1 ip地址與網(wǎng)絡指針
9.2 Internet通信

9.1 IP地址與網(wǎng)絡指針
一、InetAddress類
InetAddress類是獲取和處理網(wǎng)絡地址信息的類,表示互聯(lián)網(wǎng)協(xié)議地址即IP地址。有兩個子類:Inet4Address類

表示互聯(lián)網(wǎng)協(xié)議第4版地址,Inet6Address類表示互聯(lián)網(wǎng)協(xié)議第6版地址。
實際工作中經(jīng)常利用InetAddress類及其方法成員進行IP地址和域名的信息處理以獲取網(wǎng)絡信息。

InetAddress類中的以下幾個方法成員適合于初始化InetAddress類對象實例:
getByName(String host)             //在給定主機名的情況下確定主機的IP地址
getAllByName(String host)       //在給定主機名的情況下,根據(jù)系統(tǒng)上配置的名稱服務返回其所有IP地址
getLocalHost()                     //返回本地主機
getByAddress(byte[] addr)          //給定原始IP地址返回InetAddress
getByAddress(String host, byte[] addr)
//給定主機名和IP地址創(chuàng)建 InetAddress
另外該類中的以下幾個方法成員經(jīng)常被用來處理對象實例從而獲得相關的網(wǎng)絡信息:
getAddress()                       //返回此InetAddress對象的原始IP地址
getCanonicalHostName()             //獲取此IP地址的完全限定域名
getHostName()                      //獲取此IP地址的主機名

//Example 9 of Chapter 9

import java.io.*;
import java.net.*;

public class NetIpAddressDatagramClientDemo
{
PRivate static DatagramSocket socket;
public static void main( String args[] )
{
  try{
   socket = new DatagramSocket();
  }
  catch( SocketException socketException )
  {
   socketException.printStackTrace();
   System.exit( 1 );
  }
  try{
   byte data[] = new byte[ 100 ];
   DatagramPacket sendPacket = new DatagramPacket( data,
    data.length, InetAddress.getLocalHost(), 1000 );
   socket.send( sendPacket );
  }
  catch ( IOException ioException )
  {
   ioException.printStackTrace();
  }
  while ( true )
  {
   try{
    byte data[] = new byte[ 100 ];
    DatagramPacket receivePacket = new DatagramPacket( data, data.length );
    socket.receive( receivePacket );
   }
   catch( IOException ioException )
   {
    ioException.printStackTrace();
   }
  }
}
}
//Example 8 of Chapter 9

import java.io.*;
import java.net.*;

public class NetIpAddressDatagramServerDemo
{
private static DatagramSocket socket;
public static void main( String args[] )
{
  try {
   socket = new DatagramSocket( 1000 );
  }
  catch( SocketException socketException )
  {
   socketException.printStackTrace();
   System.exit( 1 );
  }
  while ( true )
  {
   try{
    byte data[] = new byte[ 100 ];
    DatagramPacket rp = new DatagramPacket( data, data.length );
    socket.receive( rp );
    DatagramPacket sendPacket = new DatagramPacket(
     rp.getData(), rp.getLength(), rp.getAddress(), rp.getPort() );
    socket.send( sendPacket );
   }
   catch( IOException ioException )
   {
    ioException.printStackTrace();
   }
  }
}
}
二、URL類
在HTTP協(xié)議中,用URI(Uniform Resource Identifier)來標識Internet上的數(shù)據(jù),而用于指定文檔資料在

Internet上的確切位置的URI稱為URL(Uniform Resource Locator)。
java.net包中分別定義了URI類和URL類,用來封裝統(tǒng)一資源標識符引用和統(tǒng)一資源定位符引用。使用URL類是定

位和檢索網(wǎng)絡上數(shù)據(jù)的最簡單的方法,它是指向Internet上面的各種資源的指針。
URL對象實例可以在應用程序中代表一個網(wǎng)絡資源,可以供用戶訪問資源信息。通常,URL可分成幾個部分:協(xié)

議、主機、端口、文件路徑,另外URL后面可能還會有一個由字符“#”指示的“片段”,稱為“引用”。
下面的幾個方法成員可以分別獲取URL的各個部分及主要內(nèi)容:
getProtocol()                      //獲得此URL的協(xié)議名稱
getHost()                          //獲得此URL的主機名
getPort()                          //獲得此URL的端口號
getFile()                          //獲得此URL的文件名
getRef()                           //獲得此URL的錨點引用
getQuery()                         //獲得此URL的查詢部分
getUserInfo()                      //獲得此URL的 userInfo 部分
getAuthority()                     //獲得此URL的授權(quán)部分
getDefaultPort()                   //獲得與此URL關聯(lián)協(xié)議的默認端口號
利用URL檢索網(wǎng)絡上面的數(shù)據(jù)時,以下幾個方法成員是需要使用的:
openStream()方法用于建立由應用程序到URL指向的資源處的連接并返回一個從該資源處讀取數(shù)據(jù)的輸入流,可

以以原始字節(jié)流形式讀取資源數(shù)據(jù)。
openConnection()方法返回一個URLConnection對象,它表示到URL所引用的遠程對象即網(wǎng)絡資源的連接。
getContent()方法可以獲得此URL的內(nèi)容,這個內(nèi)容是被轉(zhuǎn)換為其它形式的。

9.2 Internet通信
一、Socket通信機制
各種網(wǎng)絡的服務器(Server)-客戶(Client)應用是十分廣泛的。套接字Socket是建立服務器-客戶通訊通道

連接的低層機制,是獨立于平臺的連接。
在Socket通訊機制中,通過Socket的數(shù)據(jù)是原始字節(jié)流信息,通訊雙方要約定數(shù)據(jù)的格式化與解釋處理工作。

在網(wǎng)絡程序設計中使用Socket通訊機制使得網(wǎng)絡上面的輸入輸出工作就如同文件的輸入輸出工作一樣,大量的

網(wǎng)絡編程細節(jié)被Socket所隱藏,程序員的工作被大大地簡化了。
Java語言在java.net包中定義了Socket類代表雙向連接中的一端,該包中同時提供了ServerSocket類便于服務

器操作。Socket是兩個程序之間用來進行雙向數(shù)據(jù)傳輸?shù)木W(wǎng)絡通訊端點,一般由一個地址加上一個端口號來標

識。


下面的幾個方法成員是非常常用的:
getInetAddress()                   //返回套接字連接的地址
getInputStream()                   //返回此套接字的輸入流
getOutputStream()                  //返回此套接字的輸出流
getPort()                          //返回此套接字連接到的遠程端口
getLocalPort()                     //返回此套接字綁定到的本地端口
getLocalAddress()                  //獲取套接字綁定的本地地址
close()                            //關閉此套接字
Socket通訊機制可以完成三項基本功能:掃描網(wǎng)絡端口、簡單通訊和TCP/IP服務器。
⒈掃描網(wǎng)絡端口:
可以使用形如:

InetAddress hostadd=InetAddress.getByName(hostname)
Socket skt = new Socket(hostadd, i)

這樣的功能語句實現(xiàn)對名為hostname的主機上的端口i的測試,如果該端口不可用,所引用的Socket類的構(gòu)造方

法將拋出IOException。
⒉簡單通訊:
可以利用Socket與某個特定的主機通過指定的端口建立連接,之后通過輸入輸出流進行數(shù)據(jù)傳輸,數(shù)據(jù)傳輸?shù)?br>
基本格式是字節(jié),也可以使用專門的輸入輸出流類進行字符傳輸、基本數(shù)據(jù)類型等操作。

⒊TCP/IP服務器:
可以使用Socket類和ServerSocket類建立一個服務器,實現(xiàn)服務器和客戶端雙向信息傳輸。程序代碼分為服務

器方和客戶方,其基本的操作步驟為:

//Example 1 of Chapter 9

import java.net.*;

public class NetIpAddressDemo1
{
public static void main(String args[])
{
  try{
   //給定IP地址獲取主機名
   InetAddress address1 = InetAddress.getByName( "159.226.3.9" );
   System.out.println( address1.getHostName() );
   System.out.println( address1.getCanonicalHostName() );
   
   //給定域名構(gòu)造InetAddress
   InetAddress address2[] = InetAddress.getAllByName( "www.apple.com" );
   for(int i = 0; i < address2.length; i++ )
   {
    System.out.println( address2[i] );
   }
   
   //獲取本地機的名稱與地址
   InetAddress address3 = InetAddress.getLocalHost();
   System.out.println( address3 );
   System.out.println( address3.getHostName() );
   System.out.println( address3.getHostAddress() );
  }
  catch(UnknownHostException e)
  {
   System.err.println( e );
  }
}
}
//Example 2 of Chapter 9

import java.net.*;

public class NetIpAddressDemo2
{
public static int getLength( InetAddress ia )
{
  byte[] address = ia.getAddress();
  if( address.length == 4 ) return 4;
  else if( address.length == 16 ) return 16;
  else return -1;
}

public static char getKind( InetAddress ia )
{
  byte[] address = ia.getAddress();
  if( address.length != 4 )
  {
   throw new IllegalArgumentException( "No IPv6 addresses!" );
  }
  int firstByte = address[ 0 ];
  if( ( firstByte & 0x80 ) == 0 ) return 'A';
  else if( ( firstByte & 0xC0 ) == 0x80 ) return 'B';
  else if( ( firstByte & 0xE0 ) == 0xC0 ) return 'C';
  else if( ( firstByte & 0xF0 ) == 0xE0 ) return 'D';
  else if( ( firstByte & 0xF8 ) == 0xF0 ) return 'E';
  else return 'F';
}

public static void main(String args[])
{
  try{
   InetAddress ia = InetAddress.getByName( "www.microsoft.com" );
   System.out.println( "IP地址長度為:" + getLength( ia ) );
   System.out.println( "IP地址種類為:" + getKind( ia ) );
  }
  catch(UnknownHostException e)
  {
   System.err.println( e );
  }
}
}

//Example 3 of Chapter 9

import java.net.*;

public class NetIpAddressDemo3
{
public static void main( String[] args )
{
  try {
   URL url = new URL( "http://www.sina.com/index.html" );
   System.out.println( "URL: " + url );
   System.out.println( "Protocal: " + url.getProtocol() );
   System.out.println( "Host: " + url.getHost() );
   System.out.println( "Port: " + url.getPort() );
   System.out.println( "File: " + url.getFile() );
   System.out.println( "REF: " + url.getRef() );
  }
  catch(MalformedURLException e)
  {
   System.out.println( e.toString() );
  }
}
}

//Example 4 of Chapter 9

import java.net.*;
import java.awt.*;
import java.awt.event.*;
import java.applet.AppletContext;
import javax.swing.*;

public class NetIpAddressDemo4 extends JApplet implements ActionListener
{
AppletContext browser;
JTextField text;
URL url;
public void init()
{
  Container container = getContentPane();
  text = new JTextField( 20 );
  container.add( text, BorderLayout.CENTER );
  text.addActionListener( this );
}

public void actionPerformed( ActionEvent e )
{
  try{
   url = new URL( text.getText() );
  }
  catch( MalformedURLException exception )
  {
   exception.printStackTrace();
  }
  browser = getAppletContext();
  browser.showDocument( url );
}
}

//Example 5 of Chapter 9

import java.net.*;
import java.io.*;

public class NetIpAddressDemo5 extends Thread
{
private static Socket socket;
public static void main( String[] args )
{
  String hostname = "localhost";
  int port = 65;
  String s;
  if( args.length > 1 )
  {
   hostname = args[0];
   port = Integer.parseInt( args[1] );
  }
  try{
   InetAddress hostaddress = InetAddress.getByName( hostname );
   try{
    socket = new Socket( hostaddress, port );
    BufferedReader buf = new BufferedReader(
     new InputStreamReader( socket.getInputStream(  ) ) );
    NetIpAddressDemo5 th = new NetIpAddressDemo5(  );
    th.start(  );
    while( ( s = buf.readLine(  ) ) != null )System.out.println( s );
    socket.close(  );
   }
   catch( IOException e )
   {
    System.out.println( e.toString(  ) );
   }
  }
  catch( UnknownHostException e )
  {
   System.out.println( e.toString(  ) );
  }
}

public void run(  )
{
  String userInput;
  BufferedReader buf;
  PrintStream pstream;
  try{
   buf = new BufferedReader( new InputStreamReader( System.in ) );
   pstream = new PrintStream( socket.getOutputStream(  ) );
   while( true )
   {
    if( socket.isClosed(  ) ) break;
    userInput = buf.readLine(  );
    pstream.println( userInput );
   }
  }
  catch( IOException e )
  {
   System.out.println( e.toString(  ) );
  }
}
}


二、Datagram通訊機制
Socket工作方式是一種連接方式,其特點是通訊穩(wěn)定可靠,輸入輸出操作始終在同一對進程之間進行。
數(shù)據(jù)報Datagram是一種非連接方式,通訊數(shù)據(jù)經(jīng)過不確定的路徑傳向目的地,可靠性和正確性都不能保證,可

能會重復到達目的地,甚至還可能根本到不了目的地。
Java語言通過UDP(User Datagram Protocol)實現(xiàn)Datagram通訊機制。
在java.net包中定義了DatagramPacket和DatagramSocket兩個類用來支持數(shù)據(jù)報通信。
DatagramPacket類表示數(shù)據(jù)報包,發(fā)送方可以用DatagramPacket構(gòu)造一個數(shù)據(jù)報,其中包含擬發(fā)送的數(shù)據(jù)和目

的地址及端口;接收方可以用DatagramPacket構(gòu)造一個數(shù)據(jù)報用于接收發(fā)送方發(fā)來的數(shù)據(jù)報。
DatagramSocket類表示用來發(fā)送和接收數(shù)據(jù)報包的套接字,代表數(shù)據(jù)報傳送的發(fā)送和接收點,主要用來讀/寫稱

為報文的數(shù)據(jù)報中的數(shù)據(jù)。
發(fā)送數(shù)據(jù)報用該類的send()方法,接收數(shù)據(jù)報用該類的receive()方法。
創(chuàng)建DatagramSocket類對象實例時如果構(gòu)造方法不能將DatagramSocket與指定的端口綁定在一起,將拋出

SocketException異常,所以程序代碼中要有相應的處理措施。
//Example 6 of Chapter 9

import java.net.*;
import java.io.*;

public class NetIpAddressSocketServerDemo
{
public static void main( String[] args )
{
  try{
   boolean flag = true;
   Socket Socket = null;
   String InputLine;
   
   ServerSocket serverSocket = new ServerSocket( 0 );
   System.out.println( "服務器等待:" + serverSocket.getLocalPort() );
   while( flag )
   {
    Socket = serverSocket.accept();
    DataInputStream is = new DataInputStream(
     new BufferedInputStream( Socket.getInputStream() ) );
    PrintStream os = new PrintStream(
     new BufferedOutputStream( Socket.getOutputStream() ) );
    while( ( InputLine = is.readLine( ) )!= null )
    {
     if( InputLine.equals( "The End" ) )
     {
      flag = false;
      break;
     }
     os.println( InputLine );
     os.flush();
    }
    os.close();
    is.close();
    Socket.close();
   }
   serverSocket.close();
  }
  catch( IOException e )
  {
   System.out.println( e.toString(  ) );
  }
}
}
//Example 7 of Chapter 9

import java.net.*;
import java.io.*;

public class NetIpAddressSocketClientDemo
{
public static void main( String[] args )
{
  try{
   Socket clientSocket = new Socket( "myhost", 15 );
   OutputStream os = clientSocket.getOutputStream();
   DataInputStream is = new DataInputStream( clientSocket.getInputStream() );
   int a;
   String ResponseLine;
   while( ( a = System.in.read() )!= -1 )
   {
    os.write( ( byte ) a );
    if( a == '/n' )
    {
     os.flush();
     ResponseLine = is.readLine( );
     System.out.println( "客戶端:" + ResponseLine );
    }
   }
   os.close();
   is.close();
   clientSocket.close();
  }
  catch( IOException e )
  {
   System.out.println( e.toString(  ) );
  }
}
}
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 松江区| 阳信县| 凭祥市| 卢氏县| 山东省| 玛沁县| 正阳县| 安塞县| 永昌县| 平遥县| 寿光市| 桂平市| 双桥区| 罗定市| 佛学| 斗六市| 海伦市| 吴桥县| 临漳县| 沂源县| 宁强县| 舒兰市| 从江县| 齐河县| 芜湖县| 宜宾市| 乌苏市| 苍南县| 枝江市| 南阳市| 南靖县| 莒南县| 米易县| 吉木乃县| 阿鲁科尔沁旗| 东台市| 宁南县| 资中县| 峨边| 五大连池市| 巩留县|