python下基于sokcet的tcp通信——入门篇

环境

python版本:2.7

IDE:pycharm

TCP/UDP协议均为传输层的协议,绝大部分应用程序之间的通信都是使用TCP或UDP,故而在网络通信中及其重要,想详细了解他们之间的差异,可参考http://www.cnblogs.com/vathe/p/6815928.html

1.模拟后台程序,实现浏览器访问

Server端代码

# coding=utf-8
import socket

def handle_request(client):
    buf = client.recv(1024)
    client.send("HTTP/1.1 200 OK\r\n\r\n")      # 此句允许浏览器访问
    client.send("Hello, TCP Socket ")                  # 发送要显示的内容

def main():
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.bind((‘localhost‘, 8090))              # 设定ip(或者域名)和端口号
    sock.listen(2)                              # 设置最大并发数

    while 1:
        conn, address = sock.accept()   # 接收请求
        handle_request(conn)            # 处理请求
        conn.close()                    # 关闭连接

if __name__ == ‘__main__‘:
    main()

使用浏览器访问 localhost:8090

2.模拟机器猫程序(客户端发送信息,从服务端返回源数据)

A. ServerTCP.py代码

# coding=utf-8
import socket

def handle_request(conn):
    conn.send("server: hello, let‘s start ")
    flag = True
    while flag:
        data = conn.recv(1024)
        if data == ‘exit‘:
            flag = False
        else:
            conn.sendall(data)

def main():
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.bind((‘localhost‘, 8091))  # 设定ip(或者域名)和端口号
    sock.listen(2)  # 设置最大并发数

    while 1:
        conn, address = sock.accept()  # 接收请求
        print address,
        handle_request(conn)  # 处理请求
        conn.close()  # 关闭连接

if __name__ == ‘__main__‘:
    main()

B.ClientTCP.py

# coding:utf-8
import socket

client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
address = (‘localhost‘, 8091)
client.connect(address)
while 1:
    data = client.recv(1024)
    # client.send(‘client: ok, let\‘s begin ‘)
    print data
    inp = raw_input(‘client:‘)
    client.send(inp)
    if inp == ‘exit‘:      # 输入exit,退出
        break

C.两程序交互结果

3.socket模块中的socket类简要分析

conn = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

参数一:地址类型

  socket.AF_INET, 表示使用IPv4类型的IP, 默认类型

  socket.AF_INET6, 表示使用IPv6类型的IP

  socket.AF_UNIX, 表示使用Unix系统中同一台设备中两进程通信的socket

参数二:数据包格式

  socket.SOCK_STREAM  流式socket , for TCP (默认)

  socket.SOCK_DGRAM   数据报式socket , for UDP

  socket.SOCK_RAW 原始套接字,普通的套接字无法处理ICMP、IGMP等网络报文,而SOCK_RAW可以;其次,SOCK_RAW也可以处理特殊的IPv4报文;此外,利用原始套接字,可以通过IP_HDRINCL套接字选项由用户构造IP头。

  socket.SOCK_RDM 是一种可靠的UDP形式,即保证交付数据报但不保证顺序。SOCK_RAM用来提供对原始协议的低级访问,在需要执行某些特殊操作时使用,如发送ICMP报文。SOCK_RAM通常仅限于高级用户或管理员运行的程序使用。

  socket.SOCK_SEQPACKET 可靠的连续数据包服务

socket.bind(address)

  固定地址,地址包括主机和端口。主机可使用ip或域名标识。

socket.listen(backlog)

  设置最最大并发数

socket.connect(address)/socket.connect_ex(address)

  客户端请求建立连接,address表示地址,两者的区别是,如果连接出现异常,前者直接报出异常,后者返回错误码,程序继续运行

conn, address = socket.accept()

  服务端接收请求建立起连接,返回连接和地址。

socket.close()

  关闭连接

sk.recv(bufsize[,flag])

  接受套接字的数据。数据以字符串形式返回,bufsize指定最多可以接收的数量。

sk.recvfrom(bufsize[.flag])

  与recv()类似,但返回值是(data,address)。

sk.send(string[,flag])

  将string中的数据发送到连接的套接字。返回值是要发送的字节数量,该数量可能小于string的字节大小。即:可能未将指定内容全部发送。

sk.sendall(string[,flag])

  将string中的数据发送到连接的套接字,但在返回之前会尝试发送所有数据。成功返回None,失败则抛出异常。

内部通过递归调用send,将所有内容发送出去。

sk.sendto(string[,flag],address)

  将数据发送到套接字,address是形式为(ipaddr,port)的元组,指定远程地址。返回值是发送的字节数。该函数主要用于UDP协议。

时间: 2024-12-21 12:26:52

python下基于sokcet的tcp通信——入门篇的相关文章

Windows下基于socket多线程并发通信的实现

