首页 > 其他 > 详细

socket本地模拟服务器+客户端(二)

时间:2016-08-06 23:30:57      阅读:570      评论:0      收藏:0      [点我收藏+]

建立两个py文件,分别打开两个cmd界面,即可进行通信。服务器端运用多进程,连续不断的处理从客户端接收到的数据;客户端通过一个list不断给客户端发送数据。

(每个连接都必须创建新线程(或进程)来处理,否则,单线程在处理连接的过程中,无法接受其他客户端的连接。)本例中,多进程其实没有起到作用。

代码以及解释如下:

#socket服务器端程序
import socket
import time
from multiprocessing import Process         #多进程和多线程一样的用法

def tcplink(sock1,addr1):                   #新建一个函数,用来接收客户端发来的信息
    print(Accept new connection......)
    sock1.send(bwelcom)                   #若连接建立成果,服务器给客户端发送一个welcome
    while 1:                                #服务器持续接收客户端发送过来的数据,直到服务器收到exit时,退出不在接收数据
        data = sock1.recv(1024)             #接收数据
        time.sleep(1)                       #延时1s

        ‘‘‘data为客户端发送给服务器的数据,服务器给客户端发送hello,%data ,全部转为utf-8编码‘‘‘
        sock1.send((hello,%s%data.decode(utf-8)).encode(utf-8))

        if not data or data.decode(utf-8) == exit:
            break

    sock1.close()                           #连接关闭
    print(connection form %s is close....%addr1)

if __name__ == "__main__":
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)           #建立一个套接字
    ‘‘‘监听端口127.0.0.1表示客户端和服务器必须都为本机才能运行。
    我们要绑定监听的地址和端口。服务器可能有多块网卡,可以绑定到
    某一块网卡的IP地址上,也可以用0.0.0.0绑定到所有的网络地址,还
    可以用127.0.0.1绑定到本机地址。127.0.0.1是一个特殊的IP地址,表
    示本机地址,如果绑定到这个地址,客户端必须同时在本机运行才能连接
    ,也就是说,外部的计算机无法连接进来。端口号需要预先指定。因为我
    们写的这个服务不是标准服务,所以用9999这个端口号。请注意,小于1024
    的端口号必须要有管理员权限才能绑定:‘‘‘
    s.bind((127.0.0.1, 9999))

    s.listen(1)                                     #同时接收连接的最大数量
    print(Waiting for connecting......)

    while 1:                                        #服务器通过一个循环来一直接收来之客户端发送的信息
        sock,addr = s.accept()                      #s.accept返回两个数据
        t = Process(target=tcplink,args=(sock,addr))    #多线程
        t.start()                                       #开启多线程
#socket客户端程序
#同chenhang001.py
import socket

s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)        #新建一个套接字
s.connect((127.0.0.1,9999))                               #建立连接,为什么是双括号

print(s.recv(1024).decode(utf-8))                         #打印接收到的数据

#发送数据,定义一个list,
for data111 in [bchenhang,bwangyadan,bwuhankejidaxue,bwuchangfenxiao]:
    s.send(data111)
    print(s.recv(1024).decode(utf-8))
# for a in range(100):
#     s.send(b(a))

s.send(bexit)             #发送exit字符,服务器退出接收数据

 

socket本地模拟服务器+客户端(二)

原文:http://www.cnblogs.com/hanggegege/p/5745033.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!