免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3186 | 回复: 0

[转]Python Socket 编程示例 [复制链接]

论坛徽章:
0
发表于 2009-12-21 19:59 |显示全部楼层

老师留的作业,用Python写出来的,比C++简单的多 :-)
server端处理使用多线程,希望大家多多指教。
编写一个基于TCP的服务器与客户程序
要求服务器能同时接收5个客户的连接请求
客户从键盘接收用户的输入,在回车后将用户输入的内容发送给服务器,服务器将接收的内容发回,客户方接收后再显示在用户的显示器上(即echo功能),当服务器方接收到exit这个串时,要发回byebye这个消息,然后退出,而客户方在接收到byebye这个消息后再退出。举例如下(客户方):
输入:hello
输出:hello
输入:enjoy socket programming!
输出:enjoy socket programming!
输入:exit
输出:byebye
服务器方的IP地址与端口要以参数的形式给出,如:
C:> tcpclient 202.118.1.60 1234

tcpClient.py
import socket, sys
if __name__ == '__main__':
    #处理参数
    argv = sys.argv
    if (len(argv)!=3) or (len(argv)==2 and argv[1]=='/?'):
        print '>>>Useage:', argv[0], ' '
        sys.exit(0)
    HOST = argv[1]          #Server IP地址
    PORT = int(argv[2])     #Server 端口
    print '>>>HOST:', HOST
    print '>>>PORT:', PORT
    #打开socket
    try:
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    except socket.error:
        print '>>>Fail to open socket!'
        sys.exit(1)
       print '>>>Socket opened...'
    #连接
    try:
        sock.connect((HOST, PORT))
    except socket.error:
        print '>>>Fail to connect!'
        sock.close()
        print '>>>Socket closed...'
        sys.exit(1)
    print '>>>Socket connected...'
   
    flag = 1            #循环标志
    iReturnValue = 0    #系统返回值
    #向Server发送信息并回显
    while(flag):
        msg = raw_input('>>>Input message: ')
   
        if msg == '':
            continue
        if msg == 'exit':
            flag = 0
      
        #发送信息
        try:
            sock.send(msg)
        except socket.error:
            print '>>>Fail to send message!'
            iReturnValue = 1
            break
        print '>>>Message sent    :', msg
        #接收信息
        try:   
            msg = sock.recv(1024)
        except socket.error:
            print '>>>Fail to receive message!'
            iReturnValue = 1
            break
        print '>>>Message received:', msg
    #关闭socket,退出程序
    sock.close()
    print '>>>Socket closed...'
    print 'Exit client program.'
    sys.exit(iReturnValue)
---------------------------------------------
tcpServer.py
import socket, threading
import sys, copy, time
iClientCount = 0 #客户端连接数
def ConnectThread(conn, addr):
    """
    Function called by thread to deal with client connection
   """
    global iClientCount         #引用全局变量
    sock = copy.copy(conn)      
    address = copy.copy(addr)
    flag = 1
    while(flag):
        try:
            msg = sock.recv(1024)
        except socket.error:
            print '>>>A \'receive\' error happened! IP:', address[0],
'PORT:', address[1]
            break
      
        if str(msg) == 'exit':
            msg = 'byebye'
            flag = 0
        
        try:
            sock.send(msg)
        except socket.error:
            print '>>>A \'send\' error happened! IP:', address[0], 'PORT:',
address[1]
            break
    iClientCount -= 1
    print '>>>Disconnected with', address[0], 'at port', address[1]
    print '>>>Total number of connections is', iClientCount
    sock.close()
def ListenThread(sock):
    """
    Function called by thread to listen a connection
    """
    global iClientCount
    while 1:
        if iClientCount >= MAX_CLIENTS:
            time.sleep(5)
            continue
        try:
            conn, addr = sock.accept()
        except socket.error:
            print '>>>An \'accept\' error happened!'
            continue
        iClientCount += 1
        print '>>>Connecting from', addr[0], 'at port', addr[1]
        print '>>>Total number of connections is', iClientCount
        threading.Thread(target=ConnectThread, args=(conn, addr)).start()
if __name__ == '__main__':
    argv = sys.argv
    if (len(argv)>3) or (len(argv)==2 and argv[1]=='/?'):
        print '>>>Useage:', argv[0], '[port=]
[max=]'
        sys.exit(0)
  
    HOST = ''
    PORT = 8006
    MAX_CLIENTS = 5
    for arg in argv[1:]:
        if arg.startwith('port='):
            PORT = int(arg[len('port='):])
        elif arg.startwith('max='):
            MAX_CLIENTS = int(arg[len('max='):])

    print '>>>PORT:', PORT
    print '>>>MAX_CLIENTS:', MAX_CLIENTS
    try:
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    except socket.error:
        print 'Fail to open socket!'
        sys.exit(1)
    print '>>>Socket opened...'
    try:
        sock.bind((HOST, PORT))
    except socket.error:
        print 'Fail to bind port!'
        sock.close()
        sys.exit(1)
    print '>>>Socket binding...'
    try:
        sock.listen(MAX_CLIENTS)
    except socket.error:
        print 'Fail to listen!'
        sock.close()
        sys.exit(1)
   print '>>>Socket listening...'
    threading.Thread(target=ListenThread, args=(sock,)).start()
     #此程序不能自己结束:-)




本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/60332/showart_2127363.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP