二. 网络编程(套接字TCP协议)

一 .套接字TCP协议 

1. 基于TCP协议的socket

TCP(Transmission Control Protocol)可靠的、面向连接的协议(eg:打电话)、传输效率低全双工通信(发送缓存&接收缓存)、
面向字节流。使用TCP的应用:Web浏览器;电子邮件、文件传输程序。

   注意:   tcp是基于链接的,必须先启动服务端,然后再启动客户端去链接服务端

 server端1

import socket
sk = socket.socket()
sk.bind(('127.0.0.1',8898))  #把地址绑定到套接字
sk.listen()          #监听链接
conn,addr = sk.accept() #接受客户端链接
ret = conn.recv(1024)  #接收客户端信息
print(ret)       #打印客户端信息
conn.send(b'hi')        #向客户端发送信息
conn.close()       #关闭客户端套接字
sk.close()        #关闭服务器套接字(可选)

client端1

import socket
sk = socket.socket()           # 创建客户套接字
sk.connect(('127.0.0.1',8898))    # 尝试连接服务器
sk.send(b'hello!')
ret = sk.recv(1024)         # 对话(发送/接收)
print(ret)
sk.close()            # 关闭客户套接字

解决方法

#加入一条socket配置,重用ip和端口
import socket
from socket import SOL_SOCKET,SO_REUSEADDR
sk = socket.socket()
sk.setsockopt(SOL_SOCKET,SO_REUSEADDR,1) #就是它,在bind前加
sk.bind(('127.0.0.1',8898))  #把地址绑定到套接字
sk.listen()          #监听链接
conn,addr = sk.accept() #接受客户端链接
ret = conn.recv(1024)   #接收客户端信息
print(ret)              #打印客户端信息
conn.send(b'hi')        #向客户端发送信息
conn.close()       #关闭客户端套接字
sk.close()        #关闭服务器套接字(可选)

TCP案例

1.

server
import socket
sk=socket.socket() # 买手机
sk.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) #  避免服务重启时 侯报错 端口地址错误
sk.bind(("127.0.0.1",8081))# 绑定手机卡
sk.listen()           # 监听  意思就是等别人给我打电话
conn,addr =sk.accept()   #  接受到别人的电话   conn 链接   addr 地址
while True:
     ret=conn.recv(1024).decode("utf-8")
     if ret=='bye':
         break
     print(ret)
     aa = input("服务器>>>:")
     conn.send(bytes(aa,encoding="utf-8"))

conn.close()  # 挂电话
sk.close()    # 关机
client
import socket
sk=socket.socket()  # 买手机
sk.connect(("127.0.0.1",8081)) # 拨通人的号
while True:
    bb=input("客服端>>>:")
    sk.send(bytes(bb,encoding="utf-8"))
    ret=sk.recv(1024).decode("utf-8")
    print(ret)
    if ret=='bye':
        sk.send(b'bye')
        break
sk.close()

2.

server

import socket
sk=socket.socket() # 买手机
sk.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) #  避免服务重启时 侯报错 端口地址错误

sk.bind(("127.0.0.1",8081))# 绑定手机卡

sk.listen()           # 监听  意思就是等别人给我打电话
conn,addr =sk.accept()   #  接受到别人的电话   conn 链接   addr 地址

while True:
    ret=conn.recv(1024)  #   听别人说话
    print(ret)
    conn.send(b'lover supreme')  #  和别人说化 必须传一个bytes类型

    ret=conn.recv(1024)
    print(ret.decode("utf-8"))  # 接收客服端信息解码
    conn.send(bytes('吃冒菜啊哈哈',encoding="utf-8"))  # 发送信息到客服端 编码
conn.close()  # 挂电话
sk.close()    # 关机
client
import socket sk=socket.socket() # 买手机 sk.connect(("127.0.0.1",8081)) # 拨通人的号 while True: sk.send(b'suoaaaaa') ret=sk.recv(1024) print(ret) sk.send(bytes('今天中午吃什么'.encode('utf-8'))) #发送到服务器 编码 ret=sk.recv(1024) print(ret.decode('utf-8')) # 接收到服务器端的信息解码 sk.close()

3.

server

import  socket
from socket import SOL_SOCKET,SO_REUSEADDR
server=socket.socket()
server.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)
server.bind(("192.168.59.1",8400))
server.listen(5)
while True:
   conn,addr=server.accept()
   while True:
       date=conn.recv(1024).decode("utf-8")
       user,pwd=date.split("|")
       with open("aa.txt","r")as f1:
           for line in  f1:
                us,pw=line.strip().split(':')
                if us==user and pwd==pw:
                    conn.send("成功了".encode("utf-8"))
                else:
                    conn.send("失败了".encode("utf-8"))
client

import  socket
client=socket.socket()
client.connect(("192.168.59.1",8400))
while True:
    user=input("请输入的用户名:")
    pwd=input("请输入你的密码:")
    val="%s|%s"%(user,pwd)
    client.send(val.encode("utf-8"))
    date=client.recv(1024).decode("utf-8")
    print(date)
    client.close()
原文地址:https://www.cnblogs.com/Sup-to/p/11131313.html