使用TCPIP协议实现聊天程序

使用TCPIP协议实现聊天程序,第1张

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

使用TCP/IP协议实现聊天程序

TCP/IP协议的传输即面向点到点的传输方式!

1.创建应用程序。

选择“NEW”菜单下的“Application”选项,创建一个普通的应用程序。

2.创建所需控件。

首先在控件栏的Win32页中选择ImageList控件和CoolBar控件,再从Win32栏选择ToolBar控件放置到CoolBar

控件上。用鼠标右键单击“ImageList”控件,在d出的菜单中选择“ImageList Editer...”选桥首项,d出

“ImageList Editer”对话框,单击“Add...”按钮,选择5幅位图。在对象管理器Object Inspector中将

ToolBar控件的Image属性设为“ImageList1”,用鼠标右键单击“ToolBar”控件,选“New Button”选项,

总共创建5个ToolButton,在 对象管理器中将5个ToolButton的ImageIndex属性分别设置为0,1,2,3,4。

此时ImageList控件中的5幅位图将会分别显示在Toolbutton上,将5个ToolButton控件的ShowHint属性全都设

置为“ture”,并将它们的Hint属性分别设置为“监听”、“连接”、“断开连接”、“更改你的昵称”和

“退出聊天程序”。

然后在窗体中放置一个Edit控件、Memo控件、StatusBar控件和一个Label控件。将Label控件的Caption属性

设置为“输入框”。

最后,也是最关键的,在控件栏的Internet页中选择SeverSocket控件和ClientSocket控件放置在窗体中,将

SeverSocket控件和ClientSocket控件的Port属性设置为“1100”。SeverSocket控件是基于TCP/IP协议传输

的服务器方的控件,它的主要作用是用来监听其它基于TCP/IP传输计算机的连接请求,并在收到连接请求时

建立连接,进行数据传输,ClientSocket控件是基于TCP/IP传输的客户方的控件,它的主要作用是向监听

TCP/IP传输的服务器发出连接请求,在收到服务器的允许连接的响应后,建立连接,并传输数据,之所以在指碰

窗体中同时创建ServerSocket和ClientSocket控件,是因为应用程序既可作为服务器,又可作为客户端使用。

3.Serversocket和ClientSocket之间的连接

首先设置两个全局变量:

NickName:string

b_Client:boolean

其中NickName用于放聊天人的名称,b_Client用于表明应用程序是否作为客户端进行数据传输。

在窗体Form1的Oncreate事件中初始化变量,代码如下:

procedure TForm1.FormCreate(Sender:TObject)

begin

NickName:+="我的昵称"

b_Client:=ture

end

双击ToolButton1,编写服务器监听代码如下:

procedure TForm1.Toolbutton1Click(Sender:TObject)

begin

ClientSocket1.close

ServerSocket1.open

StatusBar1.SimpleText:='开始监听敏逗数’;

end

双击ToolButton2,编写客户的申请连接,代码如下:

procedure TForm1.ToolButton2Click(Sender:TObject)

var s:string

begin

if Clientsocket1.Active then

ClientSocket1.close

if InputQuery('连接到计算机','要连接的计算机名称或IP地址:',s) then

if Length(s)>0 then

with ClientSocket1 do

begin

Host:=s

open

end

end

在对象管理器中,双击ClientSocket事件页的OnConnecting事件,编写处理客户等待连接请求,代码

如下:

procedure TForm1.ClientSocket1Connecting(Sender:TObjectSocket:TCustomWinSocket)

begin

StatusBar1.SimpleText:='等待来自'+Socket.RemoteAddress+'的连接允许响应...'

end

在对象管理器中,双击SeverSocket事件页的OnAccept事件,处理服务器响应连接事件,代码如下:

procedure TForm1.SeverSocket1Accept(Sender:TObjectSocket:TCustomWinSocket)

begin

b_Client:=false

StatusBar1.SimpleText:='连接到'+Socket.RemoteAddress

end

在对象管理器中,双击ClientSocket事件页的OnConnect事件,OnConnect事件在连接成功时被调用,代码如下:

procedure TForm1.ClientSocket1Connect(Sender:TObjectSocket:TCustomWinSocket)

begin

b_Client:=ture

StatusBar1.SimpleText:='连接成功'

end

4.ServerSocket和ClientSocket之间的数据传输

聊天的内容是通过Edit控件输入并在敲回车键后显示在Memo控件中,再传输到与之连接的计算机中。

Edit的OnKeyDown事件代码如下:

procedure TForm1.Edit1KeyDown(Sender:TObjectvar Key:WordShift:TShiftState)

begin

if Key=VK_Return then

begin

