1. TCP SOCKET

客户端:

#!/usr/bin/env python
# -*-coding:utf-8 -*-
import socket
HOST = 'localhost'
PORT = 50001 client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect((HOST, PORT)) while True:
msg = input('>>:').strip()
if len(msg) == 0: continue # 如果输入为空,跳过此次循环进行下一次。 TCP 协议不可以发空
client.send(msg.encode()) # 发送输入的数据,必须为bytes格式
data = client.recv(1024)
print('recived:', data.decode()) # 收到服务器传过来的数据,要decode 一下

服务端:

#!/usr/bin/env python
# -*-coding:utf-8 -*-
import socket
HOST = ''
PORT = 50001 gd_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
gd_server.bind((HOST, PORT)) gd_server.listen(1) # 开始监听,1代表在允许有一个连接排队,更多的新连接连进来时就会被拒绝
conn, addr = gd_server.accept() # 阻塞直到有连接为止,有了一个新连接进来后,就会为这个请求生成一个连接对象
print(conn, addr) with conn:
print('Connected by', addr)
while True:
data = conn.recv(1024) # 接收1024个字节
print("server recv:", conn.getpeername(), data.decode())
if not data: break # 收不到数据,就break
conn.sendall(data) # 把收到的数据再全部返回给客户端

先启动服务端,再启动客户端

# 客户端:
>>:hello
recived: hello
>>:茉莉
recived: 茉莉
>>:
# 服务端
<socket.socket fd=268, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 50001), raddr=('127.0.0.1', 51711)> ('127.0.0.1', 51711)
Connected by ('127.0.0.1', 51711)
server recv: ('127.0.0.1', 51711) hello
server recv: ('127.0.0.1', 51711) 茉莉


简单版聊天软件

客户端代码同上

服务端代码:

#!/usr/bin/env python
# -*-coding:utf-8 -*-
import socket
HOST = ''
PORT = 50002 gd_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
gd_server.bind((HOST, PORT)) gd_server.listen(1) # 开始监听,1代表在允许有一个连接排队,更多的新连接连进来时就会被拒绝
conn, addr = gd_server.accept() # 阻塞直到有连接为止,有了一个新连接进来后,就会为这个请求生成一个连接对象
print(conn, addr) with conn:
print('Connected by', addr)
while True:
data = conn.recv(1024) # 接收1024个字节
print("recv from client:", conn.getpeername(), data.decode())
if not data: break # 收不到数据,就break response = input(">>>").strip()
conn.send(response.encode())
print("send to client:",response)

运行结果

如果想要服务端一直在运行中的状体,即服务端不会因为客户端断而链接断开,可以在最外层再加一个 while True 循环即可:


s.send()
# 发送TCP数据,将string中的数据发送到连接的套接字。返回值是要发送的字节数量,该数量可能小于string的字节大小。 所以,send() 执行一次,可能不会把所有数据都发送完毕。
s.sendall()

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

如果遇到这个问题:

解决方法:

sock_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock_server.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) #一行代码搞定,写在bind之前
sock_server.bind((HOST, PORT))


2. UDP SOCKET

udp 不需要经过3次握手和4次挥手,不需要提前建立连接,直接发数据就行。

客户端:

#!/usr/bin/env python
# -*-coding:utf-8 -*-
import socket
ip_port = ('127.0.0.1',9000)
BUFSIZE = 1024
udp_server_client = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) # socket.SOCK_DGRAM while True:
msg=input('>>: ').strip()
if not msg:continue
udp_server_client.sendto(msg.encode('utf-8'),ip_port) # sendto back_msg,addr = udp_server_client.recvfrom(BUFSIZE)
print(back_msg.decode('utf-8'),addr)

服务端:

import socket
ip_port=('127.0.0.1', 9000)
BUFSIZE=1024 udp_server_client=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) # udp类型
udp_server_client.bind(ip_port) while True:
msg,addr=udp_server_client.recvfrom(BUFSIZE) # recvfrom
print("recv ",msg,addr) udp_server_client.sendto(msg.upper(), addr)


3. UDP and TCP

tcp基于链接通信

  • 基于链接,则需要listen(backlog),指定连接池的大小
  • 基于链接,必须先运行的服务端,然后客户端发起链接请求
  • 对于mac系统:如果一端断开了链接,那另外一端的链接也跟着完蛋recv将不会阻塞,收到的是空(解决方法是:服务端在收消息后加上if判断,空消息就break掉通信循环)
  • 对于windows/linux系统:如果一端断开了链接,那另外一端的链接也跟着完蛋recv将不会阻塞,收到的是空(解决方法是:服务端通信循环内加异常处理,捕捉到异常后就break掉通讯循环)

