python基于C/S模式实现聊天室功能

yipeiwu_com6年前Python基础

最简单的模式,C/S模式实现聊天室

从半双工开始,何谓半双工?半双工即是说双方可以互发消息,但一次只能一个用户发送。

 只要稍微会点socket编程的人都会觉得很简单,所以过过场,直接上代码。

服务器端代码:

from socket import *
from time import ctime
 
HOST = ''
PORT = 4568
BUFSIZE = 1024
ADDR = (HOST,PORT)
 
tcpSerSocket = socket(AF_INET, SOCK_STREAM)
tcpSerSocket.bind(ADDR)
tcpSerSocket.listen(5)
 
while True:
 print('waitint for connection...')
 tcpCliSocket, addr = tcpSerSocket.accept()
 print('connecting from: ', addr)
 
 while True:
 data = tcpCliSocket.recv(BUFSIZE)
 if not data:
  break
 print data
 msg = raw_input('>')
 tcpCliSocket.send('[%s] %s' % (ctime(), msg))
 
tcpCliSocket.close()
tcpSerSocket.close()

客户端代码:

from socket import *
 
HOST = 'localhost'
PORT = 4568
BUFSIZE = 1024
ADDR = (HOST, PORT)
 
tcpCliSocket = socket(AF_INET, SOCK_STREAM)
tcpCliSocket.connect(ADDR)
 
while True:
 data = raw_input('>>')
 if not data:
 break
 tcpCliSocket.send(data)
 data = tcpCliSocket.recv(BUFSIZE)
 if not data:
 break
 print data
 
tcpCliSocket.close()

运行结果我就不截图了,如果还不会的就复制下来运行一遍。

上面只是最简单的入门,一点都不好使,问题多着。

下面看怎么实现全双工。全双工就是双方可任意给对方发送消息。

全双工明显要用到多线程。我们在主线程之外创建两个子线程,一个负责接收消息,另一个负责接受用户输入并发送消息。

服务器端代码:

#coding: utf-8
from socket import *
from time import ctime
import threading
from sys import stdout
 
HOST = ''
PORT = 21567
BUFSIZE = 1024
ADDR = (HOST, PORT)
 
def Send(sck):
 while True:
 data = raw_input('>')
 sck.send(data)
 
def Deal(sck, addr):
 while True:
 data = sck.recv(BUFSIZE)
 if data == "quit":
  sck.close()
  break
 str = '\nfrom' + addr[0] + ':' + data + '\n>'
 stdout.write(str)
 
chatSerSock = socket(AF_INET, SOCK_STREAM)
chatSerSock.bind(ADDR)
chatSerSock.listen(5)
 
threads = []
 
while True:
 print 'waiting for connection...'
 chatCliSock, addr = chatSerSock.accept()
 print "...connected from: ", addr
 t = threading.Thread(target=Deal, args=(chatCliSock, addr))
 threads.append(t)
 t = threading.Thread(target=Send, args=(chatCliSock,))
 threads.append(t)
 for i in range(len(threads)):
 threads[i].start()
 threads[0].join()
 
chatCliSock.close()
chatSerSock.close()

客户端代码:

#coding: utf8
from socket import *
from time import ctime
import threading
from sys import stdout
 
def Send(sck, test):
 while True:
 data = raw_input('>')
 sck.send(data)
 if data == "quit":
  break
def Recieve(sck, test):
 while True:
 data = sck.recv(BUFSIZ)
 if data == "quit":
  sck.close()
  break
 str = "\nfrom server:" + data + "\n>"
 stdout.write(str)
 
HOST = 'localhost'
PORT= 21567
BUFSIZ = 1024
ADDR = (HOST, PORT)
threads = []
 
if __name__ == "__main__":
 chatCliSock = socket(AF_INET, SOCK_STREAM)
 chatCliSock.connect(ADDR)
 t = threading.Thread(target=Send, args = (chatCliSock, None))
 threads.append(t)
 t = threading.Thread(target=Recieve, args = (chatCliSock, None))
 threads.append(t)
 for i in range(len(threads)):
 threads[i].start()
 threads[0].join()
 
chatCliSock.close()

运行结果:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持【听图阁-专注于Python设计】。

相关文章

Python实现获取照片拍摄日期并重命名的方法

Python实现获取照片拍摄日期并重命名的方法

本文实例讲述了Python实现获取照片拍摄日期并重命名的方法。分享给大家供大家参考,具体如下: python获取照片的拍摄日期并重命名。不支持重复处理的中断。 重命名为:拍摄日期__原文...

Mac下Anaconda的安装和使用教程

前提 在刚接触python的时候我想大多数人都会面临一个问题,我到底是选择2还是3,因为现在网上好多的资料和视频项目中都还是用的2,我们跟着学习的时候肯定也是首先从2开始学的,但是我们心...

Python多线程学习资料

一、Python中的线程使用: Python中使用线程有两种方式:函数或者用类来包装线程对象。 1、 函数式:调用thread模块中的start_new_thread()函数来产生新线程...

Python 实现判断图片格式并转换,将转换的图像存到生成的文件夹中

我就废话不多说了,直接上代码吧! import Image from datetime import datetime import os str = '/home/dltest/c...

Python变量类型知识点总结

Python变量类型知识点总结

变量存储在内存中的值。这就意味着在创建变量时会在内存中开辟一个空间。 基于变量的数据类型,解释器会分配指定内存,并决定什么数据可以被存储在内存中。 因此,变量可以指定不同的数据类型,...