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.mzph.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…