Socket是网络编程的一个抽象概念。

通常我们用一个Socket表示“打开了一个网络链接”,而打开一个Socket需要知道目标计算机的IP地址和端口号,再指定协议类型即可

socket参数及常用功能函数:

socket.socket(family=AF_INETtype=SOCK_STREAMproto=0fileno=None)                 #创建socket对象

    socket families(地址簇):

      AF_UNIX  ——————————   unix本机之间进行通信

      AF_INET  ——————————    使用IPv4

      AF_INET6  ——————————     使用IPv6

    socket types:

      SOCK_STREAM          # TCP套接字类型

      SOCK_DGRAM   # UDP套接字类型

      SOCK_RAW               #原始套接字类型,这个套接字比较强大,创建这种套接字可以监听网卡上的所有数据帧

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

注:这些常量都是套接字类型,应用于socket()函数中的第二个参数中.根据系统的不同,可能有更多的常数。(只有SOCK_STREAMSOCK_DGRAM似乎通常很有用。

协议号通常为零,可以省略,或者在地址族为AF_CAN的情况下,协议应为CAN_RAWCAN_BCM 。如果指定fileno,则忽略其他参数,从而导致具有指定文件描述器的套接字返回。与socket.fromfd()不同,fileno将返回相同的套接字,而不是重复。这可能有助于使用socket.close()关闭分离的套接字,一般情况下后两个参数忽略即可

socket.bind(address)                                 #将socket绑定到地址(常用于服务端)

      address地址的格式取决于地址族, 在AF_INET下,以元组(host,port)的形式表示地址。

socket.listen([backlog])                       #启用服务器以接受连接(常用于服务端)

      backlog >=0,指定系统在拒绝新连接之前将允许的未接受连接的数量。如果未指定,则选择默认的合理值。

socket.accept()                      #接收一个连接.该socket 必须要绑定一个地址和监听连接.返回值是一对(conn,address)。(常用于服务端)

      conn是socket对象,可以在该连接上发送和接收数据,address是连接另一端的地址。

socket.recv(bufsize[, flags])                   #从socket接收数据,返回值是一个代表所收到的数据的字节对象。

      一次性接收的最大数据量由bufsize指定, 参数flags通常忽略。

socket.send(data[, flags])                  #将数据发送到socket。

      python3中只能发送bytes类型的数据。

socket.connect(address)              #连接到远程socket(常用于客户端)

      如果连接被信号中断,则该方法等待直到连接完成,或者如果信号处理程序没有引发异常并且套接字正在阻塞或者已经阻塞,则在超时时引入socket.timeout超时。对于非阻塞套接字,如果连接被信号中断(或由信号处理程序引发的异常),则该方法引发InterruptedError异常。

socket.close()             #关闭socket

注:被调用后,连接断开,socket不能在发送数据,连接另一端也将不在接收数据。

 

服务器

服务器进程首先要绑定一个端口并监听来自其他客户端的连接。如果某个客户端连接过来了,服务器就与该客户端建立Socket连接,随后的通信就靠这个Socket连接了。

所以,服务器会打开固定端口(比如80)监听,每来一个客户端连接,就创建该Socket连接。由于服务器会有大量来自客户端的连接,所以,服务器要能够区分一个Socket连接是和哪个客户端绑定的。一个Socket依赖4项:服务器地址、服务器端口、客户端地址、客户端端口来唯一确定一个Socket。

但是服务器还需要同时响应多个客户端的请求,所以,每个连接都需要一个新的进程或者新的线程来处理,否则,服务器一次就只能服务一个客户端了。

我们来编写一个简单的服务器程序,它接收客户端连接,把客户端发过来的字符串加上Hello再发回去。

 #coding=utf-8
'''
Created on 2019年8月6日 @author: yanerfree
'''
#服务端
import socket
import threading
import time def handle_client(sock,addr):
print ('Accept new connection from %s:%s...' %addr)
sock.send('Welcome!'.encode())#send welcome to client while True:
data = sock.recv(1024)
time.sleep(1)
print('接收到来自客户端的数据-%s-'%data)
if data == b'exit' or not data:
break
sock.send(b'hell0-%s'%data)#
sock.close()
print('Connection from %s:%s closed.' % addr) address = ("localhost", 6666) #写明服务端要监听的地址,和端口号
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #生成一个ipv4 socket对象
server.bind(address) #用socket对象绑定要监听的地址和端口
server.listen() #开始监听
print('Waiting for connection ... ')
#接下来,服务器程序通过一个永久循环来接受来自客户端的连接,accept()会等待并返回一个客户端的连接:
while True:
#接收新的连接
sock,addr = server.accept() #等带新连接接入服务端,返回一个新的socket对象和地址,地址格式同前面格式
'''
Wait for an incoming connection. Return a new socket
representing the connection, and the address of the client.
'''
# 创建新线程来处理TCP连接:
t = threading.Thread(target=handle_client, args=(sock,addr))
t.start()

客户端

大多数连接都是可靠的TCP连接。创建TCP连接时,主动发起连接的叫客户端,被动响应连接的叫服务器。

举个例子,当我们在浏览器中访问新浪时,我们自己的计算机就是客户端,浏览器会主动向新浪的服务器发起连接。如果一切顺利,新浪的服务器接受了我们的连接,一个TCP连接就建立起来的,后面的通信就是发送网页内容了。

 #coding=utf-8
'''
Created on 2019年8月7日 @author: yanerfree
'''
import socket address = ("localhost", 6666) #写明要连接的地址,和端口号
#创建一个socket,
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#连接服务端
client.connect(address)
# 接收欢迎消息:
print(client.recv(1024))
for data in ['Michael','', 'Tracy', 'Sarah']:
# 发送数据:
if data:#过滤空字符,如果为空会阻塞recv()
print('发送至服务端的数据:%s'%data)
client.send(data.encode())#byte类型发送
print ('接收到服务端的回复:%s'%client.recv(1024))
client.send(b'exit')#退出
client.close()#关闭

参考:https://www.runoob.com/python/python-socket.html

https://www.liaoxuefeng.com/wiki/897692888725344/923056653167136

Socket - TCP编程的更多相关文章

  1. Linux C Socket TCP编程介绍及实例

    转自:https://blog.csdn.net/lell3538/article/details/53335231 { printf("向服务器发送数据:%s\n",sendbu ...

  2. iOS Socket/Tcp编程 GCDAsyncSocket的实战(带回调)

    很多同学一听到Socket TCP UDP 这几个字眼感觉特别害怕,很怕在工作当中使用,因为他们太底层了.下面我把我在工作中使用Socket类库GCDAsyncSocket进行一次实战 文章中只适用于 ...

  3. java Socket(TCP)编程小项目

    package 服务器端相关操作; import java.io.Serializable; /* * 创建存储需要传输信息的对象,方便客户端向服务器端传送数据 */ public class Cli ...

  4. Java Socket TCP编程(Server端多线程处理)

    package com; import java.io.*; import java.net.Socket; /** * Socket Client * <p> * Created by ...

  5. Java Socket TCP编程

    package com; import java.io.*; import java.net.ServerSocket; import java.net.Socket; /** * Socket Se ...

  6. JAVA 通过 Socket 实现 TCP 编程

    简介 TCP简介 TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的.可靠的.基于字节流的传输层通信协议,由IETF的RFC 793定义.在简化的计算机 ...

  7. 【Socket编程】通过Socket实现TCP编程

    通过Socket实现TCP编程 Socket通信 : 1.TCP协议是面向对象连接.可靠的.有序的,以字节流的方式发送数据. 2.基于TCP协议实现网络通信的类: 客户端----Socket类 服务器 ...

  8. Linux socket网络编程基础 tcp和udp

    Socket TCP网络通信编程 首先,服务器端需要做以下准备工作: (1)调用socket()函数.建立socket对象,指定通信协议. (2)调用bind()函数.将创建的socket对象与当前主 ...

  9. Socket网络编程(TCP/IP/端口/类)和实例

    Socket网络编程(TCP/IP/端口/类)和实例 原文:C# Socket网络编程精华篇 转自:微冷的雨 我们在讲解Socket编程前,先看几个和Socket编程紧密相关的概念: TCP/IP层次 ...

随机推荐

  1. 这个linux命令能让时光倒流!你不知道的date隐藏用法

    文章每周持续更新,各位的「三连」是对我最大的肯定.可以微信搜索公众号「 后端技术学堂 」第一时间阅读(一般比博客早更新一到两篇) 今天给项目写了个脚本需要获取前一天的时间,本来先获取今天的然后减一下, ...

  2. 用三维的视角理解二维世界:完美解释meshgrid函数,三维曲面,等高线,看完你就懂了。...

    完美解释meshgrid函数,三维曲面,等高线 #用三维的视角理解二维世界 #完美解释meshgrid函数,三维曲面,等高线 import numpy as np import matplotlib. ...

  3. chrome清除缓存、不使用缓存而刷新快捷键

    Ctrl+Shift+Del  清除Google浏览器缓存的快捷键 Ctrl+Shift+R  重新加载当前网页而不使用缓存内容 转载于:https://www.cnblogs.com/JAVA-ST ...

  4. Jetson AGX Xavier/Ubuntu更改pip3源

    pip3换源: 修改~/.pip/pip.conf,如果没有这个文件,就创建一个. 内容如下: [global]index-url = https://pypi.tuna.tsinghua.edu.c ...

  5. HC32F003C4PA GPIO Output

    1.打开启动文件,找到并跳转至SystemInit函数 void SystemInit(void) { stc_clk_systickcfg_t stcCfg; // TODO load trim f ...

  6. POI问题总结,关于数字级联及多级级联(三级以上)

    目录 最近公司业务需要用到excel,并且要导出模板,今天为止所有的功能都已经实现了,在这里对出现的一些问题做一个总结. 效果图: 这是一个五级联动的数据,其中第一列是数字开头,实现了五级联动 问题1 ...

  7. JPA---Spring-data-JPA---Hibernate

    Spring Data JPA--搭建环境 版本---maven  3.6.3 <properties> <spring.version>5.2.5.RELEASE</s ...

  8. MySQL基础总结(二)

    数据表的完整性约束条件 AUTO_INCREMENT (自增长) 注意事项: 1.一个表中只能有一个自增长字段 2.必须配合主键使用 方法1: 方法2: 方法3: 指定自增长初始值的方法: 修改自增长 ...

  9. 一文教你快速搞懂速度曲线规划之T形曲线(超详细+图文+推导+附件代码)

    运动控制中常用的T速度曲线规划的原理和程序实现,最后给出了测试结果: 如果本文帮到了您,请帮忙点个赞

  10. repo使用总结—从入门到入门

    文章目录 1 what's repo 2 官方文档 Repo 命令参考资料 help 帮助 init 初始化 sync 同步所有项目文件 upload 提交更改 diff download foral ...