2018-2019-2 20175328 《Java程序設計》第十一周學習總結

十三章主要內容——Java網絡編程


一、URL類

URL類是java.net包中的一個重要的類,URL的實例封裝著一個統一資源定位符(Uniform Resource Locator),使用URL創建對象的應用程序稱作客戶端程序。

一個URL對象通常包含最基本的三部分信息:協議、地址、資源。

(一)URL的構造方法

URL類通常使用如下的構造方法創建一個URL對象:

public URL(String spec) throws MalformedURLException

public URL(String protocol, String host,String file) throws MalformedURLException

(二)讀取URL中的資源

URL對象調用

InputStream openStream()

方法可以返回一個輸入流,該輸入流指向URL對象所包含的資源。通過該輸入流可以將服務器上的資源讀入到客戶端。


二、InetAdress類

(一)地址的表示

Internet上的主機有兩種方式表示地址:

1.域名

例如 www.tsinghua.edu.cn

2.IP地址

例如 202.108.35.210

java.net包中的InetAddress類對象含有一個Internet主機地址的域名和IP地址,例如 www.sina.com.cn/202.108.37.40 。

(二)獲取地址

1.獲取Internet上主機的地址

可以使用InetAddress類的靜態方法getByName(String s);

獲得一個InetAddress對象,該對象含有主機地址的域名和IP地址,該對象用如下格式表示它包含的信息:

www.sina.com.cn/202.108.37.40

2.獲取本地機的地址

我們可以使用InetAddress類的靜態方法getLocalHost()獲得一個InetAddress對象,該對象含有本地機的域名和IP地址。


三、套接字

套接字

IP地址標識Internet上的計算機,端口號標識正在計算機上運行的進程(程序)。端口號被規定為一個16位的0~65535之間的整數。

當兩個程序需要通信時,它們可以通過使用Socket類建立套接字對象并連接在一起(端口號與IP地址的組合得出一個網絡套接字)。

(二)客戶端套接字

客戶端的程序使用Socket類建立負責連接到服務器的套接字對象。

建立連接到服務器的套接字對象:

try{  Socket mysocket=new Socket(“http://192.168.0.78”,1880);}
catch(IOException e)
{  }

mysocket相關的方法

getInputStream()獲得一個輸入流

getOutputStream()獲得一個輸出流

getInputStream()得到的輸入流接到另一個DataInputStream數據流上

getOutputStream()得到的輸出流接到另一個DataOutputStream數據流上

(三)ServerSocket對象與服務器端套接字

1、

服務器必須建立一個ServerSocket對象,該對象通過將客戶端的套接字對象和服務器端的一個套接字對象連接起來,從而達到連接的目的。

建立ServerSocket對象:

try{  ServerSocket  serverForClient =new ServerSocket(2010);}catch(IOException e){}

使用方法accept()將客戶的套接字和服務器端的套接字連接起來,代碼如下所示:

try{  Socket sc= serverForClient .accept();}catch(IOException e){}

所謂“接收”客戶的套接字連接就是accept()方法會返回一個和客戶端Socket對象相連接的Socket對象。

2、

客戶端的套接字獲得的輸入\輸出流和服務器端的套接字獲得的輸出\輸入流互相連接

(四)使用多線程技術

為了防止堵塞線程,服務器端收到一個客戶的套接字后,就應該啟動一個專門為該客戶服務的線程。

在下面的例子4中,客戶使用Socket類不帶參數的構造方法Socket()創建一個套接字對象,該對象需調用

public void connect(SocketAddress endpoint) throws IOException

請求和參數SocketAddress指定地址的套接字建立連接。

為了使用connect方法,可以使用SocketAddress的子類InetSocketAddress創建一個對象,InetSocketAddress的構造方法是:

InetSocketAddress(InetAddress addr, int port)

四、UDP數據報

基于UDP的通信和基于TCP的通信不同,基于UDP的信息傳遞更快,但不提供可靠性保證。

基于UDP通信的基本模式是:

1.將數據打包,稱為數據包(好比將信件裝入信封一樣),然后將數據包發往目的地。

2.接受別人發來的數據包(好比接收信封一樣),然后查看數據包中的內容。

(一)發送數據包

1.用DatagramPacket類將數據打包,即用DatagramPacket類創建一個對象,稱為數據包。用DatagramPacket的以下兩個構造方法創建待發送的數據包:

DatagramPacket(byte data[],int length,InetAddtress address,int port)
DatagramPack(byte data[],int offset,int length,InetAddtress address,int port)

2.用DatagramSocket類的不帶參數的構造方法:DatagramSocket()創建一個對象,該對象負責發送數據包。例如:

DatagramSocket  mail_out=new DatagramSocket();
mail_out.send(data_pack); 

(二)接收數據包

1. 首先用DatagramSocket的另一個構造方法DatagramSocket(int port) 創建一個對象,其中的參數必須和待接收的數據包的端口號相同。例如,如果發送方發送的數據包的端口是5666,那么如下創建DatagramSocket對象:

DatagramSocket mail_in=new DatagramSocket(5666);

2. 然后對象mail_in使用方法receive(DatagramPacket pack)接受數據包。

3.用 DatagramPack類的另外一個構造方法: DatagramPack(byte data[],int length)創建一個數據包,用于接收數據包,例如:

byte data[]=new byte[100];int length=90;DatagramPacket pack=new DatagramPacket(data,length);mail_in.receive(pack); 

該數據包pack將接收長度是length字節的數據放入data。


五、廣播數據報

廣播數據報涉及到地址和端口。

廣播數據報是一種較新的技術,要廣播或接收廣播的主機都必須加入到同一個D類地址。


六、Java 遠程調用(RMI)

Java遠程調用,RMI(Remote Method Invocation)是一種分布式技術,使用RMI可以讓一個虛擬機(JVM)上的應用程序請求調用位于網絡上另一處的JVM上的對象方法。習慣上稱發出調用請求的虛擬機(JVM)為(本地)客戶機,稱接受并執行請求的虛擬機(JVM)為(遠程)服務器。

(一)遠程對象及其代理

1.遠程對象:

駐留在(遠程)服務器上的對象是客戶要請求的對象,稱作遠程對象。

2.代理與存根(Stub):

代理的特點是它與遠程對象實現了相同的接口。

存根(Stub):一種特殊的字節碼,并讓這個存根產生的對象為作為遠程對象的代理。

3.Remote接口

RMI為了標識一個對象是遠程對象,即可以被客戶請求的對象,要求遠程對象必須實現java.rmi包中的Remote接口,也就是說只有實現該接口的類的實例才被RMI認為是一個遠程對象。

(二)RMI的設計細節

1.擴展Remote接口

定義一個接口是java.rmi包中Remote的子接口,即擴展Remote接口。

RemoteSubject.java 

2.遠程對象

創建遠程對象的類必須要實現Remote接口,RMI使用Remote接口來標識遠程對象,但是Remote中沒有方法,因此創建遠程對象的類需要實現Remote接口的一個子接口。RemoteConcreteSubject.java

3.存根(Stub)與代理:RMI使用rmic命令生成存根

RemoteConcreteSubject_Stub.class

4.啟動注冊rmiregistry: 執行rimregistry命令

5.啟動遠程對象服務:遠程服務器使用java.rmi包中的Naming類調用其類方法rebind(String name, Remote obj)綁定一個遠程對象到rmiregistry所管理的注冊表中,該方法的name參數是URL格式,obj參數是遠程對象,將來客戶端的代理會通過name 找到遠程對象obj。 BindRemoteObject.java

6.運行客戶端程序:遠程服務器啟動遠程對象服務后,客戶端就可以運行有關程序,訪問使用遠程對象。 ClientApplication.java

轉載于:https://www.cnblogs.com/seven-moon/p/10854329.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/386822.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/386822.shtml
英文地址,請注明出處:http://en.pswp.cn/news/386822.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

修改Header方法

/*** 修改header信息&#xff0c;key-value鍵值對兒加入到header中,如果存在&#xff0c;替換* param request* param key* param value*/ public static void reflectRequestParam(HttpServletRequest request, String key, String value){Class<? extends HttpServletReq…

pytorch學習筆記 1. pytorch基礎 tensor運算

pytorch與tensorflow是兩個近些年來使用最為廣泛的機器學習模塊。開個新坑記錄博主學習pytorch模塊的過程&#xff0c;不定期更新學習進程。 文章較為適合初學者&#xff0c;歡迎對代碼和理解指點討論&#xff0c;下面進入正題。 import torch import numpy as npt1 torch.te…

2019年區塊鏈的主旋律是中間層協議

2019年區塊鏈的主旋律是中間層協議 過去一年加密資產市場從其峰值下跌超過85%的市值。但對我&#xff0c;一個堅定的區塊鏈企業家&#xff0c;這實際上是一件好事&#xff0c;區塊鏈的未來看起來比以往任何時候都更有希望。2017年ICO熱潮開始的瘋狂至少產生了一個強烈的積極影響…

Java枚舉的內容可以使用map的方式

枚舉的內容可以使用map的方式 package com.chinamobile.framework.common.enums;import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils;import java.util.ArrayList; import java.util.HashMap; import java.util.List; import jav…

tensorflow gpu windows配置步驟教學

本文主要針對在windows10環境下的tensorflow配置問題&#xff0c;在linux和mac等其他環境中的配置就不過多贅述(windows總是那個問題最多的環境&#xff0c;建議使用linux &#x1f603;)。 本文中配置的環境為 python 3.8.5 tensorflow-gpu 2.4.1 1. 更新nvidia顯卡驅動至最…

numpy一維數組永遠為列向量

import numpy as np a np.array([1,3,4,5]) print(a.shape) a np.transpose(a) print(a.shape) print(a)a np.ravel(a) print(a.shape) print(a)a a.reshape((1,4)) print(a.shape)輸出如下 (4,) (4,) [1 3 4 5] (4,) [1 3 4 5] (1, 4)我們會發現&#xff0c;對于一維的數…

【BJOI 2019】奧術神杖

題意 你有一個長度為 $n$ 的模板串&#xff08;由 $0-9$ 這 $10$ 個數字和通配符 $.$ 組成&#xff09;&#xff0c;還有 $m$ 個匹配串&#xff08;只由 $0-9$ 這 $10$ 個數字組成&#xff09;&#xff0c;每個匹配串有一個魔力值 $v_i$。你要把模板串的每個 $.$ 都換成一個數字…

keras模型中的默認初始化權重

權重的初始化&#xff0c;決定了模型訓練的起點。一個良好的初始化可以加快訓練過程&#xff0c;同時避免模型收斂至局部最小值。為了在訓練過程中避免使得權重的變化總沿著同一個方向&#xff0c;我們盡量避免將所有權重都初始化為同一個值&#xff0c;如全0矩陣或全1矩陣。 …

java oracle的枚舉錯誤

public enum OracleErrorTypeEnum implements BaseEnum {ORA00001("ORA-00001","不允許有重復的數據"),ORA00017("ORA-00017","請求會話以設置跟蹤事件"),ORA00018("ORA-00018","超出最大會話數"),ORA00019(&quo…

C# 篇基礎知識10——多線程

1.線程的概念 單核CPU的計算機中&#xff0c;一個時刻只能執行一條指令&#xff0c;操作系統以“時間片輪轉”的方式實現多個程序“同時”運行。操作系統以進程&#xff08;Process&#xff09;的方式運行應用程序&#xff0c;進程不但包括應用程序的指令流&#xff0c;也包括運…

keras中mean square error均方誤差理解

機器學習中&#xff0c;針對不同的問題選用不同的損失函數非常重要&#xff0c;而均方誤差就是最基本&#xff0c;也是在解決回歸問題時最常用的損失函數。本文就keras模塊均方誤差的計算梳理了一些細節。 首先看一下均方誤差的數學定義 : 均方誤差是預測向量與真實向量差值的…

Java并發Semaphore信號量的學習

public class MyThreadTest {private final static Semaphore semaphore new Semaphore(2);// 設置2個車位public static void main(String[] args) {System.out.println("start");p(semaphore, true, 1);p(semaphore, false, 2);p(semaphore, false, 3);p(semaphor…

快速理解binary cross entropy 二元交叉熵

Binary cross entropy 二元交叉熵是二分類問題中常用的一個Loss損失函數&#xff0c;在常見的機器學習模塊中都有實現。本文就二元交叉熵這個損失函數的原理&#xff0c;簡單地進行解釋。 首先是二元交叉熵的公式 : Loss?1N∑i1Nyi?log?(p(yi))(1?yi)?log(1?p(yi))Loss …

Docker搭建自己的GitLab

Docker搭建自己的GitLab docker 介紹 **GitLab: ** GitLab 是一個用于倉庫管理系統的開源項目&#xff0c;使用Git作為代碼管理工具&#xff0c;并在此基礎上搭建起來的web服務 **Docker: ** Docker 是一個開源的應用容器引擎&#xff0c;讓開發者可以打包他們的應用以及依賴…

kolla-ansible-----常用命令

常用命令 kolla-ansible prechecks -i multinode #部署前環境檢測 kolla-genpwd #生成/etc/kolla/password.yml密碼配置文件 kolla-ansible post-deploy -i multinode #生成認證文件 kolla-ansible mariadb_recovery -i /opt/mutinode #恢復數據庫 kolla-ansible -i multi…

python numpy 分離與合并復數矩陣實部虛部的方法

在進行數字信號處理的過程中&#xff0c;我們往往有對短時傅里葉變換頻譜(spectrogram)進行分析的需求。常見的分析手段對應歐拉公式分為兩種&#xff0c;要么使用模與相位的形式&#xff0c;要么使用實部虛部。本文分享一個簡單的將復數光譜圖分解為實部與虛部以及將兩個部分重…

flowable 任務節點多實例使用

我們在使用Flowable 工作流引擎的時候&#xff0c;最常用的肯定是任務節點&#xff0c;因為在OA系統、審批系統、辦公自動化系統中核心的處理就是流程的運轉&#xff0c;在流程運轉的時候&#xff0c;可能我們有這樣的一個需求&#xff0c;在一個任務節點的時候&#xff0c;我們…

LeetCode Range Sum Query Immutable

2131231轉載于:https://www.cnblogs.com/ZHONGZHENHUA/p/10873807.html

如何使用python導入mat格式的數據并整理

mat格式是一般而言的matlab數據的存儲格式&#xff0c;對于經常要混用matlab和python的數據處理相關的問題&#xff0c;我們往往需要將matlab中的數據導入至python&#xff0c;本文給出了相關的方法。 from scipy.io import loadmat import numpy as npdict_mat loadmat(&quo…