当前位置:首页 > 代码 > 正文

响应式聊天代码(什么叫响应式编程)

admin 发布:2022-12-19 23:50 142


本篇文章给大家谈谈响应式聊天代码,以及什么叫响应式编程对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

网页中做到自适应的响应式页面有几种方法?

做响应式页面就两种方法:

一是通过各种技术写一套响应的代码,要用到的技术,如通过设置百分比宽,使用栅格系统,和通过媒体查询,弹性布局等结合来实现。这样写的好处了代码只需要写一套。但是这样写要做兼容各种移动端肯定会有各种各样的问题出现。

第二种方法是:写两套代码,pc端和移动端分开来写,然后再通过添加js获取屏幕的分辨率(或者通过获取用户设备来)来进行判断用户是在什么设备上打开,然后根据条件来打开页面

这样做的好处是两套代码分开来,维护方便,移动端页面也不会受pc端布局影响,开发灵活。

但是这样的话需要写一个判断页面然后使用两个2级域名,分别对应移动端和pc端。

响应式布局 怎么用css写响应式

做响应式网站离不开CSS响应式布局查询代码写法,而在此之前,我们需要了解什么是媒体查询以及如何才CSS中引入媒体查询。

什么是媒体查询?

媒体查询可以让我们根据设备显示器的特性(如视口宽度、屏幕比例、设备方向:横向或纵向)为其设定CSS样式,媒体查询由媒体类型和一个或多个检测媒体特性的条件表达式组成。媒体查询中可用于检测的媒体特性有width、height和color(等)。使用媒体查询,可以在不改变页面内容的情况下,为特定的一些输出设备定制显示效果。

如何在CSS中引入媒体查询?

媒体查询写在CSS样式代码的最后,CSS是层叠样式表,在同一特殊性下,靠后的的样式会重叠前面的样式。

如何用CSS做响应式布局呢?

1、在HTML头部添加以下代码,用来显示兼容移动设备的显示效果。

meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" /

参数详解:

width=device-width :宽度等于当前设备的宽度

initial-scale=1 :初始的缩放比例(默认为1)

minimum-scale=1 :允许用户缩放到的最小比例(默认为1)

maximum-scale=1 :允许用户缩放到的最大比例(默认为1)

user-scalable=no :用户是否可以手动缩放(默认为no)

2、引入包含Media的CSS文件

一般情况HTMLCSS代码都是分开写的,Media也不例外。

link rel="stylesheet" type="text/css" href="m320.css" media="only screen and (max-width:320px)"/

link rel="stylesheet" type="text/css" href="m480.css" media="only screen and (min-width:321px) and (max-width:375px)"/

3、写Media中的代码

以某个网页的响应式布局为例

结构:@media设备类型and (设备特性){样式代码}

/*媒体查询*/

/*当页面大于1200px时,大屏幕,主要是PC端*/

@media (min-width: 1200px) {

}

/*在992 和1199 像素之间的屏幕里,中等屏幕,分辨率低的PC*/

@media (min-width: 992px) and (max-width: 1199px) {

#adver .center {

width: 50%;

margin: -10px 0 0 -25%;

}

main .center h2 {

font-size: 40px;

}

}

/*768和991像素之间的屏幕里,小屏幕,主要是PAD*/

@media (min-width: 768px) and (max-width: 991px) {

#adver .center {

width: 60%;

margin: -10px 0 0 -30%;

}

#adver .search, #adver .button {

font-size: 20px;

}

main .center h2 {

font-size: 35px;

}

}

/*在480和767像素之间的屏幕里,超小屏幕,主要是手机*/

@media (min-width: 480px) and (max-width: 767px) {

header, header .center, header .link {

height: 45px;

}

header .logo, .sm-hidden,.sidebar,.md-hidden {

display: none;

}

header .link {

width: 100%;

line-height: 45px;

}

#adver {

padding: 45px 0 0 0;

}

#adver .center {

width: 70%;

height: 53px;

margin: -10px 0 0 -35%;

}

#adver .search, #adver .button {

height: 45px;

font-size: 18px;

}

.sm-visible {

display: block;

}

main .center h2 {

font-size: 30px;

}

main .center p {

font-size: 15px;

}

main figure {

width: 49.2%;

}

}

/*在小于480像素的屏幕,微小屏幕,更低分辨率的手机*/

@media (max-width: 479px) {

header, header .center, header .link {

height: 45px;

}

header .logo, .xs-hidden, .sm-hidden, .sidebar, .md-hidden {

display: none;

}

header .link {

width: 100%;

line-height: 45px;

}

header .link li {

width: 25%;

}

#adver {

padding: 45px 0 0 0;

}

#adver .center {

width: 80%;

height: 48px;

margin: -10px 0 0 -40%;

}

#adver .search, #adver .button {

height: 40px;

font-size: 16px;

}

.sm-visible {

display: block;

}

footer .bottom, footer .version {

font-size: 13px;

}

main .center h2 {

font-size: 26px;

}

main .center p {

font-size: 14px;

}

main figure {

width: 99%;

}

}

响应式布局的原理就是在不同的窗口大小下显示不同的结构和样式。只要掌握好CSS的样式,响应式布局就没问题。

vc++6.0编的基于MFC的简单的tcp聊天程序

4.1服务器端代码

开启服务器功能:

void OnServerOpen() //开启服务器功能

{

WSADATA wsaData;

int iErrorCode;

char chInfo[64];

if (WSAStartup(WINSOCK_VERSION, wsaData)) //调用Windows Sockets DLL

{ MessageBeep(MB_ICONSTOP);

MessageBox("Winsock无法初始化!", AfxGetAppName(), MB_OK|MB_ICONSTOP);

WSACleanup();

return; }

else

WSACleanup();

if (gethostname(chInfo, sizeof(chInfo)))

{ ReportWinsockErr("\n无法获取主机!\n ");

return; }

CString csWinsockID = "\n==服务器功能开启在端口:No. ";

csWinsockID += itoa(m_pDoc-m_nServerPort, chInfo, 10);

csWinsockID += "\n";

PrintString(csWinsockID); //在程序视图显示提示信息的函数,读者可自行创建

m_pDoc-m_hServerSocket=socket(PF_INET, SOCK_STREAM, DEFAULT_PROTOCOL);

//创建服务器端Socket,类型为SOCK_STREAM,面向连接的通信

if (m_pDoc-m_hServerSocket == INVALID_SOCKET)

{ ReportWinsockErr("无法创建服务器socket!");

return;}

m_pDoc-m_sockServerAddr.sin_family = AF_INET;

m_pDoc-m_sockServerAddr.sin_addr.s_addr = INADDR_ANY;

m_pDoc-m_sockServerAddr.sin_port = htons(m_pDoc-m_nServerPort);

if (bind(m_pDoc-m_hServerSocket, (LPSOCKADDR)m_pDoc-m_sockServerAddr,

sizeof(m_pDoc-m_sockServerAddr)) == SOCKET_ERROR) //与选定的端口绑定

{ReportWinsockErr("无法绑定服务器socket!");

return;}

iErrorCode=WSAAsyncSelect(m_pDoc-m_hServerSocket,m_hWnd,

WM_SERVER_ACCEPT, FD_ACCEPT);

//设定服务器相应的网络事件为FD_ACCEPT,即连接请求,

// 产生相应传递给窗口的消息为WM_SERVER_ACCEPT

if (iErrorCode == SOCKET_ERROR)

{ ReportWinsockErr("WSAAsyncSelect设定失败!");

return;}

if (listen(m_pDoc-m_hServerSocket, QUEUE_SIZE) == SOCKET_ERROR) //开始监听客户连接请求

{ReportWinsockErr("服务器socket监听失败!");

m_pParentMenu-EnableMenuItem(ID_SERVER_OPEN, MF_ENABLED);

return;}

m_bServerIsOpen = TRUE; //监视服务器是否打开的变量

return;

}

响应客户发送聊天文字到服务器:ON_MESSAGE(WM_CLIENT_READ, OnClientRead)

LRESULT OnClientRead(WPARAM wParam, LPARAM lParam)