Memo1.Lines.Add(NickName+':'+Edit1.Text0

if b_Client then

ClientSocket1.Socket.SendText(Memo1.Lines[Memo1.lines.Count-1])

else

ServerSocket1.Socket.Connections[0].SendText(Memo1.Lines[Memo1.lines.Count-1])

end

end

在ServerSocket控件的onread事件中编写服务器接收到数据后的动作,代码如下:

procedure TForm1.ServerSocket1ClientRead(Sender:TObjectSocket:TCustomWinSocket)

begin

Memo1.lines.Add(Socket.ReceiveText)

end

在ClientSocket控件的onread事件中编写客户端接收到数据后的动作,代码如下:

procedure TForm1.ClientSocket1Read(Sender:TObjectSocket:TCustomWinSocket)

begin

Memo1.lines.Add(Socket.ReceiveText)

end

5.断开Serversocket和ClientSocket之间的连接

双击ToolButton3,编写客户端断开的处理过程,代码如下:

procedure TForm1.ToolButton3Click(Sender:TObject)

begin

ClientSocket1.close

StatusBar1.SimpleText:='断开连接'

end

编写服务器响应客户端断开的处理过程,代码如下:

procedure TForm1.ServerSocket1ClientDisconnect(Sender:TObjectSocket:TCustomWinSocket)

begin

SeverSocket1.close

StatusBar1.SimpleText:='断开连接'

end

6.更改聊天者的昵称

双击Toolbutton4,编写更改昵称代码如下:

procedure TForm1.ToolButton4Click(sender:TObject)

var

s:string

begin

if InputQuery('更改昵称','你的新昵称',s) then

if Length(s)>0 then

NickName:=s

end

7.退出应用程序

双击Toolbutton5,编写退出应用程序代码如下:

procedure TForm1.ToolButton5Click(sender:TObject)

ClientSocket1.close

ServerSocket1.close

Form1.close

end

8.保存并运行应用程序

最好在网上运行该程序,如果没联网,但你的计算机支持TCP/IP协议(可以通过网络邻居安装TCP/IP协议),

你可以在你的计算机上从“我的电脑”中运行该应用程序的两个实例。运行后,将一个聊天程序作为服务器监

听,另一个聊天程序作为客户与服务器连接并聊天。局域网中同样可以运行!!!

你上面给出的代码其实就是 MSDN 里面的演示代码,不过不完整,只演示了两个函数的使用,我给你看看我写的 TCP 通讯程序,可以在同一个局域网内的两台不同计算机之间聊天 :

这其实就是某本将网络通雀灶余讯的教程里面的例子,不过是我自己重写了一遍,下面给你代码:

========================

下面是公共代码:

========================

#ifndef __CINITSOCK__H__

#define __CINITSOCK__H__

#include <winsock2.h>

#include <iphlpapi.h>

#pragma comment( lib, "ws2_32.lib" )

#pragma comment( lib, "iphlpapi.lib" )

class CInitSock

{

public:

CInitSock( int nMinorVer = 2, int nMajorVer = 2 )

{

 WSADATA wsData

 WORD wVer = MAKEWORD( nMinorVer, nMajorVer )

 if( 0 != 辩和WSAStartup( wVer, &wsData ) ) exit( 0 )

}

~CInitSock( )

{

 WSACleanup( )

}

}

#endif

========================

下面是客户端的代码 :

=======================

#include "CInitSock.h"

#include <iostream>

using namespace std

CInitSock g_Sock

void main( )

{

SOCKET sockClient = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP )

if( INVALID_SOCKET == sockClient )

return

sockaddr_in sockAddr

sockAddr.sin_family = AF_INET

sockAddr.sin_port = htons( 4567 )

sockAddr.sin_addr.S_un.S_addr = inet_addr( "127.0.0.1" )

if( -1 == connect( sockClient, ( sockaddr* )&sockAddr, sizeof( sockAddr ) ) )

{

cout << "connect failed" << endl

return

}

while( true )

{

char szBuf[ MAX_PATH ]

ZeroMemory( szBuf, sizeof( szBuf ) )

cout << "You Say : "

cin >> szBuf

if( SOCKET_ERROR  == send( sockClient, szBuf, MAX_PATH, 0 ) )

{

 cout << "send failed" << endl

 return

}

int nRecvLen = recv( sockClient, szBuf, MAX_PATH, 0 )

if( nRecvLen > 0 )

{

 // szBuf[ nRecvLen ] = '\0'

 cout << "Service Say : " << szBuf << endl <<顷滚 endl

}

else

{

 cout << "recv failed" << endl

 return

}

}

closesocket( sockClient )

}

======================

下面是服务端的代码:

======================

#include "CInitSock.h"

#include <iostream>

using namespace std

CInitSock g_Sock

void main( )

{

SOCKET sockClient = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP )

if( INVALID_SOCKET == sockClient )

return

sockaddr_in sockAddr

sockAddr.sin_family = AF_INET

sockAddr.sin_port = htons( 4567 )

sockAddr.sin_addr.S_un.S_addr = INADDR_ANY

bind( sockClient, ( sockaddr* )&sockAddr, sizeof( sockAddr ) )

listen( sockClient, SOMAXCONN )

char szBuf[ MAX_PATH ]

sockaddr_in remoteAddr

int nLen = sizeof( sockaddr_in )

SOCKET sock = accept( sockClient, ( sockaddr* )&remoteAddr, &nLen )

while( true )

{

int nRecvLen = recv( sock, szBuf, MAX_PATH, 0 )

if( nRecvLen > 0 )

{

 cout << "Client Say : " << szBuf << endl << endl

}

ZeroMemory( szBuf, sizeof( szBuf ) )

cout << "You Say : "

cin >> szBuf

if( SOCKET_ERROR == send( sock, szBuf, MAX_PATH, 0 ) )

{

 cout << "send failed" << endl

}

}

closesocket( sock )

closesocket( sockClient )

}

希望能够帮到楼主 。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12360576.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存