C语言socket多线程聊天室,使用Socket与多线程实现聊天室

阅读: 评论:0

C语言socket多线程聊天室,使用Socket与多线程实现聊天室

C语言socket多线程聊天室,使用Socket与多线程实现聊天室

版本:Python3

知识点:Socket,threading

一、服务器端

1,服务器绑定地址与端口号,保持监听状态。

2,无限循环接收客户端的连接,验证身份判断是否是客户端,如果不是立即关闭连接,如果是则创建一个新线程管理对客户端的所有操作,并将其加入到连接池。

3,当客户端主动终止连接时,通知其他用户其已离开聊天室,关闭连接,从连接池里将其剔除。

运行演示.png

代码:

# encoding: utf-8

# Author: Timeashore

# Time: 2017-12-31

# Email: 1274866364@qq

# 服务器端

import threading

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.bind(('127.0.0.1',5000))

s.listen(5)

print('Server',hostbyname('127.0.0.1'),'listening ...')

mydict = dict() # fileno:nickname

mylist = list() # 连接池列表

# 向在线人发送消息(除了发消息本人)

def send_everybody(number, message):

for user in mylist:

if user.fileno() != number:

user.de())

# 每个线程的调用方法,管理对客户端的所有操作

def fun(conn, number):

mylist.append(conn) # 添加到连接池

nickname = v(1024).decode()

conn.send(('Hello,'+nickname).encode())

mydict[number] = nickname # 添加到fileno:nickname

print('connection',number,'has nickname : ',nickname) # 打印链接信息

send_everybody(number, '【系统提示:'+nickname+' 进入聊天室】')

while True:

try:

conn.send(''.encode())

getmessage = v(1024).decode()

if getmessage:

print(nickname,':',getmessage)

send_everybody(number,nickname+': '+getmessage)

except (OSError, ConnectionResetError):

try:

except:

pass

print(nickname, 'exit, ', len(mylist), ' person left') # 服务器终端打印离开信息

send_everybody(number, '【系统提示:' + nickname + ' 离开聊天室】') # 告知所有人nickname已经离开聊天室

conn.close() # 关闭连接

return

while True:

conn, addr = s.accept()

print('Accept new connection',sockname(),conn.fileno())

try:

verification = v(1024).decode()

if verification == 'user':

conn.send('welcome to server!n'.encode())

conn.send('nickname:n'.encode())

t = threading.Thread(target=fun, args=(conn, conn.fileno()))

t.setDaemon(True)

t.start()

else:

conn.send('Your verification NOT pass'.encode())

conn.close()

except:

pass

二、客户端

与服务器端相比,客户端比较简单。

1,与服务器建立连接,发送身份验证信息。

2,启动两个线程,一个发送消息,一个接收消息。

用户1.png

用户2.png

代码:

# encoding: utf-8

# Author: Timeashore

# Time: 2017-12-31

# Email: 1274866364@qq

import socket

import threading

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.send('user'.encode()) # 验证身份

v(1024).decode()) # 接受欢迎消息

v(1024).decode()) # 接受欢迎消息

nickname = input()

s.de())

# 接收消息

def recv():

while True:

try:

message = s.recv(1024).decode()

if message:

print(message)

else:

pass

except ConnectionAbortedError:

print('Server closed this connection!')

except ConnectionResetError:

print('Server is closed!')

# 发送消息

def send():

while True:

try:

ready_send = input('')

s.send(de())

except ConnectionAbortedError:

print('Server closed this connection!')

except ConnectionResetError:

print('Server is closed!')

# 启动两个线程,一个发送一个接收

t1 = threading.Thread(target=recv)

t2 = threading.Thread(target=send)

for x in [t1,t2]:

x.setDaemon(True)

x.start()

t1.join()

t2.join()

以上是在终端运行,可以使用Python GUI工具 Tkinter 给客户端增加一个界面,客户端收到的消息实时显示在界面上,需要处理线程和GUI的配合。

GUI客户端.png

本文发布于:2024-02-02 17:05:18,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170686471745221.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:多线程   聊天室   语言   Socket   socket
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23