Java-WebSocket 项目的研究(三) WebSocketClient 类 具体解释

通过之前两篇文章

Java-WebSocket 项目的研究(一) Java-WebSocket类图描写叙述

Java-WebSocket 项目的研究(二) 小试身手:client连接server并发送消息实例

的介绍我们大概了解到了整个项目的类结构,当中有一个重要的类:WebSocketClient,以下就让我们具体了解一下这个类

首先看一下我们之前的类图关于WebSocketClient的描写叙述,能够看出:

1.继承自WebSocketAdapter

2.依赖于类WebSocketImpl(实际上关于WebSocket核心代码都在类WebSocketImpl里)

3.实现了WebSocket接口(实际上通过类WebSocketImpl实现的)

非常easy的,从字面意思我们就大概能猜到WebSocketAdapter是适配器类,架起了WebSocketImpl与WebSocketClient之间的桥梁,WebSocketImpl是web implementation的缩写,意思就是真正实现了websocket里基本的功能。

然后我们看一下WebSocketClient的几个主要方法:

首先是connect方法

/**
	 * Initiates the websocket connection. This method does not block.
	 */
	public void connect() {
		if( writeThread != null )
			throw new IllegalStateException( "WebSocketClient objects are not reuseable" );
		writeThread = new Thread( this );
		writeThread.start();
	}

我们能够发现:

他事实上是起了一个线程,因为WebSocketClient类实现了Runnable接口,因此他会自己主动去调用run方法,然后我们进一步到run方法里去一探到底

public void run() {
		try {
			if( socket == null ) {
				socket = new Socket( proxy );
			} else if( socket.isClosed() ) {
				throw new IOException();
			}
			System.out.println("---->  "+uri.toString()+"   port: "+getPort() );
			if( !socket.isBound() )
				socket.connect( new InetSocketAddress( uri.getHost(), getPort() ), connectTimeout );
			istream = socket.getInputStream();
			ostream = socket.getOutputStream();

			sendHandshake();
		} catch ( /*IOException | SecurityException | UnresolvedAddressException | InvalidHandshakeException | ClosedByInterruptException | SocketTimeoutException */Exception e ) {
			onWebsocketError( engine, e );
			engine.closeConnection( CloseFrame.NEVER_CONNECTED, e.getMessage() );
			return;
		}

		writeThread = new Thread( new WebsocketWriteThread() );
		writeThread.start();

		byte[] rawbuffer = new byte[ WebSocketImpl.RCVBUF ];
		int readBytes;

		try {
			while ( !isClosed() && ( readBytes = istream.read( rawbuffer ) ) != -1 ) {
				engine.decode( ByteBuffer.wrap( rawbuffer, 0, readBytes ) );
			}
			engine.eot();
		} catch ( IOException e ) {
			engine.eot();
		} catch ( RuntimeException e ) {
			// this catch case covers internal errors only and indicates a bug in this websocket implementation
			onError( e );
			engine.closeConnection( CloseFrame.ABNORMAL_CLOSE, e.getMessage() );
		}
		assert ( socket.isClosed() );
	}

以下我们对上面的代码进行具体研究:

				socket = new Socket( proxy );

这句显而易见,是创建了一个socket套接字。

				socket.connect( new InetSocketAddress( uri.getHost(), getPort() ), connectTimeout );

这句的意思是创建连接,參数就是server地址,port号,超时时间。

			istream = socket.getInputStream();

是接受server端的数据,关于接受的具体过程,我会在后期的博客中阐述,敬请期待。

			ostream = socket.getOutputStream();

是发送数据用的。

其它的先不解释,我们继续之前的流程------connect之后就要发送信息,也就是调用send方法,send方法例如以下:

/**
	 * Sends <var>text</var> to the connected websocket server.
	 *
	 * @param text
	 *            The string which will be transmitted.
	 */
	public void send( String text ) throws NotYetConnectedException {
		engine.send( text );
	}

它调用了engine的send方法,那么engine是啥东东呢,在类的声明处有这么一句话:

	private WebSocketImpl engine = null;

说明了WebSocketImpl类实现了send的操作。

完。。。

时间: 2024-11-08 23:07:56

Java-WebSocket 项目的研究(三) WebSocketClient 类 具体解释的相关文章

Java-WebSocket 项目的研究(三) WebSocketClient 类 详解

通过之前两篇文章 Java-WebSocket 项目的研究(一) Java-WebSocket类图描述 Java-WebSocket 项目的研究(二) 小试身手:客户端连接服务器并发送消息实例 的介绍我们大概了解到了整个项目的类结构,其中有一个重要的类:WebSocketClient,下面就让我们详细了解一下这个类 首先看一下我们之前的类图关于WebSocketClient的描述,可以看出: 1.继承自WebSocketAdapter 2.依赖于类WebSocketImpl(实际上关于WebSo

java反射机制剖析(三)—类类型Class

为了区别于我们常用的Class,因此给了个中文名类类型.目的就是为了知道此Class非彼Class.上一篇博客已经介绍了Class Loader,它的作用是根据提供的信息来加载类到内存中.我之前有提过这个类信息的提供者就是本篇博客要介绍的Class.提醒:一个类的Class对象和它的Instance是不一样的,切记,不然你会混乱的.开始了! 概念 Class类是所有类(注意是对象)的共有信息的抽象,比如该类实现的接口.对应的加载器.类名等等.一句话,类类型保存了每个类所对应的类型信息.每一个类都

java 编程思想笔记(三)——类的复用

一:复用功能介绍 复用代码,除了对代码复制并加以改变是不够的,除此之外,还能够使用类而不破坏现有程序代码. java 中代码复用可以分为以下三类:组合,继承,代理. 二:组合 新的类中使用现有类的对象,新的类由现有类的对象组成. 三:继承 通过extends 语法来实现声明. 四:代理 java 对代理没有提供直接支持,但通过组合和继承完成了间接实现,代理是组合和继承的中庸之道.代理=继承+组合 具体理解可以参考相关代码! 五:基类方法被子类重载 子类重载父类的方法,不会屏蔽其在基类中的任何版本

java web项目必须的三个jsp相关jar包 pom形式

jsp-api javax.servlet-api jstl <!-- jsp --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.0.1</version> </dependency> <dependency> <groupI

JAVA 虚拟机深入研究(三)——Java内存区域

JAVA 虚拟机深入研究(一)--关于Java的一些历史 JAVA 虚拟机深入研究(二)--JVM虚拟机发展以及一些Java的新东西 JAVA 虚拟机深入研究(三)--Java内存区域 Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的围城,城外的人想进去,城里的人想出来. Java运行的时候会把内存分为若干个,他们各有各的用途,每块区域的创建和销毁都是相对独立的,有的跟虚拟机一起混,有的则抱着用户的大腿同生共死. 按照第七版的<Java虚拟机规范>规定,JVM所管理的内存包括以下

Java面试准备之JVM详细研究三(类加载机制)

类加载过程 一个类从编写完成后,编译为字节码之后,它要装载进内存有七个阶段: 加载 => (验证-> 准备-> 解析)=> 初始化=> 使用=> 卸载 括号中的三个步骤可以整合成为 “连接”步骤.其中的步骤并不是一个阶段结束,一个阶段才开始的.只是说他们的开始阶段基本遵循此顺序(解析阶段更是可能在使用的时候才发生,目的是配合动态绑定),这些阶段都是互相交叉的混合式进行的,通常会在一个阶段执行过程中调用或激活另一个阶段. 1.加载 ”加载“的过程是”类加载“过程的一个阶段

java web项目,java类中获得WEB-INF路径

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 private static String getWebInfPath() {         URL url = 当前类.class.getProtectionDomain().getCodeSource().getLocation();         String path = url.toString();         int index = pat

十一周 项目三 点类

#include<iostream> #include<Cmath> using namespace std; class Point //定义坐标点类 { public: Point():x(0),y(0) {}; Point(double x0, double y0):x(x0),y(y0){}; void PrintPoint(); //输出点的信息 double getx() { return x; } double gety() { return y; } protect

Java开发学习心得(三):项目结构

3 项目结构 经过前面一系列学习,差不多对Java的开发过程有了一定的了解,为了能保持一个良好的项目结构,考虑到接下来要进行开发,还需要学习一下Java的项目结构 下面以两个项目结构为参照 图1 图2 第一个是我自己学习时的Demo,一边学一边建文件,应该有些错误的地方,第二张是从网上看到的一个结构比较清晰的图片 图1的结构完整一点,就以图1为主一点点讲起 3.1 src 因为我用的是Maven,大方向上项目两大文件夹分别是src和target,以及一个pom.xml配置文件,src目录里是项目