潭州课堂25班:Ph201805201 并发 第九课 (课堂笔记)

 

 TCP/IP

1,建立连接(三次握手)  

            

  1,客户端发起请求

  2,服务器请求回应

  3,请求确认,双方建立连接

2,数据传输

3,断开连接(四次挥手)

        

  1,客户端请求断开 连接

  2,服务器回应请求

  3,服务器向客户端请求断开连接

  4,客户端回应请求

 

套接字:

    三种套按字:1,监听套接字;2,客户端套接字;3,对等套接字

服务器

#  服务器
import socket

server = socket.socket()        #  实例化
# print(server)       #  监听套接字
#   <socket.socket fd=368, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0>
#                  唯一          地址家族(域)             套接字         TCP

server.bind(('0.0.0.0',9001))   #   绑定ip,和端口,
server.listen(5)                #   同时服务5个,
# print(server)

#   监听套接字
#   <socket.socket fd=360, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('0.0.0.0', 9001)>
# server.accept()
print(server.accept())

#      对等连接套字,用于传输数据 连接成功时与客户端一至
#   (<socket.socket fd=484, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 9001), raddr=('127.0.0.1', 57015)>, ('127.0.0.1', 57015))

客户端

#  客户端
import socket

cllent = socket.socket()        #  实例化
cllent.connect(('127.0.0.1',9001))      #  建立连接
print(cllent)

#   客户端 套接字
#  <socket.socket fd=360, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0,


#  laddr=('127.0.0.1', 56950), raddr=('127.0.0.1', 9001)>
#    本地地址                   远程地地址

  

服务器 a

import socket
server = socket.socket()
server.bind(('',9000))
server.listen(5)
con,addr = server.accept()
print(con,addr)

#  con 是对等连接套接字
#  con = <socket.socket fd=324, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 9000), raddr=('127.0.0.1', 57162)>
#   addr 是 连接通信地址,
#  addr =   ('127.0.0.1', 57162)



#  数据发送
con.send(b'hi')

#  接收客户端数据
a = con.recv(1024)
print(a)
print(a.decode())
     ----》

  b'xe8x8axb1xe7x97xb4'
  花痴

 

客户端 a

import socket
cllent = socket.socket()
cllent.connect(('127.0.0.1',9000))

# 数据接收
r = cllent.recv(1024)
print(r) # ----》b'hi'


# 向服务器发数据
cllent.send('花痴'.encode())

# 关闭连接
cllent.close()

  

 不能发送空值  ''   

#服务器
from socket import  *

ip_port = ('127.0.0.1',9100)
back_log = 5
buf_siz = 1024

# tcp_server = socket(AF_INET,SOCK_DGRAM)
tcp_server = socket()
#  tcp_server.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)  #  在 linux 中重启如果 ip ,端口会被占用,可添加这行,
tcp_server.bind( ip_port )      #  绑定 ip
tcp_server.listen( back_log )

while True:                             # 外层循环,为了服务多个人(要等待)
    conn,addr = tcp_server.accept()     #  接收   等待 TCP 进来 (阻塞)
    print('双向连接',conn)
    print('客户端地址:',addr)

    while True:                         #  内层循环,与一个人通信,
        try:
            data = conn.recv( buf_siz )    # 接收客户端数据
            print('来自客户端的数据:',data.decode('utf-8'))
            conn.send(data)                     # 回信息
        except Exception:
            break
    # conn.close()

tcp_server.close()

  

#客户端
import socket,time
client = socket.socket()
client.connect(('127.0.0.1',9100))


while True:
c = input('--->>')
if not c: continue # 输入空值,重来
client.send(c.encode('utf-8'))
print('客户端已经发送消息')
time.sleep(0.1)
data= client.recv(1024)
print('收到服务器发来的信息:',data.decode())

client.close()

  

基于 TCP 服务端

  1, s = socket()   创建套接字,

  2, s.bind()  套接字绑定地址,

  3,s.listen()  监听,

  4,while True:       为了报备多人的外部循环

    5,c = s.accept()    接受客户端连接

      6, while True:     通信循环

        7,  recv,conn  对话,收发

      8,  c.close()    关闭客户端套接字

  9,s.close()          关闭服务器

补充:UDB通信

服务器:

# -*- coding: utf-8 -*-

from socket import*

udp_server = socket(AF_INET,SOCK_DGRAM)
udp_server.bind(('127.0.0.1',8080))

while True:
    data,addr = udp_server.recvfrom(1024)
    print(data)
                # 发送数据要带上客户端IP
    udp_server.sendto(data, addr)

客户端:

# -*- coding: utf-8 -*-

from socket import*

udp_cl = socket(AF_INET,SOCK_DGRAM)
# udp_cl = socket()

while True:
    ma = input('--->>>')

                    #                  服务器 ip
    udp_cl.sendto(ma.encode('utf8'),('127.0.0.1',8080))
    data, addr = udp_cl.recvfrom(1024)
    print(data.decode('utf8'))

  

原文地址:https://www.cnblogs.com/gdwz922/p/9296650.html