`

python 网络(一、TCP套接字服务器-客户端)

 
阅读更多

1. 环境准备

(1) vmware workstation上启动两台虚拟机 rhel5.0 server i386, 每台都有网卡,且配置为NAT方式(因为在学校做实验,用学校的DHCP设备分配IP需要学号/密码验证,而我只有一个学号密码,用Bridge方式只能分配一个IP;故只能采用NAT方式,因为这种方式的DHCP服务器上宿主物理机上虚拟出来的)

(2) 设置网卡配置文件以DHCP方式获取到IP地址

cat /etc/sysconfig/network-scripts/ifcfg-eth0

DEVICE=eth0
ONBOOT=yes
BOOTPROTO=dhcp

(3) 重启网络服务

service network restart

 

(4) 注意需要把服务器端的防火墙关闭

service iptables stop

 

2. TCP socket服务器

 

select服务器

# -*- coding: gb18030 -*-
import socket, select

host = socket.gethostname()
port = 1234

s = socket.socket()
s.bind((host, port))
s.listen(5)

inputs = [s]

while True:
    rs, ws, es = select.select(inputs, [], [])
    for r in rs:
        if r is s:  #r是"服务器端的监听套接字"
            c, addr = s.accept()
            print 'Got connection from ', addr
            inputs.append(c)
        else:       #r是"服务器端的套接字"
            try:
                data = r.recv(1024)
                disconnected = not data
            except socket.error:
                disconnected = True

            if disconnected:
                print r.getpeername(), 'disconnected'
                inputs.remove(r)
            else:
                print data
 

 

 asyncore服务器(用async_chat处理连接会话)

# -*- coding: gb18030 -*-
from asyncore import dispatcher
from asynchat import async_chat
import socket, asyncore

#select在linux和widows上都可以用
#poll在windows上不能用,而且asyncore.loop()中好像用到了poll

PORT = 5005
NAME = "TestChat"

class ChatSession(async_chat):
    '''处理服务器和一个用户之间连接的类'''
    def __init__(self, server, sock):
        async_chat.__init__(self, sock)
        self.server = server    #在session中关联server
        self.set_terminator("\r\n")
        self.data = []

        self.push("Welcome to %s"%self.server.name)

    def collect_incoming_data(self, data):
        self.data.append(data)
        
    def found_terminator(self):
        '''如果发现了一个终止对象,也就发现了一个完整的行,将其广播给所有人'''
        line = ''.join(self.data)
        self.data = []
        self.server.broadcast(line)

    def handle_close(self):
        async_chat.handle_close(self)
        self.server.disconnect(self)

class ChatServer(dispatcher):
    '''接受连接并且产生单个会话的类。它会处理其他会话的广播'''
    def __init__(self, port, name):
        dispatcher.__init__(self)
        self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
        self.set_reuse_addr()
        self.bind(('',port))
        self.listen(5)
        
        self.name = name

        self.sessions = []    #在server中关联session
        
    def broadcast(self, line):
        for session in self.sessions:
            session.push(line + "\r\n")

    def handle_accept(self):
        conn, addr = self.accept()
        self.sessions.append(ChatSession(self, conn))

if __name__ == "__main__":

    s = ChatServer(PORT, NAME)

    try:
        asyncore.loop()
    except KeyboardInterrupt:
        print

 

 

3. TCP socket客户机

import socket
import time

host = socket.gethostname()
port = 1234
s = socket.socket()
s.connect((host, port))

while True:
    str_to_server = raw_input("send sth. to server: ")
    s.send(str_to_server)
    
    #print s.recv(1024)

 

参考文档

socket — Low-level networking interface:               http://docs.python.org/2/library/socket.html

socket programing HOWTO:                                   http://docs.python.org/2/howto/sockets.html 

python网络编程                    http://www.cnblogs.com/hnrainll/archive/2012/10/25/2738094.html 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics