「java网络模式」网络型模式

博主:adminadmin 2023-01-17 18:12:07 162

本篇文章给大家谈谈java网络模式,以及网络型模式对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

java网络编程的基本内容有哪些?其特点和优势如何?请进行论述。

1.用Java编写网络程序是非常简单的——至少比在现有其他编程环境下要简单得多。本书的新版本带给开发者的是Java发展的最新特性。一旦开始使用Java的网络API进行网络编程,我们能做到可以想像到的一切事情。 本书对开发网络程序进行了非常完整的介绍(从应用程序和applet两方面),它包括了从网络基础到远程方法调用(RMI)的所有内容。本书的章节涵盖了TCP和UDP套接字、组播、内容和协议处理器以及两个新的API:JSSE(SSL实现)和JavaMail API。扩充了I/O和多线程等基础知识。还讲述了在不直接编写网络代码时你所能够实现的内容,例如如何用URL实现自己的目标、applet的基本功能以及如何用Swing处理HTML。无论是有经验的网络程序员还是只想随意看一看的初学者,都会发现本书对于Java的网络程序类的学习是相当完整的。本书内容涵盖了:1、Java 2(JDK 1.2和1.3)和Java1.1。2、许多完整的程序(可在线获取)。3、网络编程基础的所有方面。4、一些高级专题,包括RMI和组播。5、许多重要的API,有JSSE、JavaMail以及Swing中的HTML解析器。Elliotte Rusty Harold是著名的Java网站Cafe Au Lait的作者(http://metalab.unc.edu/javafaq),国际知名的计算机专家。他是《Java I/O》以及其他一些Java和XML技术图书的作者。 “直到找到这本书之后,我才开始真正理解Java网络编程。”——Bruce Eckel,《Java编程思想》的作者.

2.JAVA的特点§ 1.2 Java的特点

Java是一个广泛使用的网络编程语言 ,它是一种新的计算概念。

首先 ,作为一种程序设计语言 ,它简单、面向对象、不依赖于机器的结构、

具有可移植性、鲁棒性、安全性、并且提供了并发的机制、具有很高的性能。其

次 ,它最大限度地利用了网络 ,Java的小应用程序 (applet)可在网络上传输而

不受 CPU和环境的限制。另外 ,Java还提供了丰富的类库 ,使程序设计者可以很

方便地建立自己的系统。

下面我们分别从这三个方面来讨论 Java的特点 ,然后通过把 Java与 C,

C++相比进一步指出它所具有的优点。

一、 Java语言

Java语言有下面一些特点 :简单、面向对象、分布式、解释执行、鲁棒、

安全、体系结构中立、可移植、高性能、多线程以及动态性。

:1.简单性

Java语言是一种面向对象的语言 ,它通过提供最基本的方法来完成指定的

任务 ,只需理解一些基本的概念 ,就可以用它编写出适合于各种情况的应用程

序。 Java略去了运算符重载、多重继承等模糊的概念 ,并且通过实现自动垃圾

收集大大简化了程序设计者的内存管理工作。另外 ,Java也适合于在小型机上运

行 ,它的基本解释器及类的支持只有 40KB左右 ,加上标准类库和线程的支持也

只有 215KB左右。库和线程的支持也只有 215KB左右。

2.面向对象

Java语言的设计集中于对象及其接口 ,它提供了简单的类机制以及动态的

接口模型。对象中封装了它的状态变量以及相应的方法 ,实现了模块化和信息

隐藏 ;而类则提供了一类对象的原型 ,并且通过继承机制 ,子类可以使用父类

所提供的方法 ,实现了代码的复用。

3.分布性

Java是面向网络的语言。通过它提供的类库可以处理 TCP/IP协议 ,用户

可以通过 URL地址在网络上很方便地访问其它对象。

4.鲁棒性

Java在编译和运行程序时 ,都要对可能出现的问题进行检查 ,以消除错误

的产生。它提供自动垃圾收集来进行内存管理 ,防止程序员在管理内存时容易

产生的错误。通过集成的面向对象的例外处理机制 ,在编译时,Java提示出可能

出现但未被处理的例外 ,帮助程序员正确地进行选择以防止系统的崩溃。另外,

Java在编译时还可捕获类型声明中的许多常见错误 ,防止动态运行时不匹配问题

的出现。

5.安全性

用于网络、分布环境下的 Java必须要防止病毒的入侵。 Java不支持指针,

一切对内存的访问都必须通过对象的实例变量来实现 ,这样就防止程序员使用

"特洛伊 "木马等欺骗手段访问对象的私有成员 ,同时也避免了指针操作中容易

产生的错误。

6.体系结构中立

Java解释器生成与体系结构无关的字节码指令 ,只要安装了 Java运行时

系统 ,Java程序就可在任意的处理器上运行。这些字节码指令对应于 Java虚拟

机中的表示 ,Java解释器得到字节码后 ,对它进行转换 ,使之能够在不同的平

台运行。

7.可移植性

与平台无关的特性使 Java程序可以方便地被移植到网络上的不同机器。

同时 ,Java的类库中也实现了与不同平台的接口 ,使这些类库可以移植。另外,

Java编译器是由 Java语言实现的 ,Java运行时系统由标准 C实现 ,这使得Java

系统本身也具有可移植性。

8.解释执行

Java解释器直接对 Java字节码进行解释执行。字节码本身携带了许多

编译时信息 ,使得连接过程更加简单。

9.高性能

和其它解释执行的语言如 BASIC、 TCL不同 ,Java字节码的设计使之能

很容易地直接转换成对应于特定CPU的机器码 ,从而得到较高的性能。

10.多线程

多线程机制使应用程序能够并行执行 ,而且同步机制保证了对共享数据

的正确操作。通过使用 多线程 ,程序设计者可以分别用不同的线程完成特定

的行为 ,而不需要采用全局的事件循环机制 ,这样就很容易地实现网络上的实

时交互行为。

11.动态性

Java的设计使它适合于一个不断发展的环境。在类库中可以自由地加入

新的方法和实例变量而不会影响用户程序的执行。并且 Java通过接口来支持

多重继承 ,使之比严格的类继承具有更灵活的方式和扩展性。

参考资料:

3.Java已用动态的交互应用软件使Web栩栩如生。它使开发人员

具有‘编写一次到处运行TM”的巨大能力。而且,借助其JavaAPI

及其编程语言上的Java虚拟机,它已产生一种分布信息的崭新模式。

这种模式叫做Java企业计算,正在帮助各企业以各种不同的方法取

得竞争优势。网管和控制已大大简化。软件分配基本上是免费的,

而且立即可实现。电子贸易已获得。占有成本大幅度降低。信息和

应用软件到处可存取。

Java建立在简单的前提基础上,即所有微处理器都应讲同一种

语言——所有内部采用芯片的产品都应能一起工作,无缝而方便地

共享信息。它已经改变企业和个人同Internet大交道的方式。现在,

它正在对消费类产品产生明显的影响,而且从总体上更加深刻地影

响企业计算。

借助Java,您可自由自在地使用您已拥有的硬件和软件。这是因

为Java是独立于平台的。它还可使您超越企业计算,使应用软件在便

携式计算机、信息亭、电视、蜂窝电话和其他大量设备上运行。

全世界的公司都已发现Java数不胜数的用途。所有用途可从其无

可比拟的能力,即提高可靠性、安全性和简化各种不同计算产品和

环境的能力中受益非浅,而且节省的时间和费用十分可观。

Java无处不在。它已拥有几百万个用户,其发展速度要快于在它

以前的其他任何一种计算机产品。它可位于任何地方,而且能到处运

行。Java正在迅速被用做传播信息的事实上标准,这是因为它既可给

企业,也可给最终用户带来似乎数不清的好处。

java网络io模型有几种

#BIO---Blocking IO

- 每个socket一个线程,读写时线程处于阻塞状态。

优点:实现简单

缺点:无法满足高并发,高接入的需求

- 不使用线程池的BIO模型,除了无法满足高并发需求外,由于需要为每个请求创建一个线程,还可能因为接入大量不活跃连接而耗尽服务器资源。

- 使用线程池的BIO模型,虽然控制了线程数量,但由于其本质上读写仍是阻塞的,仍无法满足高并发需求。

#NIO---Non-Blocking IO(非阻塞IO)

##非阻塞IO和多路复用

非阻塞IO和多路复用实际上是两个不用的概念,由于两者通常结合在一起使用,因此两者往往被混为一谈。下面我将试着分清这两个概念:

###非阻塞IO

与BIO相对应,非阻塞IO的读写方法无论是否有数据都立即返回,因此可以通过轮询方式来实现,但轮询方式的效率并不比BIO有显著提高,因为每个连接仍然需要占用一个线程。下面是轮询方式实现的IO模式图:

###多路复用

- 多路复用结合非阻塞IO能够明显提高IO的效率,这也是Java1.4把非阻塞IO和多路复用同时发布的原因。

- 多路复用的核心是多路复用器(Selector),它是需要操作系统底层支持的,简单的说,就是进程把多个socket和它们关心的事件(比如连接请求或数据已准备好)都注册在多路复用器上,操作系统会在事件发生时通知多路复用器,这样进程就可以通过多路复用器知道在那个socket上发生了什么时间,从而进行对应的处理。

- 多路复用的优点在于只需要一个线程监测(阻塞或轮询方式均可)多路选择器的状态,只有在有事件需要发生时才会真正的创建线程进行处理,因此更适合高并发多接入的应用环境。

- 在Linux系统下,多路复用的底层实现是epoll方法,与select/poll的顺序扫描不同,epoll采用效率更高的事件驱动方式,而且epoll方式并没有socket个数限制。

##BIO和NIO的比较

- BIO适用于连接长期保持的应用,比如一个复杂系统中模块之间通过长连接来进行通信。

- NIO加多路复用的模式更适合短连接、高并发、多接入的情形,比如网络服务器。

##NIO网络编程的常用接口

##Reactor模式

Reactor模式用于解决事件分发处理的问题,Handler把自己的channel和关注的事件注册到Selector中,当对应的事件发生在自己的channel上时,对应的handler就会得到通知并进行处理。

- 单线程的Reactor

消息的分发、读写、处理都在一个线程中处理,是Reactor最简单的实现方式,如果消息的处理需要较长时间,会影响效率。

```java

//Reactor类,负责分发事件并调用对应的handler

class Reactor implements Runnable {

final Selector selector;

final ServerSocketChannel serverSocket;

//Reactor初始化

Reactor(int port) throws IOException {

selector = Selector.open();

serverSocket = ServerSocketChannel.open();

serverSocket.socket().bind(new InetSocketAddress(port));

serverSocket.configureBlocking(false); //必须配置为非阻塞

//Acceptor会在Reactor初始化时就注册到Selector中,用于接受connect请求

SelectionKey sk = serverSocket.register(selector, SelectionKey.OP_ACCEPT);

sk.attach(new Acceptor()); //attach callback object, Acceptor

}

//分发消息并调用对应的handler

public void run() {

try {

while (!Thread.interrupted()) {

selector.select();

Set selected = selector.selectedKeys();

Iterator it = selected.iterator();

while (it.hasNext())

dispatch((SelectionKey)(it.next()); //Reactor负责dispatch收到的事件

selected.clear();

}

} catch (IOException ex) { /* ... */ }

}

void dispatch(SelectionKey k) {

Runnable r = (Runnable)(k.attachment()); //调用之前注册的callback对象

if (r != null)

r.run();

}

//Acceptor也是一个handler,负责创建socket并把新建的socket也注册到selector中

class Acceptor implements Runnable { // inner

public void run() {

try {

SocketChannel c = serverSocket.accept();

if (c != null)

new Handler(selector, c);

}

catch(IOException ex) { /* ... */ }

}

}

}

//Concrete Handler:用于收发和处理消息。

//在当前的实现中,使用Runnable接口作为每个具体Handler的统一接口

//如果在处理时需要参数和返回值,也可以为Handler另外声明一个统一接口来代替Runnable接口

final class Handler implements Runnable {

final SocketChannel socket;

final SelectionKey sk;

ByteBuffer input = ByteBuffer.allocate(MAXIN);

ByteBuffer output = ByteBuffer.allocate(MAXOUT);

static final int READING = 0, SENDING = 1;

int state = READING;

Handler(Selector sel, SocketChannel c) throws IOException {

socket = c; c.configureBlocking(false);

// Optionally try first read now

sk = socket.register(sel, 0);

sk.attach(this); //将Handler作为callback对象

sk.interestOps(SelectionKey.OP_READ); //第二步,接收Read事件

sel.wakeup();

}

boolean inputIsComplete() { /* ... */ }

boolean outputIsComplete() { /* ... */ }

void process() { /* ... */ }

public void run() {

try {

if (state == READING) read();

else if (state == SENDING) send();

} catch (IOException ex) { /* ... */ }

}

void read() throws IOException {

socket.read(input);

if (inputIsComplete()) {

process();

state = SENDING;

// Normally also do first write now

sk.interestOps(SelectionKey.OP_WRITE); //第三步,接收write事件

}

}

void send() throws IOException {

socket.write(output);

if (outputIsComplete()) sk.cancel(); //write完就结束了, 关闭select key

}

}

//上面 的实现用Handler来同时处理Read和Write事件, 所以里面出现状态判断

//我们可以用State-Object pattern来更优雅的实现

class Handler { // ...

public void run() { // initial state is reader

socket.read(input);

if (inputIsComplete()) {

process();

sk.attach(new Sender()); //状态迁移, Read后变成write, 用Sender作为新的callback对象

sk.interest(SelectionKey.OP_WRITE);

sk.selector().wakeup();

}

}

class Sender implements Runnable {

public void run(){ // ...

socket.write(output);

if (outputIsComplete()) sk.cancel();

}

}

}

```

- 多线程Reacotr

处理消息过程放在其他线程中执行

```java

class Handler implements Runnable {

// uses util.concurrent thread pool

static PooledExecutor pool = new PooledExecutor(...);

static final int PROCESSING = 3;

// ...

synchronized void read() { // ...

socket.read(input);

if (inputIsComplete()) {

state = PROCESSING;

pool.execute(new Processer()); //使用线程pool异步执行

}

}

synchronized void processAndHandOff() {

process();

state = SENDING; // or rebind attachment

sk.interest(SelectionKey.OP_WRITE); //process完,开始等待write事件

}

class Processer implements Runnable {

public void run() { processAndHandOff(); }

}

}

```

- 使用多个selector

mainReactor只负责处理accept并创建socket,多个subReactor负责处理读写请求

```java

Selector[] selectors; //subReactors集合, 一个selector代表一个subReactor

int next = 0;

class Acceptor { // ...

public synchronized void run() { ...

Socket connection = serverSocket.accept(); //主selector负责accept

if (connection != null)

new Handler(selectors[next], connection); //选个subReactor去负责接收到的connection

if (++next == selectors.length) next = 0;

}

}

```

#AIO

AIO是真正的异步IO,它于JDK1.7时引入,它和NIO的区别在于:

- NIO仍然需要一个线程阻塞在select方法上,AIO则不需要

- NIO得到数据准备好的消息以后,仍然需要自己把消息复制到用户空间,AIO则是通过操作系统的支持把数据异步复制到用户空间以后再给应用进程发出信号。

在本地还可以上手机QQ到外地就上不去了

重启手机再登录QQ;或重启手机,下载新版本再登录。有时候手机卡或手机系统故障(比如您刷了机),或是开启了网络防火墙也会导致无法登录QQ。

手机能够正常上网,并不意味着能登录手机QQ,它们连接的方式和协议是不同的。还需要对手机进行java设置,部分手机的网络设置和java设置是分开的,具体方法:

索爱手机的上网设置:

1.添加数据帐户:

a)添加cmwap数据帐户:进入“连接设置”-“数据通信”-“数据帐户”,选择“添加帐户”,依次作如下设置:

