服务器端代码:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
# -*- coding: cp936 -*-
import
socket
sock
=
socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#初始化socket
sock.bind((
"127.0.0.1"
,
8001
))
#绑定本机地址,8001端口
sock.listen(
5
)
#等待客户连接
while
True
:
print
"waiting client connection..."
connection,address
=
sock.accept()
#接收客户连接请求
print
"a client have connected..."
while
True
:
try
:
connection.settimeout(
5
)
#设置超时时间
buf
=
connection.recv(
1024
)
#接收数据
if
buf
=
=
"1"
:
connection.send(
"you have send me 1!welcome to server!"
)
elif
buf
=
=
"2"
:
connection.send(
"you have send me 2!I have recv!"
)
elif
buf
=
=
"3"
:
connection.send(
"close the connection!"
)
break
else
:
connection.send(
"unknow command!"
)
except
socket.timeout:
print
"time out"
connection.close()
print
"a client exit..."
|
客户器端代码:
|
1
2
3
4
5
6
7
8
9
10
11
12
|
import
socket
sock
=
socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((
"127.0.0.1"
,
8001
))
import
time
time.sleep(
2
)
while
True
:
data
=
raw_input
(
"input command:"
);
sock.send(data)
print
sock.recv(
1024
)
if
data
=
=
"3"
:
break
sock.close()
|
1.首先开两个IDLE,分别打开服务器端和客户器端代码。
2.F5运行服务器端代码,会出现waiting client connection...
3.F5运行客户端代码,会出现input command: ;
4.这时服务器和客户端就连接上了,可以正常的通信啦,如图:
5.再次运行服务器端代码时会出现错误,这时可以通过任务管理器,将其中的pythonw.exe进程结束,重新打开,编译就可以啦!
客户端:
|
1
2
3
4
5
6
|
import
socket
s
=
socket.socket()
host
=
socket.gethostname()
port
=
1234
s.connect((host, port))
print
s.recv(
1024
)
|
服务端:
|
1
2
3
4
5
6
7
8
9
10
11
12
|
import
socket
s
=
socket.socket()
host
=
socket.gethostname()
port
=
1234
s.bind((host, port))
s.listen(
5
)
while
True
:
c, addr
=
s.accept()
print
‘Got connection from‘
, addr
c.send(
‘Thank you for connecting‘
)
c.close()
|
http编程
|
1
2
|
from
urllib
import
urlopen
|
加上正规表达式
|
1
2
3
4
|
import
re
text
=
webpage.read()
m
=
re.search(
‘<a href="([^"]+)" .*?>about</a>‘
, text, re.IGNORECASE)
m.group(
1
)
|
urllib
urllib2
一个基于SocketServer的小型服务器例子:
|
1
2
3
4
5
6
7
8
9
|
from
SocketServer
import
TCPServer, StreamRequestHandler
>>>
class
Handler(StreamRequestHandler):
def
handle(
self
):
addr
=
self
.request.getpeername()
print
‘Got connection from‘
, addr
self
.wfile.write(
‘Thank you for connecting‘
)
>>> server
=
TCPServer((‘‘,
1234
), Handler)
>>> server.serve_forever()
|
使用SocketServer进行分叉和线程处理
分叉Server:
|
1
2
3
4
5
6
7
8
9
|
from
SocketServer
import
TCPServer,ForkingMinIn, StreamRequestHandler
class
Server(ForkingMinIn, TCPServer):
pass
class
Handler(StreamRequestHandler):
def
handle(
self
):
addr
=
self
.request.getpeername()
print
‘Got connection from‘
,addr
self
.wfile.write(
‘Thank you for connection‘
)
server
=
Server((‘‘,
1234
),Handler)
server.serve_forever()
|
线程Server:
|
1
2
3
4
5
6
7
8
9
|
from
SocketServer
import
TCPServer, ThreadingMixIn, StreamRequestHandler
class
Server(ThreadingMixIn, TCPServer):
pass
class
Handler(StreamRequestHandler):
def
handle(
self
):
addr
=
self
.request.getpeername()
print
‘Got connection from‘
,addr
self
.wfile.write(
‘Thank you for connecting‘
)
server
=
Server((‘‘,
1234
),Handler)
server.serve_forever()
|
带有select和pool的异步I/O
select服务:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
import
socket, select
s
=
socket.socket()
host
=
socket.gethostname()
prot
=
1234
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:
c, addr
=
s.accept()
print
‘Got connection from‘
,addr
inputs.append(c)
else
:
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
|
pool服务器:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
import
socket, select
s
=
socket.socket()
host
=
socket.gethostname()
port
=
1234
s.bind((host, port))
fdmap
=
{s.fileno():s}
s.listen(
5
)
p
=
select.poll()
p.register(s)
while
True
:
events
=
p.poll()
for
fd, event
in
events:
if
fd
in
fdmap:
c, addr
=
s.accept()
print
‘Got connection from‘
, addr
p.register(c)
fdmap[c.fileno()]
=
c
elif
event & select.POLLIN:
data
=
fdmap[fd].recv(
1024
)
if
not
data:
print
fdmap[fd].getpeername(),
‘disconnected‘
p.unregister(fd)
del
fdmap[fd]
else
:
print
data
|
原文:https://www.cnblogs.com/HacTF/p/8257815.html
【说明】:本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:254677821)!