d0304 更新功能实现
d0312 更新部分图片&UI设计部分
d0318 更新功能实现
d1222 实现添加好友功能、实现注册功能、修改大量BUG
github:https://github.com/He11oLiu/ChatRoom.git
==========================================================
即时通讯(Instant messaging,简称IM)是一个终端服务,允许两人或多人使用网路即时的传递文字讯息、档案、语音与视频交流。如QQ,微信都属于即时通讯。
本篇博客将详细记录我在JAVA上搭建一个自己的即时通讯工具的实现方法,如有错误的地方或者建议,请多多提出。
功能实现
基本技术
Socket 与 ServerSocket
作为一个即时通讯工具,客户端(Client)和服务器(Server)是两个必不可少的部分。首先我们就来解决服务器和客户端连接的问题。
Socket的英文原义是“孔”或“插座”。
Socket用于描述IP地址和端口,是一个通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的通信。
在Internet上的主机一般运行了多个服务软件,同时提供几种服务。每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务。网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个Socket。建立了一个Socket后,从这个Socket中读取I/O流,就可以实现两个程序的通讯。
而服务器需要与多个客户端进行双向的通讯连接,并非单一的连接。于是可以通过每接收到一个Client后就开一个单独的进程,来完成与该Client的通讯步骤。这样就可以同时接受多个Client,从而实现服务器的功能。
客户端建立:
Java提供了Socket类,用来建立客户端
提供的构造方法如下:
当调用构造方法,构造一个新的Socket的时候,就是向指定的端口请求连接。
通过以下方法,可以获取该Socket的I/O流
通过close方法,关闭该Socket
服务器建立:
Java提供了ServerSocket类,用来建立服务器。
提供的构造方法如下:
可以通过Telnet来测试是否成功的建立了服务器。(win7后默认关闭,在控制面板-程序-启用或关闭windows功能下开启)telnet localhost <port>
或者
telnet 127.0.0.1 <port>
该类下自带了
accept方法用来接收连接,返回一个Socket对象。接收该对象,并调用刚才提到的getInputStream()方法以及getOutputStream()方法,即可实现获取该Socket的I/O流。从该流上读取信息或者写入信息,即可达到通讯的目的。要注意的是,此时客户端的Input流对应着服务器端的Output流。
同样ServerSocket也带了close方法,用来关闭服务器。
通讯协议设计
通讯协议具体内容
type | 值 | 描述 | 类 |
---|---|---|---|
1.注册请求信息 | 0x01 | 客户发送注册请求数据给服务器 | MsgReg | </