1.直接上代码

server:

__author__ = 'Alex'
#coding:utf-8
import socket

ip_port = ('127.0.0.1',8000)
sk = socket.socket()
sk.bind(ip_port)
sk.listen(5)
print ("服务端启动...")

while True:
    conn,addr = sk.accept()
    while True:
        try:
            recv_data = conn.recv(1024)
            if len(recv_data) == 0:break
        except Exception as e:
            print ("意外中断")
            break
        print (str(recv_data,"utf8"))
        send_data = input(">>>>>>")
        conn.sendall(bytes(send_data,"utf8"))
    conn.close()

######################################################### client:
__author__ = 'Alex' #coding:utf-8 import socket ip_port = ('127.0.0.1',8000) sk = socket.socket() sk.connect(ip_port) print ("客户端启动...") while True: send_data = input(">>>>>>>") if send_data == 'exit': break sk.send(bytes(send_data,"utf8")) recv_data = sk.recv(1024) print (str(recv_data,"utf8")) sk.close()

这个程序里面要做几点说明:1,如果客户端发exit,那么服务端会接收到一个空字符串,因为可以通过对接收的字符串长度的判断来知道客户端是否退出了;2,如果客户端是通过程序终止的方式来关闭,那么服务器会收到一个Exception,那么服务端要对应的做异常处理(WINDOWS环境下),如果是LINUX的情况下,程序终止会导致服务端接收到空字符串。

 

2.多消息并发,如果一个SERVER端想同时和多个CLIENT端进行通信,那么需要使用多线程或者IO多路复用,我们的socketserver.ThreadingTCPServer中封装了这样的功能。

为什么我们要定义在handle方法中来实现,需要看继承关系:

SERVER:

__author__ = 'Alex'
#coding:utf-8
import socketserver

class MyServer(socketserver.BaseRequestHandler):

    def handle(self):
        print ("服务端启动...")
        while True:
            conn = self.request
            print (self.client_address)
            while True:
                recv_data = conn.recv(1024)
                print (str(recv_data,"utf8"))
                send_data = input(">>>>>>")
                conn.sendall(bytes(send_data,"utf8"))
            conn.close()


if __name__ == '__main__':
    server = socketserver.ThreadingTCPServer(('127.0.0.1',8999),MyServer)
    server.serve_forever()


CLIENT:

__author__ = 'Alex'
#coding:utf-8
import socket

ip_port = ('127.0.0.1',8999)
sk = socket.socket()
sk.connect(ip_port)
print ("客户端启动...")


while True:
    send_data = input(">>>>>>>")
    # print (send_data)
    sk.send(bytes(send_data,"utf8"))
    if send_data == 'exit':
        # print ("It's True")
        break
    recv_data = sk.recv(1024)

    print (str(recv_data,"utf8"))
sk.close()

这样就可以实现一个服务端对多个客户端的通信了。

 

__author__ = 'Alex'
#coding:utf-8
import socketserver
import time
class MyServer(socketserver.BaseRequestHandler):

    def handle(self):
        print ("服务端启动...")
        while True:
            conn = self.request
            print (conn)
            print (self.client_address)
            while True:
                try:
                    time.sleep(5)
                    recv_data = conn.recv(1024)
                    print (str(recv_data,"utf8"))
                    if str(recv_data,"utf8") == 'exit':
                        print ("服务器发起了exit")
                        break
                    if len(recv_data) == 0:
                        print ("没有数据,请等待")
                        break
                except Exception:
                    print ("意外中断")
                    break

                print (str(recv_data,"utf8"))
                send_data = input(">>>>>>")
                conn.sendall(bytes(send_data,"utf8"))
            conn.close()


if __name__ == '__main__':
    server = socketserver.ThreadingTCPServer(('127.0.0.1',8999),MyServer)
    server.serve_forever()

 

posted on 2016-08-20 01:40  Alex0425  阅读(195)  评论(0编辑  收藏  举报