博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python网络编程
阅读量:6986 次
发布时间:2019-06-27

本文共 2624 字,大约阅读时间需要 8 分钟。

TCP/IP

tcp编程

Socket -- 表示“打开了一个网络链接”,而打开一个Socket需要知道目标计算机的IP地址和端口号,再指定协议类型

TCP连接中客户端主动发起连接 ,服务器响应连接。   

创建一个TCP的客户端socket

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
28
29
import 
socket
 
= 
socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 
s.connect((' 
80
)) 
 
# 发送数据
s.send(b'GET 
/ 
HTTP
/
1.1
\r\nHost:
 
# 接收数据
buffer 
= 
[]
while 
True
:
    
= 
s.recv(
1024
)
    
if 
d:
        
buffer
.append(d)
    
else
:
        
break
data 
= 
b''.join(
buffer
)
 
 
# 关闭连接
s.close()
 
header, html 
= 
data.split(b
'\r\n\r\n'
1
)
print
(header.decode(
'utf-8'
))
 
# 把接收的数据写如文件
with 
open
(
'baidu.html'
'wb'
) as f:
    
f.write(html)

AF_INET使用ipv4,AF_INET6使用ipv6, SOCK_STREAM指定面向流的TCP。

服务端编程

首先绑定一个端口,一个socket的四项注意:服务器地址,端口,客户端地址,客户端端口

服务器的连接需要一个新的进程或线程。服务端编程也是多线程或多进程编程。

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
28
29
30
31
32
= 
socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 
# 监听端口
s.bind(
'127.0.0.1'
9999
)
 
# 监听传来的最大连接数。
s.listen(
5
)
print
(
'Waiting for connection...'
)
 
# 接收客户端的连接,accept()会等待并返回一个客户端的连接
while 
True
:
    
# 接受一个新连接
    
sock, addr 
= 
s.accept()
     
    
# 创建新线程来处理TCP连接
    
= 
threading.Thread(target
=
tcplink, args
=
(sock, addr))
    
t.start()
     
 
# 每个连接都必须创建新线程(或进程)来处理,单线程只能处理一个连接。
 
def 
tcplink(sock, addr):
    
print
("Accept new connection 
from 
%
s:
%
s...' 
% 
addr)
    
sock.send(b
'Welcome!'
)
    
while 
True
:
        
data 
= 
sock.recv(
1024
)
        
time.sleep(
1
)
        
if 
not 
data 
or 
data.decode(
'utf-8'
=
= 
'exit'
:
            
break
        
sock.send((
'Hello, %s!' 
% 
data.decode(
'utf-8'
)).encode(
'utf-8'
))
    
sock.close()
    
print
(
'Connection from %s:%s closed.' 
% 
addr)

客户端编程

1
2
3
4
5
6
7
8
9
= 
socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 
s.connect((
'127.0.0.1'
9999
))
print
(s.recv(
1024
).decode(
'utf-8'
))
for 
data 
in 
[b
'Michael'
, b
'Tracy'
, b
'Sarah'
]:
    
s.send(data)
    
print
(s.recv(
1024
).decode(
'utf-8'
))
s.send(b
'exit'
)
s.close()

UDP编程

UDP是面向无连接。TCP是可靠连接,通信双方都可以以流的形式发送数据。

UDP编程的步骤:

1
2
3
4
5
6
7
8
9
10
11
12
# 建立socket
= 
socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
 
# 绑定端口
s.bind((
'127.0.0.1'
9999
))
 
print
(
'Bind UDP on 9999...'
)
while 
True
:
    
# 接收数据
    
data, addr 
= 
s.recvfrom(
1024
)
    
print
(
'Recived from %s:%s.' 
% 
addr)
    
s.sendto(b
'Hello, %s!' 
% 
data, addr)

SOCK_DGRAM指定了类型为UDP。UDP不需要listen()方法,直接接收来自任何客户端的数据。

recvfrom()方法返回数据和客户端的地址与端口,这样,服务器收到数据后,直接调用sendto()就可以把数据用UDP发给客户端。

客户端:

1
2
3
4
5
6
7
= 
socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
for 
data 
in 
[b
'Michael'
, b
'Tracy'
, b
'Sarah'
]:
    
# 发送数据
    
s.sendto(data, (
'127.0.0.1'
9999
))
    
# 接收数据
    
print
(s.recv(
1024
).decode(
'utf-8'
))
s.close()

从服务器接收数据仍然调用recv()方法。

\]\
本文转自ting2junshui51CTO博客,原文链接:http://blog.51cto.com/ting2junshui/1752595 ,如需转载请自行联系原作者
你可能感兴趣的文章
android studio下NDK开发
查看>>
C#MysqlHelper
查看>>
SpringMVC Hello World 实例
查看>>
MySQL BETWEEN 用法
查看>>
vim开启自动缩进
查看>>
【转】js之iframe子页面与父页面通信
查看>>
java设计模式_模版模式
查看>>
摄像机平滑更随脚本
查看>>
Struts2 标签配置详细
查看>>
需求管理工具比较 Doors_Requistie Pro_RDM
查看>>
centos+php+nginx的php.ini无法加载的问题
查看>>
从菜鸟到专家的五步编程语言学习法
查看>>
RequestQueue
查看>>
Android TextView 属性设置
查看>>
html元素分类以及嵌套规则
查看>>
android dpi
查看>>
C语言的预处理、编译、汇编、链接
查看>>
魅族 C++ 微服务框架技术内幕揭秘
查看>>
flask 学习笔记 mvc ,sqlalchemy(insert,update)
查看>>
HTML基础(一)
查看>>