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

网络编程 --- TCP

时间:2019-08-11 23:13:23      阅读:107      评论:0      收藏:0      [点我收藏+]

标签:客户   通道   说话   ksh   name   ESS   client   add   inux   

socket通信

服务端
import socket
server = socket.socket()  # 买手机 不传参数默认用的就是TCP协议
server.bind((127.0.0.1,8080))  # bind((host,port))  插电话卡  绑定ip和端口
server.listen(5)  # 开机    半连接池
conn, addr = server.accept()  # 接听电话  等着别人给你打电话     阻塞
data = conn.recv(1024)  # 听别人说话 接收1024个字节数据          阻塞
print(data)
conn.send(bhello baby~)  # 给别人回话

conn.close()  # 挂电话
server.close()  # 关机


客户端
import socket

client = socket.socket()  # 拿电话
client.connect((127.0.0.1,8080))  # 拨号   写的是对方的ip和port
client.send(bhello world!)  # 对别人说话
data = client.recv(1024)  # 听别人说话
print(data)
client.close()  # 挂电话

连接循环+通信循环

服务端
import socket

"""
服务端
    固定的ip和port
    24小时不间断提供服务
"""
server = socket.socket()  # 生成一个对象
server.bind((127.0.0.1,8080))  # 绑定ip和port
server.listen(5)  # 半连接池

while True:
    conn, addr = server.accept()  # 等到别人来  conn就类似于是双向通道
    print(addr)  # (‘127.0.0.1‘, 51323) 客户端的地址
    while True:
        try:
            data = conn.recv(1024)
            print(data)  # b‘‘  针对mac与linux 客户端异常退出之后 服务端不会报错 只会一直收b‘‘
            if len(data) == 0:break
            conn.send(data.upper())
        except ConnectionResetError as e:
            print(e)
            break
    conn.close()
客户端
import socket

client = socket.socket()
client.connect((127.0.0.1,8080))

while True:
    msg = input(>>>:).encode(utf-8)
    if len(msg) == 0:continue
    client.send(msg)
    data = client.recv(1024)
    print(data)

TCP黏包问题

服务端

import socket
server = socket.socket()  # 买手机 不传参数默认用的就是TCP协议
server.bind((127.0.0.1,8080))  # bind((host,port))  插电话卡  绑定ip和端口
server.listen(5)  # 开机    半连接池

conn, addr = server.accept()  # 接听电话  等着别人给你打电话     阻塞
data = conn.recv(5)  # 听别人说话 接收1024个字节数据          阻塞
print(data)
data = conn.recv(5)  # 听别人说话 接收1024个字节数据          阻塞
print(data)
data = conn.recv(4)  # 听别人说话 接收1024个字节数据          阻塞
print(data)
客户端

import socket

client = socket.socket()  # 拿电话
client.connect((127.0.0.1,8080))  # 拨号   写的是对方的ip和port
client.send(bhello)
client.send(bworld)
client.send(bbaby)

解决黏包问题

服务端
import socket
import subprocess
import struct
import json


server = socket.socket()
server.bind((127.0.0.1,8080))
server.listen(5)


while True:
    conn, addr = server.accept()
    while True:
        try:
            cmd = conn.recv(1024)
            if len(cmd) == 0:break
            cmd = cmd.decode(utf-8)
            obj = subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
            res = obj.stdout.read() + obj.stderr.read()
            d = {name:jason,file_size:len(res),info:asdhjkshasdad}
            json_d = json.dumps(d)
            # 1.先制作一个字典的报头
            header = struct.pack(i,len(json_d))
            # 2.发送字典报头
            conn.send(header)
            # 3.发送字典
            conn.send(json_d.encode(utf-8))
            # 4.再发真实数据
            conn.send(res)
            # conn.send(obj.stdout.read())
            # conn.send(obj.stderr.read())
        except ConnectionResetError:
            break
    conn.close()
客户端
import socket
import struct
import json

client = socket.socket()
client.connect((127.0.0.1,8080))

while True:
    msg = input(>>>:).encode(utf-8)
    if len(msg) == 0:continue
    client.send(msg)
    # 1.先接受字典报头
    header_dict = client.recv(4)
    # 2.解析报头 获取字典的长度
    dict_size = struct.unpack(i,header_dict)[0]  # 解包的时候一定要加上索引0
    # 3.接收字典数据
    dict_bytes = client.recv(dict_size)
    dict_json = json.loads(dict_bytes.decode(utf-8))
    # 4.从字典中获取信息
    print(dict_json)
    recv_size = 0
    real_data = b‘‘
    while recv_size < dict_json.get(file_size):  # real_size = 102400
        data = client.recv(1024)
        real_data += data
        recv_size += len(data)
    print(real_data.decode(gbk))

 

网络编程 --- TCP

标签:客户   通道   说话   ksh   name   ESS   client   add   inux   

原文地址:https://www.cnblogs.com/KrisYzy/p/11337103.html

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