本文介绍了在Windows 操作系统下基于TCP/IP 协议Socket 套接口的通信机制以及多线程编程知识与技巧,并给出多线程方式实现多用户与服务端(C/S)并发通信模型的详细算法,最后展现了用C++编写的多用户与服务器通信的应用实例并附有程序. 关键词:Windows:套接字:多线程:并发服务器: Socket 是建立在传输层协议(主要是TCP 和UDP)上的一种套接字规范,最初由美国加州Berkley 大学提出,为UNIX 系统开发的网络通信接口,它定义了两台计算机之间通信的规范,sock

Matlab(Client)和Python(Server)进行TCP通信

import socket import time #IPV4,TCP协议 sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM) #绑定ip和端口,bind接受的是一个元组 sock.bind(('172.23.23.89',54378)) #设置监听,其值阻塞队列长度,一共可以有5+1个客户端和服务器连接 sock.listen(5) a=[1,2,3,4] while True: # 将发送数据转化为String s=str(a) #

Linux下基于select的socket通信

select函数介绍: int select(int maxfdp,fd_set *readfds,fd_set *writefds,fd_set *errorfds,struct timeval *timeout); /*参数列表 int maxfdp是一个整数值,是指集合中所有文件描述符的范围,即所有文件描述符的最大值加1,不能错!在Windows中这个参数的值无所谓,可以设置不正确. fd_set *readfds是指向fd_set结构的指针,这个集合中应该包括文件描述符,我们是要监视这些

Linux下的fdlisk - l 用法解析-入门篇

fdlisk - l 的含义是查看linux下面的磁盘分区大小.这个大小包含了很多信息. 我们来看度娘的一则介绍: FDISK进行硬盘分区从实质上说就是对硬盘的一种格式化.当我们创建分区时,就已经设置好了硬盘的各项物理参数,指定了硬盘主引导记录(即MasterBootRecord,MBR)和引导记录备份的存放位置.而对于文件系统以及其他操作系统管理硬盘所需要的信息则是通过之后的高级格式化,即Format命令来实现.用一个形象的比喻,分区就好比在一张白纸上画一个大方框.而格式化好比在方框里打上格子

python中基于tcp协议的通信(数据传输)

tcp协议:流式协议(以数据流的形式通信传输).安全协议(收发信息都需收到确认信息才能完成收发,是一种双向通道的通信) tcp协议在OSI七层协议中属于传输层,它上承用户层的数据收发,下启网络层.数据链路层.物理层.可以说很多安全数据的传输通信都是基于tcp协议进行的. 为了让tcp通信更加方便需要引入一个socket模块(将网络层.数据链路层.物理层封装的模块),我们只要调用模块中的相关接口就能实现传输层下面的繁琐操作. 简单的tcp协议通信模板:(需要一个服务端和一个客户端) 服务端: fr

Linux下TCP网络编程与基于Windows下C#socket编程间通信

一.linux下TCP网络编程基础,需要了解相关函数 Socket():用于套接字初始化. Bind():将 socket 与本机上的一个端口绑定,就可以在该端口监听服务请求. Listen():使socket处于被动的监听模式,并为该  socket  建立一个输入数据队列,将到达的服务器, 请求保存在此队列中,直到程序处理他们. Accept():让服务器接收客户的连接请求. Connect():客户端使用connect函数来配置 socket并与远端服务器建立一个 TCP 连接. Clos

Linux下TCP网络编程与基于Windows下C#socket编程之间通信

一.linux下TCP网络编程基础,需要了解相关函数 Socket():用于套接字初始化. Bind():将 socket 与本机上的一个端口绑定,就可以在该端口监听服务请求. Listen():使socket处于被动的监听模式,并为该  socket  建立一个输入 数据队列,将到达的服务器, 请求保存在此队列中,直到程序处理他们. Accept():让服务器接收客户的连接请求. Connect():客户端使用connect函数来配置 socket并与远端服务器建立一个 TCP 连接. Clo

基于TCP通信的套接字

基于tcp通信的套接字必须先启动服务器再去启动客户端去链接服务器 客户端 服务端 这只是基于tcp通信的一个简单的套接字  只能进行一次的通信 服务端                                                                                                 客户端 这是能多次通信的套接字 在阻塞前添加一个循环就能实现一个链接循环 服务端 客户端 这是模拟ssh实现远程执行命令 粘包问题 二.两种情况下会发生粘包

Python中的端口协议之基于UDP协议的通信传输

UDP协议: 1.python中基于udp协议的客户端与服务端通信简单过程实现 2.udp协议的一些特点(与tcp协议的比较) ------------------------------------------------------------------------------------------------------------------------------------- 一.UDP协议:OSI七层协议中的传输协议的一种(另外一种tcp协议),他们都是一种端口协议 与TCP协