# socket是应用层与TCP/IP协议通信的中间软件抽象层,它是一组接口。它把复杂的TCP/IP协议隐藏到socket
#接口的后面,让socket去组织数据,以符合指定的协议。
# socket是一个模块,使用它来建立两个程序之间的连接和通信。也可以把socket看做是ip+port,因为ip标识
#互联网中一台主机的位置,而port标识这台主机上的一个应用程序,只要确立ip和port就可以找到一个应用程序,
#并且使用socket模块来与这个应用程序通信。
# 先启动server,等待client发信息。
#网络传输的是bytes,recv接收之后,需要decode解码为str。
#encode编码,把str转化为bytes。 # 一、基于TCP的socket服务:
# 1、server服务端:
# 1.1
import socket
sk = socket.socket() #买手机--创建套接字
# sk.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)避免服务重启的时候报address already in use
sk.bind(('127.0.0.1',8080)) #绑定手机卡--绑定端口:sk.bind(('ip','port')),bind(元祖)
# 127.0.0.1是本机的回环地址,用于本机内部应用程序的通信。
sk.listen() #监听,等待有人给我打电话--侦听客户请求
conn,addr = sk.accept() #接收到别人的电话,--接受客户端连接
# 得到了连接conn(connection),和别人的地址addr(address)
#接收、发送--recv、send
ret = conn.recv(1024) #听别人说话,--接收客户端信息
# 接收1024个字节,如果接收更长的信息可以填写2048或其他更大的数字,recv(receive)接收
print(ret.decode('utf-8'))
conn.send(b'hi,client') #和别人说话,必须传一个bytes类型。--向客户端发送信息。b'hi,client'相当于'hi,client'.encode('utf-8'))
ret = conn.recv(1024)
print(ret.decode('utf-8'))#接收的是bytes,要解码为utf-8
conn.send(bytes('你也不错',encoding = 'utf-8')) #conn.send('你也不错'.encode('utf-8')) conn.close() #挂电话--关闭客户端套接字
sk.close() #关手机--关闭服务器套接字 # 1.2 不停跟client聊天,直到说bye才结束。
import socket
sk = socket.socket()
sk.bind(('127.0.0.1',8082))
sk.listen()
conn,addr = sk.accept() while True:
ret = conn.recv(1024).decode('utf-8')
if ret == 'bye':
print(ret)
conn.send(b'bye')
break
print(ret)
info = input('>>>')
conn.send(bytes(info,encoding = 'utf-8'))#conn.send(info.encode('utf-8')) conn.close()
sk.close() # 2、client客户端:
# 2.1
import socket
sk = socket.socket() #买手机
sk.connect(('127.0.0.1',8080))#拨号,连接别人的地址和端口 sk.send(b'hello,server') #和别人说话
ret = sk.recv(1024) #听别人说话
print(ret.decode('utf-8'))
sk.send(bytes('你很好',encoding = 'utf-8'))
ret = sk.recv(1024)
print(ret.decode('utf-8')) sk.close() #关手机 # 2.2 不停跟server聊天,直到说bye才结束。
import socket
sk = socket.socket()
sk.connect(('127.0.0.1',8082)) while True:
info = input('>>>')
sk.send(bytes(info,encoding = 'utf-8'))
ret = sk.recv(1024).decode('utf-8')
print(ret)
if ret == 'bye':
sk.send(b'bye')
break
sk.close() # 二、基于UDP的socket服务:不需要连接。
# 1.1 server服务端:
import socket
sk = socket.socket(type=socket.SOCK_DGRAM)
sk.bind(('127.0.0.1',9000)) #没有listen监听和accept接收连接
ret,addr = sk.recvfrom(1024) #接收client的addr是元祖,元祖没有decode属性,所以这里不能写sk.recvfrom(1024).decode('utf-8')
print(ret.decode('utf-8'))
print(addr)#('127.0.0.1',63508),是client的地址。
sk.sendto(bytes('你好client',encoding='utf-8'),addr) #发送的时候需要填写client的addr地址 sk.close() # 1.2 client客户端:
import socket
sk = socket.socket(type=socket.SOCK_DGRAM)
ip_port = ('127.0.0.1',9000) #server的地址和端口 sk.sendto(bytes('你好server',encoding='utf-8'),ip_port)#发送的时候需要把自己的地址一起发给server
ret,addr = sk.recvfrom(1024)#addr就是ip_port
print(ret.decode('utf-8')) sk.close() # 2.1 一个服务器端 对 两个客户端:例如qq聊天
#服务器端:
import socket
sk = socket.socket(type=socket.SOCK_DGRAM)
sk.bind(('127.0.0.1',9000))
while True:
ret,addr = sk.recvfrom(1024)
print(ret.decode('utf-8'))
info = input('>>>')
sk.sendto(bytes(info,encoding='utf-8'),addr)
sk.close() #客户端1:
import socket
sk = socket.socket(type=socket.SOCK_DGRAM)
ip_port = ('127.0.0.1',9000)
while True:
info = input('>>>')
sk.sendto(bytes(('\033[31mclient1:%s\033[0m'%info).encode('utf-8')),ip_port)
ret,addr = sk.recvfrom(1024)
print(ret.decode('utf-8'))
sk.close() #客户端2:
import socket
sk = socket.socket(type=socket.SOCK_DGRAM)
ip_port = ('127.0.0.1',9000)
while True:
info = input('>>>')
sk.sendto(bytes(('\033[31mclient2:%s\033[0m'%info).encode('utf-8')),ip_port)
ret,addr = sk.recvfrom(1024)
print(ret.decode('utf-8'))
sk.close()

最新文章

  1. DoD and DoR
  2. java BigDecimal add 等方法遇到的问题
  3. Cucumber命令行接口
  4. 解析 MACH_O 文件
  5. Careercup - Microsoft面试题 - 6366101810184192
  6. CSS里的引用@import、link
  7. linux 更换yum源
  8. Android简单开发的画画板
  9. java开发区块链只需150行代码
  10. java简单框架设计
  11. Jmeter之发送请求入参必须使用编码格式、Jmeter之发送Delete请求可能入参需要使用编码格式
  12. 解决Altera家的ROM仿真数据一直为0
  13. 浮动滚动条 slimScroll
  14. python中TCP粘包问题解决方案
  15. 设置log rotation避免tomcat catalina.out文件增长过大
  16. UINavigationController详细(转)
  17. Java中常见的异常__
  18. Location对象的页面跳转方法介绍
  19. 20155338 2016-2017-2 《Java程序设计》第3周学习总结
  20. openjudge-NOI 2.6-2728 摘花生

热门文章

  1. Java查漏补缺(3)(面向对象相关)
  2. Windbg 实践之结合条件断点
  3. SQL基础教程(第2版)第8章 SQL高级处理:8-2 GROUPING运算符
  4. Java程序员想年后跳槽,对JVM没有深入的理解,我劝你还是别跳了
  5. 北邮14&18年软院机试【参考】答案
  6. JavaScript—面向对象 贪吃蛇_2 游戏对象
  7. git push报错! [rejected] master -> master (non-fast-forward) error: failed to push some refs to 'https://gitee.com/XXX.git
  8. MySQL主主、主从、从从配置文件
  9. php 随机useragent
  10. if_while