网络编程(二)

网络编程(二)    >>>思维导图>>>中二青年

基于TCP协议的Socket套接字

server端

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端

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

127.0.0.1本机回还地址:只能自己识别自己 其他人无法访问

send与recv对应,不要出现两边都是相同的情况

recv是跟内存要数据,至于数据的来源 你无需考虑

TCP特点

会将数据量比较小的并且时间间隔比较短的数据一次性打包发送给对方

TCP是基于链接的,必须先启动服务端,然后再启动客户端去连接服务端

解决粘包问题

服务端

1.先制作一个发送给客户端的字典

2.制作字典的报头

3.发送字典的报头

4.发送字典

5.再发真实数据

客户端

1.先接受字典的报头

2.解析拿到字典的数据长度

3.接受字典

4.从字典中获取真实数据的长度

5.接受真实数据

服务端代码

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.studout.read() + obj.stderr.read()
           d = {‘name‘:‘jason‘,‘file_size‘:len(res),‘info‘:‘aaaaaaazzzzzzz‘}
           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)
       except ConnectionResetError:
               breakconn.close()

客户端代码

improt cocket
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‘):
        data = client.recv(1024)
        real_data += data
        recv_size += len(data)
    print(real_data.decode(‘gbk‘))

END

原文地址:https://www.cnblogs.com/renvip/p/11317624.html

时间: 2024-10-07 11:26:29

网络编程(二)的相关文章

Linux网络编程(二)

服务套和客户机的信息函数 1.字节转换函数 在网络上面有着许多类型的机器,这些机器在表示数据的字节顺序是不同的, 比如i386芯片是低字节在内存地址的低端,高字节在高端,而alpha芯片却相反. 为了统一起来,在Linux下面,有专门的字节转换函数. unsigned long int htonl(unsigned long int hostlong)     unsigned short int htons(unisgned short int hostshort)     unsigned

winform网络编程(二)

mnesia在频繁操作数据的过程可能会报错:** WARNING ** Mnesia is overloaded: {dump_log, write_threshold},可以看出,mnesia应该是过载了.这个警告在mnesia dump操作会发生这个问题,表类型为disc_only_copies .disc_copies都可能会发生. 如何重现这个问题,例子的场景是多个进程同时在不断地mnesia:dirty_write/2 mnesia过载分析 1.抛出警告是在mnesia 增加dump

安卓第八天笔记--网络编程二

安卓第八天笔记--网络编程二 1.网络图片查看器 /** * 网络图片查看器 * 1.获取输入的URL地址,判断是否为空 * 2.建立子线程,获取URl对象new URL(path) * 3.打开连接获取HttpURLConnection conn = (HttpURLConnection) url.openConnection(); * 4.设置连接超时时间conn.setConnectionTimeOut(5000)毫秒 * 5.设置请求方式setRequestMethod * GET或者P

C#网络编程二:Socket编程

一:什么是SOCKET socket的英文原义是"孔"或"插座".作为进程通信机制,取后一种意思.通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄(其实就是两个程序通信用的).socket非常类似于电话插座.以一个电话网为例:电话的通话双方相当于相互通信的2个程序,电话号码就是ip地址.任何用户在通话之前,首先要占有一部电话机,相当于申请一个socket:同时要知道对方的号码,相当于对方有一个固定的socket.然后向对方拨号呼叫

Java网络编程二:Socket详解

Socket又称套接字,是连接运行在网络上两个程序间的双向通讯的端点. 一.使用Socket进行网络通信的过程 服务端:服务器程序将一个套接字绑定到一个特定的端口,并通过此套接字等待和监听客户端的连接请求. 客户端:客户端程序根据你服务器所在的主机名和端口号发出连接请求. 两者之间的通信是通过Socket完成的,我们可以认为Socket是两个城市之间的交通工具,有了它,就可以在两个城市之间穿梭了. Socket通信示例 主机A的应用程序和主机B的应用程序通信,必须通过Socket建立连接,而建立

网络编程二

一.为什么要用网路编程? 首先我们要明确一个问题,为什么要用网络编程?因为我们所写的代码程序不只是给自己看的,自己玩的,那样就没什么意义了. 网络编程的意义就是将很多的电脑连接起来共享你们之间的文件 二.软件开发的架构 软件开发的架构有两种 1. c/s架构 c/s 即:Client与Server 架构简单的说就是客户端与服务器架构.这种架构也是从用户层面(也可以是物理层面)来划分的. 2.B/S架构 B/S即:Browser与Server,大概意思就是浏览器端与服务器端架构.这种架构是从用户层

IOS研究之网络编程(二)-Cocoa Streams使用详解

 本文以及相关的系列文章是我总结的iOS网络开发方面的知识点,本文是第二篇,主要分析了Cocoa Streams中的几个重要类 Cocoa Streams实际上是Objective-C对CFNetwork的简单封装,主要包含了三个类:NSStream, NSInputStream, and NSOutputStream.本部分的接口接口比较简单,用法一目了然.我在这里就只列出接口,方便查阅.对CFNnework不明白的看IOS研究之网络编程(一)-CFNetwork使用详解 NSStream

Linux网络编程二、tcp连接API

一.服务端 1.创建套接字: int socket(int domain, int type, int protocol); domain:指定协议族,通常选用AF_INET. type:指定socket类型,TCP通信下使用SOCK_STREAM. protocol:指定协议,通常为0. 返回值:成功则返回新socket的文件描述符,失败返回-1. 头文件:sys/socket.h     sys/types.h 2.绑定套接字 int bind(int sockfd, struct sock

Java 网络编程(二)

以下例开始本文的内容: 例1,需求:上传图片. 客户端: 服务端点. 读取客户端已有的图片数据. 通过socket输出流将数据发给服务端. 读取服务端反馈信息. 关闭. class PicClient { public static void main(String[] args) throws IOException { /* * 一系列判断 */ if(args.length != 1) { System.out.println("请选择一个jpg格式的图片"); return;