
在Java中,实现聊天功能通常使用Socket编程和多线程编程来实现,以下是一些基本的实现步骤:
建立服务器端:服务器端需要创建一个ServerSocket对象,该对象监听指定的端口,等待客户端连接。当客户端连接成功后,服务器端会创建一个新的线程来处理该客户端的请求,这样可以让服务器同时处理多个客户端的请求。
建立客户端:客户端需要创建一个Socket对象,该对象指定服务器端的IP地址和端口号,与服务器端建立连接。
数据传输:在建立连接后,服务器端和客户端可以通过输入输出流进行数据传输,服务器端可以将数据广播给所有连接的客户端,也可以将数据发送给指定的客户端。
处理异常:在Socket编程中,异常处理是非常重要的一步,需要处理可能出现的IOException、SocketException等异常,以保证程序的正常运行。
除了以上基本步骤,实现聊天功能还需要考虑一些细节问题,例如如何处理大量的并发连接、如何保证数据的安全传输、如何处理异常等。因此,在实际开发中,通常会使用一些开源框架和工具来简化聊天功能的开发,例如Netty、Spring WebSockets、Apache MINA等。这些工具可以提供更高层次的抽象和更方便的API,使得聊天功能的开发更加容易和高效。
TCP/IP协议的传输即面向点到点的传输方式!
创建应用程序
选择 NEW 菜单下的 Application 选项 创建一个普通的应用程序
创建所需控件
首先在控件栏的Win 页中选择ImageList控件和CoolBar控件 再从Win 栏选择ToolBar控件放置到CoolBar 控件上 用鼠标右键单击 ImageList 控件 在d出的菜单中选择 ImageList Editer 选项 d出 ImageList Editer 对话框 单击 Add 按钮 选择 幅位图 在对象管理器Object Inspector中将ToolBar控件的Image属性设为 ImageList 用鼠标右键单击 ToolBar 控件 选 New Button 选项 总共创建 个ToolButton 在 对象管理器中将 个ToolButton的ImageIndex属性分别设置为 此时ImageList控件中的 幅位图将会分别显示在Toolbutton上 将 个ToolButton控件的ShowHint属性全都设置为 ture 并将它们的Hint属性分别设置为 监听 连接 断开连接 更改你的昵称 和 退出聊天程序
然后在窗体中放置一个Edit控件 Memo控件 StatusBar控件和一个Label控件 将Label控件的Caption属性设置为 输入框 最后 也是最关键的 在控件栏的Internet页中选择SeverSocket控件和ClientSocket控件放置在窗体中 将SeverSocket控件和ClientSocket控件的Port属性设置为 SeverSocket控件是基于TCP/IP协议传输的服务器方的控件 它的主要作用是用来监听其它基于TCP/IP传输计算机的连接请求 并在收到连接请求时建立连接 进行数据传输 ClientSocket控件是基于TCP/IP传输的客户方的控件 它的主要作用是向监听 TCP/IP传输的服务器发出连接请求 在收到服务器的允许连接的响应后 建立连接 并传输数据 之所以在窗体中同时创建ServerSocket和ClientSocket控件 是因为应用程序既可作为服务器 又可作为客户端使用
Serversocket和ClientSocket之间的连接
首先设置两个全局变量
NickName:string
b_Client:boolean
其中NickName用于放聊天人的名称 b_Client用于表明应用程序是否作为客户端进行数据传输
在窗体Form 的Oncreate事件中初始化变量 代码如下
procedure TForm FormCreate(Sender:TObject)
begin
NickName:+= 我的昵称
b_Client:=ture
end
双击ToolButton 编写服务器监听代码如下
procedure TForm Toolbutton Click(Sender:TObject)
begin
ClientSocket close
ServerSocket open
StatusBar SimpleText:= 开始监听
end
双击ToolButton 编写客户的申请连接 代码如下
procedure TForm ToolButton Click(Sender:TObject)
var s:string
begin
if Clientsocket Active then
ClientSocket close
if InputQuery( 连接到计算机 要连接的计算机名称或IP地址 s) then
if Length(s)>then
with ClientSocket do
begin
Host:=s
open
end
end
在对象管理器中 双击ClientSocket事件页的OnConnecting事件 编写处理客户等待连接请求 代码如下
procedure TForm ClientSocket Connecting(Sender:TObjectSocket:TCustomWinSocket)
begin
StatusBar SimpleText:= 等待来自 +Socket RemoteAddress+ 的连接允许响应
end
在对象管理器中 双击SeverSocket事件页的OnAccept事件 处理服务器响应连接事件 代码如下
procedure TForm SeverSocket Accept(Sender:TObjectSocket:TCustomWinSocket)
begin
b_Client:=false
StatusBar SimpleText:= 连接到 +Socket RemoteAddress
end
在对象管理器中 双击ClientSocket事件页的OnConnect事件 OnConnect事件在连接成功时被调用 代码如下
procedure TForm ClientSocket Connect(Sender:TObjectSocket:TCustomWinSocket)
begin
b_Client:=ture
StatusBar SimpleText:= 连接成功
end
ServerSocket和ClientSocket之间的数据传输
聊天的内容是通过Edit控件输入并在敲回车键后显示在Memo控件中 再传输到与之连接的计算机中 Edit的OnKeyDown事件代码如下
procedure TForm Edit KeyDown(Sender:TObjectvar Key:WordShift:TShiftState)
begin
if Key=VK_Return then
begin
Memo Lines Add(NickName+ : +Edit Text
if b_Client then
ClientSocket Socket SendText(Memo Lines[Memo lines Count ])
else
ServerSocket Socket Connections[ ] SendText(Memo Lines[Memo lines Count ])
end
end
在ServerSocket控件的onread事件中编写服务器接收到数据后的动作 代码如下
procedure TForm ServerSocket ClientRead(Sender:TObjectSocket:TCustomWinSocket)
begin
Memo lines Add(Socket ReceiveText)
end
在ClientSocket控件的onread事件中编写客户端接收到数据后的动作 代码如下
procedure TForm ClientSocket Read(Sender:TObjectSocket:TCustomWinSocket)
begin
Memo lines Add(Socket ReceiveText)
end
断开Serversocket和ClientSocket之间的连接
双击ToolButton 编写客户端断开的处理过程 代码如下
procedure TForm ToolButton Click(Sender:TObject)
begin
ClientSocket close
StatusBar SimpleText:= 断开连接
end
编写服务器响应客户端断开的处理过程 代码如下
procedure TForm ServerSocket ClientDisconnect(Sender:TObjectSocket:TCustomWinSocket)
begin
SeverSocket close
StatusBar SimpleText:= 断开连接
end
更改聊天者的昵称
双击Toolbutton 编写更改昵称代码如下
procedure TForm ToolButton Click(sender:TObject)
var
s:string
begin
if InputQuery( 更改昵称 你的新昵称 s) then
if Length(s)>then
NickName:=s
end
退出应用程序
双击Toolbutton 编写退出应用程序代码如下
procedure TForm ToolButton Click(sender:TObject)
ClientSocket close
ServerSocket close
Form close
end
保存并运行应用程序
lishixinzhi/Article/program/Delphi/201311/25042
如下:
该软件采用P2P方式,各个客户端之间直接发消息进行会话聊天,服务器在其中只扮演协调者的角色(混合型P2P)。
1.会话流程设计
当一个新用户通过自己的客户端登陆系统后,从服务器获取当前在线的用户信息列表,列表信息包括了系统中每个用户的地址。用户就可以开始独立工作,自主地向其他用户发送消息,而不经过服务器。每当有新用户加入或在线用户退出时,服务器都会及时发消息通知系统中的所有其他用户,以便它们实时地更新用户信息列表。
按照上述思路,设计系统会话流程如下:
(1)用户通过客户端进入系统,向服务器发出消息,请求登陆。
(2)服务器收到请求后,向客户端返回应答消息,表示同意接受该用户加入,并顺带将自己服务线程所在的监听端口号告诉用户。
(3)客户端按照服务器应答中给出的端口号与服务器建立稳定的连接。
(4)服务器通过该连接将当前在线用户的列表信息传给新加入的客户端。
(5)客户端获得了在线用户列表,就可以独立自主地与在线的其他用户通信了。
(6)当用户退出系统时要及时地通知服务器。
2.用户管理
系统中,无论是服务器还是客户端都保存一份在线用户列表,客户端的用户表在一开始登陆时从服务器索取获得。在程序运行的过程中,服务器负责实时地将系统内用户的变动情况及时地通知在线的每个成员用户。
新用户登录时,服务器将用户表传给他,同时向系统内每个成员广播“login”消息,各成员收到后更新自己的用户表。
同样,在有用户退出系统时,服务器也会及时地将这一消息传给各个用户,当然这也就要求每个用户在自己想要退出之前,必须要先告诉服务器。
3.协议设计
3.1客户端与服务器会话
(1)登陆过程。
客户端用匿名UDP向服务器发送消息:
login,username,localIPEndPoint
消息内容包括3个字段,各字段之间用“,”分隔:“login”表示请求登陆;“username”为用户名;“localIPEndPoint”是客户端本地地址。
服务器收到后以匿名UDP返回如下消息:
Accept,port
其中,“Accept”表示服务器接受了请求;“port”是服务所在端口,服务线程在这个端口上监听可能的客户连接,该连接使用同步的TCP。
连上服务器,获取用户列表:
客户端从上一会话的“port”字段的值服务所在端口,于是向端口发起TCP连接,向服务器索取在线的用户列表,服务器接受连接后将用户列别传输给客户端。
用户列表格式如下:
username1,IPEndPoint1;username2,IPEndPoint2;.....end
username1,username2.....为用户名,IPEndPoint1,IPEndPoint2....为它们对应的端点。每个用户的信息都有个“用户名+端点”组成,用户信息之间以“;”隔开,整个用户列表以“end”结尾。
3.1服务器协调管理用户
(1)新用户加入通知。
由于系统中已存在的每个用户都有一份当前用户表,因此当有新成员加入时,服务器无需重复给系统中的每个成员再传送用户表,只要将新加入成员的信息告诉系统内的其他用户,再由他们各自更新自己的用户表就行了。
服务器向系统内用户广播发送如下消息:
端点字段写为“remoteIPEndPoint”,表示是远程某个用户终端登陆了,本地客户线程据此更新用户列表。其实,在这个过程中,服务器只是将受到的“login”消息简单地转发而已。
(2)用户退出。
与新成员加入时一样,服务器将用户退出的消息直接进行广播转发:
logout,username,remoteIPEndPoint
其中,“remoteIPEndPoint”为退出系统的远程用户终端的端点地址。
3.1用户终端之间聊天
用户聊天时,他们各自的客户端之间是以P2P方式工作的,彼此地位对等,独立,不与服务器发生直接联系。
4.系统实现
4.1服务线程
系统运行后,先有服务器启动服务线程,只需单击“启动”按钮即可。
即时聊天软件可以在两名或多名用户之间传递即时消息的网络软件,大部分的即时聊天软件都可以显示联络人名单,并能显示联络人是否在线。使用者发出的每一句话都回即时显示在双方的萤幕上。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)