响应式聊天代码(什么叫响应式编程)
admin 发布:2022-12-19 23:50 142
本篇文章给大家谈谈响应式聊天代码,以及什么叫响应式编程对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
- 1、网页中做到自适应的响应式页面有几种方法?
- 2、响应式布局 怎么用css写响应式
- 3、vc++6.0编的基于MFC的简单的tcp聊天程序
- 4、如何用tcp协议实现网络聊天?
- 5、h5是什么响应式是什么
- 6、如何用Python编写一个聊天室
网页中做到自适应的响应式页面有几种方法?
做响应式页面就两种方法:
一是通过各种技术写一套响应的代码,要用到的技术,如通过设置百分比宽,使用栅格系统,和通过媒体查询,弹性布局等结合来实现。这样写的好处了代码只需要写一套。但是这样写要做兼容各种移动端肯定会有各种各样的问题出现。
第二种方法是:写两套代码,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:
三、项目实战(客户端)
完成了服务器端后,就需要实现客户端了,这里客户端连接服务器使用了telnetlib模块。
1.登录窗口
这里的图形界面包选择了wxPython,前面有安装说明,登录窗口通过继承wx.Frame类来实现,代码如下:
class LoginFrame(wx.Frame):
"""
登录窗口
关于响应式聊天代码和什么叫响应式编程的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。
版权说明:如非注明,本站文章均为 AH站长 原创,转载请注明出处和附带本文链接;
相关推荐
- 05-14外链网站是什么,外链是啥
- 05-14网络推广员的工作内容和步骤,网络推广员的工作内容和步骤是什么
- 05-14交易链接大全,交易链接是什么意思
- 05-14做一个网站需要什么,做一个网站需要什么物理设备
- 05-13现在什么app引流效果好,现在什么app引流效果好呢
- 05-13神马推广登录,神马推广是什么
- 05-13优化关键词的方法包括,优化关键词是什么
- 05-13web前端开发工程师,Web前端开发工程师是做什么的
- 05-13新冠咳嗽一般要咳多少天,十一个月咳嗽有痰吃什么好得快
- 05-13网销怎么找客户资源,做销售怎么和客户聊天
取消回复欢迎 你 发表评论:
- 标签列表
- 最近发表
- 友情链接