#服务器端
import socket
import threading
#创建一个TCP端
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#接受来自本地,4444端口的数据
sock.bind(('localhost', 4444))
#最大接受参数
sock.listen(5)
print('Server', socket.gethostbyname('localhost'), 'listening ...')
#创建一个空字典和一个空列表
mydict = dict()
mylist = list() # 把whatToSay传给除了exceptNum的所有人
def tellOthers(exceptNum, whatToSay):
for c in mylist:#遍历空字典
if c.fileno() != exceptNum:
try:
c.send(whatToSay.encode())#向tcp发送数据并编码为当前
except:
pass def subThreadIn(myconnection, connNumber):
nickname = myconnection.recv(1024).decode()#读取网络数据并解码
mydict[myconnection.fileno()] = nickname
mylist.append(myconnection)#传入列表
print('connection', connNumber, ' has nickname :', nickname)
tellOthers(connNumber, '【系统提示:' + mydict[connNumber] + ' 进入聊天室】')
while True:
try:
recvedMsg = myconnection.recv(1024).decode()
if recvedMsg:
print(mydict[connNumber], ':', recvedMsg)
tellOthers(connNumber, mydict[connNumber] + ' :' + recvedMsg) except (OSError, ConnectionResetError):
try:
mylist.remove(myconnection)
except:
pass
print(mydict[connNumber], 'exit, ', len(mylist), ' person left')
tellOthers(connNumber, '【系统提示:' + mydict[connNumber] + ' 离开聊天室】')
myconnection.close()
return while True:
connection, addr = sock.accept()
print('Accept a new connection', connection.getsockname(), connection.fileno())
try:
# connection.settimeout(5)
buf = connection.recv(1024).decode()
if buf == '1':
connection.send(b'welcome to server!') # 为当前连接开辟一个新的线程
mythread = threading.Thread(target=subThreadIn, args=(connection, connection.fileno()))
mythread.setDaemon(True)
mythread.start() else:
connection.send(b'please go out!')
connection.close()
except:
pass

  

#客户端
import socket
import time
import threading sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect(('localhost', 4444))
sock.send(b'1')
print(sock.recv(1024).decode())
nickName = input('input your nickname: ')
sock.send(nickName.encode()) def sendThreadFunc():
while True:
try:
myword = input()
sock.send(myword.encode())
# print(sock.recv(1024).decode())
except ConnectionAbortedError:
print('Server closed this connection!')
except ConnectionResetError:
print('Server is closed!') def recvThreadFunc():
while True:
try:
otherword = sock.recv(1024)
if otherword:
print(otherword.decode())
else:
pass
except ConnectionAbortedError:
print('Server closed this connection!') except ConnectionResetError:
print('Server is closed!') th1 = threading.Thread(target=sendThreadFunc)
th2 = threading.Thread(target=recvThreadFunc)
threads = [th1, th2] for t in threads:
t.setDaemon(True)
t.start()
t.join()

  

最新文章

  1. linux输入子系统(input subsystem)之evdev.c事件处理过程
  2. 两种让tableview返回顶部的方法
  3. Android中各种Drawable总结
  4. C/C++:[2]enum-枚举量声明、定义和使用
  5. POJ3237-Tree (树链剖分,线段树区间更新+点更新+区间查询)
  6. C# 图片保存到数据库和从数据库读取图片并显示
  7. linux下建立无线wifi------简单实用!
  8. Java创建线程的细节分析
  9. jsp小商城
  10. [WinForm]动态显示本地目录图片与悬浮窗
  11. 发送email
  12. 安装指定版本的docker服务
  13. Java与C/C++有什么区别?
  14. POJ 2942Knights of the Round Table(tarjan求点双+二分图染色)
  15. ajax 浏览网页等待页面
  16. 文件处理(如果文件存在则追加,不存在则生成多级文件夹以及txt目录)
  17. Jfrog Maven jenkins pipeline 流水线 培训 简单实验
  18. 使用jquery.mCustomScrollbar自定义滚动条(3)callback onCreate
  19. elasticsearch ik安装
  20. 3G - 汉字统计

热门文章

  1. win10 下 学习 xe10 误以为调试失效
  2. PHP-无限级分类
  3. JAVA NIO学习二:通道(Channel)与缓冲区(Buffer)
  4. Linux目录结构介绍-http://yangrong.blog.51cto.com/6945369/1288072
  5. JAVA图片批量上传JS-带预览功能
  6. 本机向windows服务器传输文件的三种方法
  7. Jasperreports以及iReport4.5报表PDF导出字体完美解决方案
  8. 三:Redis连接池、JedisPool详解、Redisi分布式
  9. 鸟哥的linux私房菜学习-(二)VMware虚拟机及linux系统安装过程
  10. Python并发实践_01_线程与进程初探