帐户类型―GPRS数据

名称―移动梦网(gprs)

APN―cmwap

用户名,密码不填

b)添加cmnet数据帐户:

帐户类型―GPRS数据

名称―GPRS连接互联网

APN―cmnet

用户名,密码不填

2.添加java上网模式

a)进入“连接设置”-“java设定”,选择“添加模式”:

输入名称―java连接

连接方式―选择刚才增加的那个数据账户,保存

b)移动光标到刚才添加的模式上,右功能键选择“更多”-“设置”,设置如下:

互联网模式―HTTP

使用代理―是

代理地址―10.0.0.172

端口号―80

用户名密码不填,保存

c)选择刚设定的[java连接]模式

诺基亚手机的上网设置:

1.添加数据帐户

a) 添加cmwap数据帐户:进入“设置”-“配置设置”-“个人配置设置”, 选择“新增”,增加一个接入点, 依次作如下设置:

帐户类型―GPRS数据

名称―移动梦网(gprs)

APN―cmwap

用户名,密码不填

b)添加cmnet数据帐户:

帐户类型―GPRS数据

名称―GPRS连接互联网

APN―cmnet

用户名,密码不填

返回上一级菜单“配置设置”,在“首选接入点”中选择上一步新增的接入点。

2.选择java上网模式

