如何在自己电脑上架设聊天室服务器,使别人可以访问

如何在自己电脑上架设聊天室服务器,使别人可以访问,第1张

必须是专线才可以,如果局内网不可以~~ asp架设首先要有IIS xp 和2000都有带 98你自己下 就是Internet 信息服务 安装完毕后你可以通过 计算机-网站-默认网站这几个步骤 然后点鼠标右键 新建虚拟目录 建立网站 如果还看不见就点右键 属性-配置 看看扩展名里有没有asp 如果没有添加一下 浏览C:\WINDOWS\System32\inetsrv\asp.dll 最后点你的网站目录 右键浏览就可以看见 php架设 第0步:\>软件、环境清单 本文侧重于Windows平台的Apache版本,而且仅用于调试学习用! 原贴地址: http://wjhen.3322.org/ipb/index.php?showtopic=32 ★软件环境: OS:Win2000/WinXP/Win2003 ★软件清单: 1.Apache Ver:1.3.33 (建议使用1.3.x版本,兼容性比较好) 下载地址: http://httpd.apache.org/download.cgi 2.ActivePerl Ver:5.6.1(建议使用5.6.1版本,兼容性比较好) 下载地址: http://www.activeperl.com/Products/Downloa...x?id=ActivePerl 3.PHP Ver:4.3.10 (建议使用4.3.10版本,兼容性和安全性比较好) 下载地址: http://www.php.net/downloads.php 4.Windows Installer Ver:3.0(可选,如果软件无法安装请先安装,适用于Win2KSP3/Win2kSP4/Win2K3/WinXP/WinXPSP1) 下载地址: http://www.microsoft.com/downloads/details...14-a956122e08e8 [quote]第1步:\>开始安装Apache 下载完apache_1.3.33-win32-x86-no_src.exe,运行之,出现如图欢迎画面。[/quote] quote]第2步:\>Apache安装许可协议 当然选择我同意了。[/quote] [quote]第3步:\>Apache的一些说明 直接下一步吧。[/quote] [quote]第4步:\>填写主机参数 Network Domain:域名(填写你的主机的域名,如果单机调试可以任意填) Server Name:主机名(填写主机所在域的主机名,如果单机调试可以任意填) Administrator's Email Address:管理员Email信箱 Run as a service for All Users:将Apache服务器安装成系统服务(随系统启动而系统) Run When started manually,only for me:每次手工启动Apache服务器 如果不知道该怎么填,可以就按图中的那些参数填写,最好将Apache安装成系统服务。[/quote] [quote]第5步:\>选择自定义安装方式 请在这里尽量选择自定义安装方式,可以方便以后的调试。[/quote] [quote]第6步:\>选择Apache安装路径 请选择安装目录,这里尽量将安装路径选择为C:\,其实是安装到C:\Apache目录,因为这样路径简单化,以后写配置文件会省力好多。[/quote] [quote]第7步:\>复制Apache程序文件 请耐心等待一下。[/quote] [quote]第8步:\>Apache安装结束 请点击Finish完成安装。[/quote] [quote]第9步:\>Apache服务正处于自动运行状态 现在可以到管理工具的服务中查看,此时的Apache服务已经处于自动运行状态。[/quote] [quote]第10步:\>修改httpd.conf文件 httpd.conf文件路径:C:\Apache\conf\httpd.conf 注意:httpd.conf文件每行最前如果有#,表示这行注释,要去掉#才能使该行启用。 修改BindAddr

teamspeak3应该有很多人知道吧,fps玩家应该都会用

官网:https://www.teamspeak.com

轻量最近刚出那个宝塔腾讯云版,正好利用一下,省去不少时间

https://www.teamspeak.com/zh-CN/downloads/#server

下完,用宝塔网页上传到后台&解压

要是觉得名字太长,自己改成teamspeak3也不错

cd teamspeak3

需要授权一下

touch .ts3server_license_accepted

然后

./ts3server_startscript.sh start

他会提示

WARNING ! For security reasons we advise: DO NOT RUN THE SERVER AS ROOT

稍等一下就好了

在腾讯云防火墙打开

以下三个端口

UDP: 9987

TCP: 10011

TCP: 30033

宝塔防火墙也要开放这三个端口

注:关了防火墙一劳永逸

守护进程

启动指令是

./ts3server_startscript.sh start

直接用nohup就行啦

nohup ./ts3server_startscript.sh start >output 2>&1 &

想要关闭那就

kill 进程id

就能关闭

如果不想也可以用宝塔的

或者系统的

systemd来守护

我用的是40/月的那款,宽带3M,大概可以10个人同时在线聊天,这样就能边打游戏边聊天了

比QQ,微信,YY好多了

腾讯活动

https://suo.nz/4FS8HH

一、课程介绍

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):

"""

登录窗口


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/334193.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存