码迷,mamicode.com
首页 > 其他好文 > 详细

socket

时间:2018-12-25 16:59:32      阅读:126      评论:0      收藏:0      [点我收藏+]

标签:port   部分   发送数据   str   bsp   客户   元组   ram   .so   

Socket: 应用层与TCP/IP协议通信的中间软件抽象层,把复杂的TCP/IP协议隐藏在socket接口后面

    也可理解为ip + port , ip用来标识互联网中的一台主机的位置,port用来标识这太计算器上的一个应用程序,ip 地址是配置到网卡上的,port是应用程序开启的,ip与port的绑定就标识了互联网中独一无二的应用程序

套接字家族: AF_UNIX: 两个套接字进程运行在同一机器,可以通过访问同一个文件系统简介完成通信

      AF_INET:  被用于ipv6,网络编程中,我们只使用AF_INET

套接字工作流程: 

      服务器: 先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用                       accept阻塞,等待客户端连接

      客户端: 初始化Socket, 然后连接服务器conncet, 如果连接成功,客户端,服务器连接建立,客户端发送数据请求,服务端接收请求并处理请求,然后把回应数据发送给客户端

#基于TCP 的服务端
import socket

server = socket.socket()
# 相当于:server = socket.socket(AF_INET,socket.SOCK_STREAM,0)
# 参数(socket家族,socket类型(SOCK_STREAM 对应TCP, SOCK_DGRAM 对应UDP)
server.bind((ip,端口))
server.listen()

client,address = server.accept()

data = client.recv(1024)
print(data.decode(utf-8))

client.send(msg.encode(utf-8))  

client.close()
server.close()

# 服务端循环收发模板
import socket

server = socket.socket()

server.bind((‘ip‘,端口))
server.listen()
while True:
# 连接循环,可以不断接收连接
client,address = server.accept()
while True:
try:
#如果是windows,客户端强行关闭,会抛出异常
#如果是Linux,不会抛出异常会死循环收到空的数据包
data = client.recv(1024)
if not data:
client.close()
break
print(data.decode(‘utf-8‘))
client.send(data.encode(‘utf-8‘))
except ConnectionResetError:
print(‘客户端强行关闭连接‘)
client.close()
break
server.close()
 
# 基于TCP 的客户端

import socket

client = socket.socket()
client.connect((ip,端口))

client.send(msg.encode(utf-8))   #对应服务端中的resv
data = client.resv(1024)             #对应服务端中的send
print(data.decode(utf-8))
client.close()

#客户端循环收发模板

import socket

client = socket.socket()
client.connect((‘ip‘,端口))
while True:
msg = input(‘>>>: ‘)
client.send(msg.encode(‘utf-8‘)) #对应服务端中的resv
data = client.resv(1024) #对应服务端中的send
print(data.decode(‘utf-8‘))
client.close()

import socket
#三个参数(套接字家族,socket 类型)
server = socket.socket(AF_INET,socket.SOCK_DGRAM,0)

server.bind(("ip",端口))

# UDP 不需要listen 和 accept
while True: # 循环收发
    data,address = server.recvfrom(1024)  # 阻塞,直到收到数据为止
    # 返回的值为 数据和对方的ip地址和端口号(所以地址为一个元组,ip和端口号)
    server.sendto(msg.encode(utf-8),address)
    # 发送信息时两个参数,一个数据和一个地址

server.close()
#基于UDP的客户端socket

import socket

client = socket.socket(socket.AF_INET,socket.SOCK_DGRAM,0)

# 不需要连接服务端,直接发送信息
while True: # 循环收发
    msg = input(>>>>: )
    client.sendto(msg,(ip,端口))
    data,address = client.recv(1024)
client.close()

 UDP 是无链接的,先启动哪一端都不会报错

缓冲区: 操作系统分配的一部分内存,专门用于存放一些来不及处理的数据

      发送方: 数据先给操作系统,操作系统不可能同一时间处理,所以操作系统需要一个缓冲区,等

                操作系统有空后会自动到缓冲区那数据进行处理

半连接: 三次握手只连接了一半,当服务器响应了客户端第一次请求会等待客户端发送的ack信息

    发生原因: 1 客户端出现问题吗,无法返回ack (有可能是syn洪水攻击,不断产生半连接,使服务                                         器无法处理正常请求)

          2 服务器来不及处理客户端请求 

半连接池: 是一个容器,系统自动将半连接放入容器中

服务端的  server.listen(5)  的参数表明设置的最大的半连接数(为确保服务器资源不被耗尽)

 

socket

标签:port   部分   发送数据   str   bsp   客户   元组   ram   .so   

原文地址:https://www.cnblogs.com/Afrafre/p/10174536.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!