S60的手机,在连接时会自动出现连接点的选择,您只需选择之前已设置好的连接点就可以了。

这些应该足够你能上去聊QQ了。

手机QQ上网掉线,然后显示出错是ID=14

请您查看您的手机网络和手机JAVA设置是否正常,因诺基亚和索爱手机JAVA需要单独设置,请您参考以下设置方法:

一、索爱手机完整的上网设置(主要针对水货手机,行货用默认设置即可):

1、添加数据帐户

a、添加cmwap数据帐户:进入连接设置-数据通信-数据帐户,选择 [添加帐户],依次作如下设置:

帐户类型—GPRS数据

名称—移动梦网(gprs)

APN—cmwap

用户名,密码不填

b、添加cmnet数据帐户:同上,区别是名称使用“GPRS连接互联网”,APN—cmnet。

2、添加java上网模式

a、进入 连接设置-java设定,选择 [添加模式],输入名称—java连接,连接方式—选择刚才增加的两个数据帐户中的一个,保存;

b、移动光标到刚才添加的模式上,右功能键选择 更多-设置,设置如下:互联网模式—HTTP,使用代理—是,代理地址—10.0.0.172,端口号—80,用户名密码不填,保存;

c、选择刚设定的java连接模式。

对行货用户,只要在 java设定 中选 java连接模式就可以了,如果该模式被用户修改过,照上面的步骤改过来即可。