{

int iRead;

int iBufferLength;

int iEnd;

int iRemainSpace;

char chInBuffer[1024];

int i;

for(i=0;(i

//MAXClient是服务器可响应连接的最大数目

{}

if(i==MAXClient) return 0L;

iBufferLength = iRemainSpace = sizeof(chInBuffer);

iEnd = 0;

iRemainSpace -= iEnd;

iBytesRead = recv(m_aClientSocket[i], (LPSTR)(chInBuffer+iEnd), iSpaceRemaining, NO_FLAGS);

//用可控缓冲接收函数recv()来接收字符

iEnd+=iRead;

if (iBytesRead == SOCKET_ERROR)

ReportWinsockErr("recv出错!");

chInBuffer[iEnd] = '\0';

if (lstrlen(chInBuffer) != 0)

{PrintString(chInBuffer); //服务器端文字显示

OnServerBroadcast(chInBuffer); //自己编写的函数,向所有连接的客户广播这个客户的聊天文字

}

return(0L);

}

对于客户断开连接,会产生一个FD_CLOSE消息,只须相应地用closesocket()关闭相应的Socket即可,这个处理比较简单。

4.2客户端代码

连接到服务器:

void OnSocketConnect()

{ WSADATA wsaData;

DWORD dwIPAddr;

SOCKADDR_IN sockAddr;

if(WSAStartup(WINSOCK_VERSION,wsaData)) //调用Windows Sockets DLL

{MessageBox("Winsock无法初始化!",NULL,MB_OK);

return;

}

m_hSocket=socket(PF_INET,SOCK_STREAM,0); //创建面向连接的socket

sockAddr.sin_family=AF_INET; //使用TCP/IP协议

sockAddr.sin_port=m_iPort; //客户端指定的IP地址

sockAddr.sin_addr.S_un.S_addr=dwIPAddr;

int nConnect=connect(m_hSocket,(LPSOCKADDR)sockAddr,sizeof(sockAddr)); //请求连接

if(nConnect)

ReportWinsockErr("连接失败!");

else

MessageBox("连接成功!",NULL,MB_OK);

int iErrorCode=WSAAsyncSelect(m_hSocket,m_hWnd,WM_SOCKET_READ,FD_READ);

//指定响应的事件,为服务器发送来字符

if(iErrorCode==SOCKET_ERROR)

MessageBox("WSAAsyncSelect设定失败!");

}

接收服务器端发送的字符也使用可控缓冲接收函数recv(),客户端聊天的字符发送使用数据可控缓冲发送函数send(),这两个过程比较简单,在此就不加赘述了。

如何用tcp协议实现网络聊天?

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

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

1.创建应用程序。

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

2.创建所需控件。

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

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

“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:TObject;Socket:TCustomWinSocket);

begin

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

end;

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

procedure TForm1.SeverSocket1Accept(Sender:TObject;Socket:TCustomWinSocket);

begin

b_Client:=false;

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

end;

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

procedure TForm1.ClientSocket1Connect(Sender:TObject;Socket:TCustomWinSocket);

begin

b_Client:=ture;

StatusBar1.SimpleText:='连接成功';

end;

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

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

Edit的OnKeyDown事件代码如下:

procedure TForm1.Edit1KeyDown(Sender:TObject;var Key:Word;Shift: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:TObject;Socket:TCustomWinSocket);

begin

Memo1.lines.Add(Socket.ReceiveText);

end;

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

procedure TForm1.ClientSocket1Read(Sender:TObject;Socket: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:TObject;Socket: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协议),

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

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

h5是什么响应式是什么

H5是一种基于互联网的网页编程语言,而手机端广告只不过是其中的一个点。H5的设计目的是为了在移动设备上支持多媒体。

响应式也可叫做自适应,说白点就是一个web页面,它在PC上看起来是一个样子,到了手机上为了更好的体验效果就需要做一个响应式。

在叩丁狼H5前端培训课程中就有这部分的知识点,想要了解更多可以到官网查看

如何用Python编写一个聊天室

一、课程介绍

1.简介

本次项目课是实现简单聊天室程序的服务器端和客户端。

2.知识点

服务器端涉及到asyncore、asynchat和socket这几个模块,客户端用到了telnetlib、wx、time和thread这几个模块。

3.所需环境

本次课中编写客户端需要用到wxPython,它是一个GUI工具包,请先使用下面的命令安装:

$ sudo apt-get install python-wxtools

密码为shiyanlou

4.项目效果截图

登录窗口

聊天窗口

二、项目实战(服务器端)

1.服务器类

首先需要一个聊天服务器,这里继承asyncore的dispatcher类来实现,代码如下

class ChatServer(dispatcher):

"""

聊天服务器

"""

def __init__(self, port):

dispatcher.__init__(self)

self.create_socket(socket.AF_INET, socket.SOCK_STREAM)

self.set_reuse_addr()

self.bind(('', port))

self.listen(5)

self.users = {}

self.main_room = ChatRoom(self)

def handle_accept(self):

conn, addr = self.accept()

ChatSession(self, conn)

2.会话类

有了服务器类还需要能维护每个用户的连接会话,这里继承asynchat的async_chat类来实现,代码如下:

class ChatSession(async_chat):

"""

负责和单用户通信

"""

def __init__(self, server, sock):

async_chat.__init__(self, sock)

self.server = server

self.set_terminator('\n')

self.data = []

self.name = None

self.enter(LoginRoom(server))

def enter(self, room):

'从当前房间移除自身,然后添加到指定房间'

try:

cur = self.room

except AttributeError:

pass

else:

cur.remove(self)

self.room = room

room.add(self)

def collect_incoming_data(self, data):

'接受客户端的数据'

self.data.append(data)

def found_terminator(self):

'当客户端的一条数据结束时的处理'

line = ''.join(self.data)

self.data = []

try:

self.room.handle(self, line)

except EndSession:

self.handle_close()

def handle_close(self):

async_chat.handle_close(self)

self.enter(LogoutRoom(self.server))

3.命令解释器

现在就需要一个命令解释器能够解释用户的命令,例如登录、查询在线用户和发消息等,代码如下:

class CommandHandler:

"""

命令处理类

"""

def unknown(self, session, cmd):

'响应未知命令'

session.push('Unknown command: %s\n' % cmd)

def handle(self, session, line):

'命令处理'

if not line.strip():

return

parts = line.split(' ', 1)

cmd = parts[0]

try:

line = parts[1].strip()

except IndexError:

line = ''

meth = getattr(self, 'do_' + cmd, None)

try:

meth(session, line)

except TypeError:

self.unknown(session, cmd)

4.房间

接下来就需要实现聊天室的房间了,这里我们定义了三种房间,分别是用户刚登录时的房间、聊天的房间和退出登录的房间,这三种房间都有一个公共的父类,代码如下:

class Room(CommandHandler):

"""

包含多个用户的环境,负责基本的命令处理和广播

"""

def __init__(self, server):

self.server = server

self.sessions = []

def add(self, session):

'一个用户进入房间'

self.sessions.append(session)

def remove(self, session):

'一个用户离开房间'

self.sessions.remove(session)

def broadcast(self, line):

'向所有的用户发送指定消息'

for session in self.sessions:

session.push(line)

def do_logout(self, session, line):

'退出房间'

raise EndSession

class LoginRoom(Room):

"""

刚登录的用户的房间

"""

def add(self, session):

'用户连接成功的回应'

Room.add(self, session)

session.push('Connect Success')

def do_login(self, session, line):

'登录命令处理'

name = line.strip()

if not name:

session.push('UserName Empty')

elif name in self.server.users:

session.push('UserName Exist')

else:

session.name = name

session.enter(self.server.main_room)

class ChatRoom(Room):

"""

聊天用的房间

"""

def add(self, session):

'广播新用户进入'

session.push('Login Success')

self.broadcast(session.name + ' has entered the room.\n')

self.server.users[session.name] = session

Room.add(self, session)

def remove(self, session):

'广播用户离开'

Room.remove(self, session)

self.broadcast(session.name + ' has left the room.\n')

def do_say(self, session, line):

'客户端发送消息'

self.broadcast(session.name + ': ' + line + '\n')

def do_look(self, session, line):

'查看在线用户'

session.push('Online Users:\n')

for other in self.sessions:

session.push(other.name + '\n')

class LogoutRoom(Room):

"""

用户退出时的房间

"""

def add(self, session):

'从服务器中移除'

try:

del self.server.users[session.name]

except KeyError:

pass

5.服务器端完整代码

#!/usr/bin/python

# encoding: utf-8

from asyncore import dispatcher

from asynchat import async_chat

import socket, asyncore

PORT = 6666 #端口

class EndSession(Exception):

"""

自定义会话结束时的异常

"""

pass

class CommandHandler:

"""

命令处理类

"""

def unknown(self, session, cmd):

'响应未知命令'

session.push('Unknown command: %s\n' % cmd)

def handle(self, session, line):

'命令处理'

if not line.strip():

return

parts = line.split(' ', 1)

cmd = parts[0]

try:

line = parts[1].strip()

except IndexError:

line = ''

meth = getattr(self, 'do_' + cmd, None)

try:

meth(session, line)

except TypeError:

self.unknown(session, cmd)

class Room(CommandHandler):

"""

包含多个用户的环境,负责基本的命令处理和广播

"""

def __init__(self, server):

self.server = server

self.sessions = []

def add(self, session):

'一个用户进入房间'

self.sessions.append(session)

def remove(self, session):

'一个用户离开房间'

self.sessions.remove(session)

def broadcast(self, line):

'向所有的用户发送指定消息'

for session in self.sessions:

session.push(line)

def do_logout(self, session, line):

'退出房间'

raise EndSession

class LoginRoom(Room):

"""

刚登录的用户的房间

"""

def add(self, session):

'用户连接成功的回应'

Room.add(self, session)

session.push('Connect Success')

def do_login(self, session, line):

'登录命令处理'

name = line.strip()

if not name:

session.push('UserName Empty')

elif name in self.server.users:

session.push('UserName Exist')

else:

session.name = name

session.enter(self.server.main_room)

class ChatRoom(Room):

"""

聊天用的房间

"""

def add(self, session):

'广播新用户进入'

session.push('Login Success')

self.broadcast(session.name + ' has entered the room.\n')

self.server.users[session.name] = session

Room.add(self, session)

def remove(self, session):

'广播用户离开'

Room.remove(self, session)

self.broadcast(session.name + ' has left the room.\n')

def do_say(self, session, line):

'客户端发送消息'

self.broadcast(session.name + ': ' + line + '\n')

def do_look(self, session, line):

'查看在线用户'

session.push('Online Users:\n')

for other in self.sessions:

session.push(other.name + '\n')

class LogoutRoom(Room):

"""

用户退出时的房间

"""

def add(self, session):

'从服务器中移除'

try:

del self.server.users[session.name]

except KeyError:

pass

class ChatSession(async_chat):

"""

负责和单用户通信

"""

def __init__(self, server, sock):

async_chat.__init__(self, sock)

self.server = server

self.set_terminator('\n')

self.data = []

self.name = None

self.enter(LoginRoom(server))

def enter(self, room):

'从当前房间移除自身,然后添加到指定房间'

try:

cur = self.room

except AttributeError:

pass

else:

cur.remove(self)

self.room = room

room.add(self)

def collect_incoming_data(self, data):

'接受客户端的数据'

self.data.append(data)

def found_terminator(self):

'当客户端的一条数据结束时的处理'

line = ''.join(self.data)

self.data = []

try:

self.room.handle(self, line)

except EndSession:

self.handle_close()

def handle_close(self):

async_chat.handle_close(self)

self.enter(LogoutRoom(self.server))

class ChatServer(dispatcher):

"""

聊天服务器

"""

def __init__(self, port):

dispatcher.__init__(self)

self.create_socket(socket.AF_INET, socket.SOCK_STREAM)

self.set_reuse_addr()

self.bind(('', port))

self.listen(5)

self.users = {}

self.main_room = ChatRoom(self)

def handle_accept(self):

conn, addr = self.accept()

ChatSession(self, conn)

if __name__ == '__main__':

s = ChatServer(PORT)

try:

asyncore.loop()

except KeyboardInterrupt:

print

三、项目实战(客户端)

完成了服务器端后,就需要实现客户端了,这里客户端连接服务器使用了telnetlib模块。

1.登录窗口

这里的图形界面包选择了wxPython,前面有安装说明,登录窗口通过继承wx.Frame类来实现,代码如下:

class LoginFrame(wx.Frame):

"""

登录窗口

关于响应式聊天代码和什么叫响应式编程的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

版权说明:如非注明,本站文章均为 AH站长 原创,转载请注明出处和附带本文链接;

本文地址:http://ahzz.com.cn/post/31056.html


取消回复欢迎 发表评论:

分享到

温馨提示

下载成功了么?或者链接失效了?

联系我们反馈

立即下载