server用於中轉訊息,如果想要實現真實的聊天室,必須將server的ip設定為雲服務,或者公網ip
from socket import
*from select import select
defmain()
:'main 主函式'
server = socket(af_inet, sock_stream)
# 建立tcp套接字
server.setsockopt(sol_socket, so_reuseaddr,1)
# 設定埠可立即重用
addr =
'127.0.0.1'
,5555
server.bind(addr)
# 繫結位址
server.listen(
)# 監聽
# 接收函式
accept(server)
defaccept
(server)
:'accept 伺服器接受函式'
# 使用select模組的select方法實現io多路復用監聽傳輸
rlist =
[server]
wlist =
xlist =
while
true
: rs, ws, xs = select(rlist, wlist, xlist)
for r in rs:
# 伺服器接受客戶端連線
if r is server:
try:
conn, addr = server.accept(
) welcome(conn)
# 將客戶端套接字新增到rlist中以監聽
(, addr)
except
:pass
else
:# 伺服器接受客戶端的訊息並**給所有客戶端
try:
data = r.recv(
1024
)# **資訊給其他客戶端
data = b'\n'
+ data + b'\n'
(data.decode(
), end='')
for c in rlist[1:
]:if c is
not r:
c.send(data)
except
: rlist.remove(r)
defwelcome
(client)
: client.send(b'welcome! \n'
)return
true
if __name__ ==
'__main__'
:# 主函式
main(
)
import os, sys
import threading
from socket import
*from select import select
defmain()
:'main 主函式'
client = socket(af_inet, sock_stream)
# 建立tcp套接字
if login(client)
: t_recv = threading.thread(target=recv, args=
(client,))
t_send = threading.thread(target=send_msg, args=
(client,))
t_recv.start(
) t_send.start(
)def
send_msg
(client)
:while
true
: send_data =
input
("請輸入要傳送的資料:"
) send_data = username +
":"+send_data
client.send(send_data.encode(
"utf-8"))
defrecv
(client)
:# 使用select模組的select方法實現io多路復用監聽傳輸
rlist =
[client]
wlist =
xlist =
while
true
: rs, ws, xs = select(rlist, wlist, xlist)
for r in rs:
if r is client:
# 接受伺服器發來的訊息
data = client.recv(
1024
)if data.decode()==
'\n'
:# 如果訊息為回車,聊天室關閉
client.close(
) os._exit(0)
else
:# 列印接收到的資訊
(data.decode(
), end='')
deflogin
(client)
:'登入函式 login'
curuser =
input
('輸入名稱》'
)global username
username = curuser
addr =
'127.0.0.1'
,5555
client.connect(addr)
# 連線到伺服器位址
data = curuser +
': '
+"進入房間"
client.send(data.encode())
return
true
if __name__ ==
'__main__'
: main(
)
import os, sys
import threading
from socket import
*from select import select
defmain()
:'main 主函式'
client = socket(af_inet, sock_stream)
# 建立tcp套接字
if login(client)
: t_recv = threading.thread(target=recv, args=
(client,))
t_send = threading.thread(target=send_msg, args=
(client,))
t_recv.start(
) t_send.start(
)def
send_msg
(client)
:while
true
: send_data =
input
("請輸入要傳送的資料:"
) send_data = username +
":"+send_data
client.send(send_data.encode(
"utf-8"))
defrecv
(client)
:# 使用select模組的select方法實現io多路復用監聽傳輸
rlist =
[client]
wlist =
xlist =
while
true
: rs, ws, xs = select(rlist, wlist, xlist)
for r in rs:
if r is client:
# 接受伺服器發來的訊息
data = client.recv(
1024
)if data.decode()==
'\n'
:# 如果訊息為回車,聊天室關閉
client.close(
) os._exit(0)
else
:# 列印接收到的資訊
(data.decode(
), end='')
deflogin
(client)
:'登入函式 login'
curuser =
input
('輸入名稱》'
)global username
username = curuser
addr =
'127.0.0.1'
,5555
client.connect(addr)
# 連線到伺服器位址
data = curuser +
': '
+"進入房間"
client.send(data.encode())
return
true
if __name__ ==
'__main__'
: main(
)
基於UDP聊天室程式
基於udp聊天室程式使用socket程式設計實現。windows套接字在兩種模式下執行i o操作,阻塞和非阻塞。在阻塞模式下,在i o操作完成前,執行操作的winsock函式會一直等待下去 如recvfrom,wsarecvfrom函式 不會立即返回程式 將控制權交還給程式 而在非阻塞模式下,win...
基於PHP MySQL的聊天室設計
mysql併發能力強 響應速度快,是效能優異的資料庫軟體 php是功能強大的伺服器端指令碼語言。筆者在 開發中,採用 php4.0 mysql3.23.38建立了多種應用。下面,以乙個簡單的 聊天室設計為例,介紹 php mysql在網頁開發中的應用。1 總體設計 1 1 構思與規劃 聊天室的基本原...
基於PHP MySQL的聊天室設計
mysql併發能力強 響應速度快,是效能優異的資料庫軟體 php是功能強大的伺服器端指令碼語言。筆者在 開發中,採用php4.0 mysql3.23.38建立了多種應用。下面,以乙個簡單的聊天室設計為例,介紹php mysql在網頁開發中的應用。1 總體設計 1 1 構思與規劃 聊天室的基本原理,就...