欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2023-11-21 20:31:22
最简单的模式,c/s模式实现聊天室 从半双工开始,何谓半双工?半双工即是说双方可以互发消息,但一次只能一个用户发送。  只要稍微会点socket编程的人都会觉...

最简单的模式,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基于C/S模式实现聊天室功能

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。