小小聊天室Python代码实现

637次阅读  |  发布于5年以前

相对于Java方式的聊天室,Python同样可以做得到。而且可以做的更加的优雅。想必少了那么多的各种流的Python Socket,你一定会喜欢的。
至于知识点相关的内容,这里就不多说了。

UDP方式

服务器端


    # coding:utf-8

    #  __author__ = 'Mark sinoberg'
    #  __date__ = '2016/7/7'
    #  __Desc__ = 创建一个简单的套接字监听请求

    import socket

    HOST = '192.168.59.255'
    PORT = 9998

    s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    s.bind(('',PORT))
    print '套接字已启动!'
    while True:
      data,addr = s.recvfrom(1024)
      print addr,str(' : ')+data

客户端


    # coding:utf-8

    #  __author__ = 'Mark sinoberg'
    #  __date__ = '2016/7/7'
    #  __Desc__ = socket的客户端的简单实现

    import socket

    PORT = 9998
    HOST = '192.168.59.255'
    s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    words = raw_input('Client:')
    while words != 'quit':
      s.sendto(words,(HOST,PORT))
      words = raw_input('Client:')
    s.close()

是不是很简单啊。我们需要注意的就是socket的第二个参数为SOCK_DGRAM。因为这和TCP方式的SOCK_STREAM 有所不同。

TCP方式

服务器端


    # coding:utf-8

    #  __author__ = 'Mark sinoberg'
    #  __date__ = '2016/7/7'
    #  __Desc__ = 简单的tcpsocket的实现

    from socket import *
    from time import ctime

    HOST = ''
    PORT = 9999
    BUFFERSIZE = 1024
    ADDRESS = (HOST,PORT)

    s = socket(AF_INET,SOCK_STREAM)
    s.bind(ADDRESS)
    s.listen(5)

    while True:
      print 'Waiting for clients cennect!'
      tcpclient,addr = s.accept()
      print 'Connected By ',addr

      while True:
        try:
          data = tcpclient.recv(BUFFERSIZE)
        except Exception,e:
          print e.message
          tcpclient.close()
          break
        if not data:
          print "No Data received!"
          break
        senddata = 'Hi,you send me:[%s]%s'%(ctime(),data.encode('utf8'))
        tcpclient.send(senddata.encode('utf8'))
        print addr,' Says:',ctime(),data.encode('utf8')

    tcpclient.close()
    s.close()

客户端


    # coding:utf-8

    #  __author__ = 'Mark sinoberg'
    #  __date__ = '2016/7/7'
    #  __Desc__ = 简单的tcp socket客户端的实现

    from socket import *

    class TcpClient:
      # HOST = 'localhost'
      PORT = 9999
      HOST = '192.168.59.225'
      BUFFSIZ = 1024
      ADDR = (HOST,PORT)
      def __init__(self):
        self.client = socket(AF_INET,SOCK_STREAM)
        self.client.connect((self.HOST,self.PORT))

        while True:
          senddata = raw_input('>>>')
          if not senddata:
            print 'Please input some words!\n>>>'
            continue
          if senddata == "quit":
            break
          self.client.send(senddata.encode('utf8'))
          recvdata = self.client.recv(self.BUFFSIZ)
          if not recvdata:
            break
          print recvdata.encode('utf8')

    if __name__ == "__main__":
      client = TcpClient()

TCP方式演示结果:(注意先开启服务器端)

服务器端

D:\Software\Python2\python.exe E:/Code/Python/MyTestSet/sockettest/SimpleTCPServer.py
Waiting for clients cennect!
Connected By ('192.168.59.225', 63095)
('192.168.59.225', 63095) Says: Thu Jul 07 16:01:10 2016 Hello World
('192.168.59.225', 63095) Says: Thu Jul 07 16:01:15 2016 haode
No Data received!
Waiting for clients cennect!

客户端

D:\Software\Python2\python.exe E:/Code/Python/MyTestSet/sockettest/SimpleTcpClient.py

Hello World
Hi,you send me:[Thu Jul 07 16:01:10 2016]Hello World

Please input some words!

haode
Hi,you send me:[Thu Jul 07 16:01:15 2016]haode
quit

Process finished with exit code 0

总结

简单的使用TCP或者是UDP确实很容易,然而要想更好的利用这两个协议,就需要好好的设计一番了。

这里我想强调的是,注意tcp和udp创建套接字时指定的参数即可。

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

Copyright© 2013-2020

All Rights Reserved 京ICP备2023019179号-8