udp无链接

  • 无链接,因而无需listen(backlog),更加没有什么连接池之说了
  • 无链接,udp的sendinto不用管是否有一个正在运行的服务端,可以己端一个劲的发消息,只不过数据丢失
  • recvfrom收的数据小于sendinto发送的数据时,在mac和linux系统上数据直接丢失,在windows系统上发送的比接收的大直接报错
  • 只有sendinto发送数据没有recvfrom收数据,数据丢失

socket 代码实例的更多相关文章

  1. 网络编程之Socket代码实例

    网络编程之Socket代码实例 一.基本Socket例子 Server端: # Echo server program import socket HOST = '' # Symbolic name ...

  2. Python全栈开发:socket代码实例

    客户端与服务端交互的基本流程 服务端server #!/usr/bin/env python # -*- coding;utf-8 -*- import socket sk = socket.sock ...

  3. socket通讯实例与TCP/UDP的区别

    一.socket代码实例 1.简单的socket通讯: 服务端代码实例: import socket sock = socket.socket(socket.AF_INET, socket.SOCK_ ...

  4. .net平台下socket异步通讯(代码实例)

    你应该知道的.net平台下socket异步通讯(代码实例) 1,首先添加两个windows窗体项目,一个作为服务端server,一个作为客户端Client 2,然后添加服务端代码,添加命名空间,界面上 ...

  5. Flex通信-与Java实现Socket通信实例

    Flex通信-与Java实现Socket通信实例  转自:http://blessht.iteye.com/blog/1136888 博客分类: Flex 环境准备 [服务器端] JDK1.6,“ja ...

  6. Linux下简单的socket通信实例

    Linux下简单的socket通信实例 If you spend too much time thinking about a thing, you’ll never get it done. —Br ...

  7. php接口数据加密、解密、验证签名代码实例

    php接口数据加密.解密.验证签名 代码非常easy,这里就不多废话了,直接奉上代码 <?php /** * 数据加密.解密.验证签名 * @edit http://www.lai18.com ...

  8. Java Socket 通信实例 - 转载

    基于Tcp协议的简单Socket通信实例(JAVA)   好久没写博客了,前段时间忙于做项目,耽误了些时间,今天开始继续写起~ 今天来讲下关于Socket通信的简单应用,关于什么是Socket以及一些 ...

  9. 网络协议栈学习(一)socket通信实例

    网络协议栈学习(一)socket通信实例 该实例摘自<linux网络编程>(宋敬彬,孙海滨等著). 例子分为服务器端和客户端,客户端连接服务器后从标准输入读取输入的字符串,发送给服务器:服 ...

随机推荐

  1. NDK编译不同架构的参数

    随着Android的蓬勃发展, CPU的架构也越来越多. 早期只支持ARMv5, 截至目前, 支持的架构已达三类七种: ARM(ARMv5,ARMv7 (从2010年起),ARMv8), x86(x8 ...

  2. Java网络编程二--基于UDP的编程

    DatagramSocket对象为基于UDP协议的Socket 构造器提供可以选择性绑定到指定端口和ip 创建完对象后调用:receive(DatagramPacket p) send(Dategra ...

  3. concat、concat_ws、group_concat函数用法

    一.concat()函数可以连接一个或者多个字符串 CONCAT(str1,str2,…) 返回结果为连接参数产生的字符串.如有任何一个参数为NULL ,则返回值为 NULL. select conc ...

  4. mysql应用学习-解决数据乱码

    原因 mysql数据库character_set_database和character_set_server默认编码是latin1,所以导致乱码: 修改步骤 step1. 修改my.ini配置 在[m ...

  5. 运行jsp时,报错404

    The origin server did not find a current reprsentation for the target resource or is not willing to ...

  6. scp命令的使用

    scp命令是什么 scp是 secure copy的缩写, scp是linux系统下基于ssh登陆进行安全的远程文件拷贝命令. scp命令用法 scp [-1246BCpqrv] [-c cipher ...

  7. Sass学习笔记(三)

    一.Sass的控制命令 二.Sass的函数功能 sass中除了可以定义变量,还自备了一系列函数功能,主要包括:字符串函数.数字函数.列表函数.颜色函数.Instrospection函数.三元函数等.当 ...

  8. oracle学习篇八:约束

    ----约束------- --1.主键约束--唯一标识,不能为空,通常用于ID--1>创建主键create table person(id varchar2(20) primary key,n ...

  9. Tomcat部分操作

    一 概述 1.Tomcat是什么? Tomcat是Apache软件基金会提供的开源免费的服务器,适用于中小型系统与并发访问用户不是很多的情况. 2.域名 IP是互联网上一台计算机的唯一标识,但IP不容 ...

  10. 使用 iframe + postMessage 实现跨域通信

    在实际项目开发中可能会碰到在 a.com 页面中嵌套 b.com 页面,这时第一反应是使用 iframe,但是产品又提出在 a.com 中操作,b.com 中进行显示,或者相反. 1.postMess ...