二、诺基亚手机完整的java设置:

1、添加数据帐户

a、添加cmwap数据帐户:进入“设置”-》“配置设置”-》“个人配置设置”, 选择“新增”,增加一个接入点,依次作如下设置:

帐户类型—GPRS数据

名称—移动梦网(gprs)

APN—cmwap

用户名,密码不填

b、添加cmnet数据帐户:同上,区别是名称使用“GPRS连接互联网”,APN—cmnet

返回上一级菜单“配置设置”,在“首先接入点”中选择上一步新增的接入点。

2、选择java上网模式

S60的手机,在连接时会自动出现连接点的选择,您只需选择之前已设置好的连接点就可以了。

三、若您的手机是其它手机品牌,建议您通过电脑登陆,根据向导完成JAVA设置。

java提供了哪几种网络通信模式?

服务器端

DataInputStream inData;

socket = serverSocket.accept();

inData = new DataInputStream(socket.getInputStream());

outData = new DataOutputStream(socket.getOutputStream());

byte[] b = ("hello world").getBytes();

outData.write(b,0,b.lenth);

客户端是

out = new DataOutputStream(socket.getOutputStream());

in = new DataInputStream(socket.getInputStream());

byte[] b ;

ByteArrayOutputStream out1 = new ByteArrayOutputStream();

while (in.available() != 0) {

out1.write(in.read());

}

b = out1.toByteArray();

return new String(b);

转换的时候有问题

out = new DataOutputStream(socket.getOutputStream());

in = new DataInputStream(socket.getInputStream());

byte[] b = new byte[in.available()];

for(int i = 0;i b.length;i++){

b[i] = (byte)in.read();

}

String s = new String(b);

java网络模式的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于网络型模式、java网络模式的信息别忘了在本站进行查找喔。