# 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()

day26-socket(server和client通信)的更多相关文章

  1. Winsock网络编程笔记(3)----基于UDP的server和client

    在上一篇随笔中,对Winsock中基于tcp面向连接的Server和Client通信进行了说明,但是,Winsock中,Server和Client间还可以通过无连接通信,也就是采用UDP协议.. 因此 ...

  2. Winsock网络编程笔记(2)----基于TCP的server和client

    今天抽空看了一些简单的东西,主要是对服务器server和客户端client的简单实现. 面向连接的server和client,其工作流程如下图所示: 服务器和客户端将按照这个流程就行开发..(个人觉得 ...

  3. Android简单实现Socket通信,client连接server后,server向client发送文字数据

    案例实现的是简单的Socket通信,当client(Androidclient)连接到指定server以后,server向client发送一句话文字信息(你能够拓展其他的了) 先看一下服务端程序的实现 ...

  4. netty4.0 Server和Client的通信

    netty4.0 Server和Client的通信 创建一个maven项目 添加Netty依赖 <dependency> <groupId>io.netty</group ...

  5. (填坑系列) 用aio写server与client进行通信的坑

    最近闲来无事,就估摸着自己写个“服务注册中心”来玩,当然因为是个人写的,所以一般都是简洁版本. 代码地址在:https://gitee.com/zhxs_code/my-service-registe ...

  6. C Socket Programming for Linux with a Server and Client Example Code

    Typically two processes communicate with each other on a single system through one of the following ...

  7. java 记录一下socket的server与client

    package com.test.server; import java.io.IOException; import java.net.ServerSocket; import org.apache ...

  8. 用XMLRPC开服务进行server/client通信

    本文讲一下怎样用python的xmlrpc开服务,进行server/client的通信. 应用场景:1)需多client訪问应用程序给予应答情况--网页服务.  2)数据极大,希望载入一次.后面仅仅用 ...

  9. C语言 linux环境基于socket的简易即时通信程序

    转载请注明出处:http://www.cnblogs.com/kevince/p/3891033.html      ——By Kevince 最近在看linux网络编程相关,现学现卖,就写了一个简易 ...

随机推荐

  1. BZOJ 2285 [Sdoi2011]保密

    题解: 求比值用分数规划,单个求太慢了套整体二分 然后求二分图最小割 // luogu-judger-enable-o2 #include<iostream> #include<cs ...

  2. 洛谷 P1018乘积最大

    题目描述 今年是国际数学联盟确定的“20002000――世界数学年”,又恰逢我国著名数学家华罗庚先生诞辰9090周年.在华罗庚先生的家乡江苏金坛,组织了一场别开生面的数学智力竞赛的活动,你的一个好朋友 ...

  3. JavaScript 之 web API

    1.获取元素 document.getElementById('标签的id值'); document.getElementsByTagName('标签名'); document.getElements ...

  4. 前端 Docker 镜像体积优化

    如果 2019 年技术圈有十大流行词,容器化肯定占有一席之地,随着 Docker 的风靡,前端领域应用到 Docker 的场景也越来越多,本文主要来讲述下开源的分布式图数据库 Nebula Graph ...

  5. 干货 | TiDB Operator实践

    干货 | TiDB Operator实践 北京it爷们儿 京东云开发者社区  4天前 K8s和TiDB都是目前开源社区中活跃的开源产品,TiDB Operator项目是一个在K8s上编排管理TiDB集 ...

  6. 吴裕雄--天生自然MySQL学习笔记:MySQL GROUP BY 语句

    GROUP BY 语句根据一个或多个列对结果集进行分组. 在分组的列上我们可以使用 COUNT, SUM, AVG,等函数. GROUP BY 语法 SELECT column_name, funct ...

  7. 不重复,distinct,row_number() over(partition by)

    1.查询不重复的字段 select distinct name from table 2.查询某个字段不重复的,所有内容 sql根据某一个字段重复只取第一条数据 select s.* from ( s ...

  8. Java并发分析—synchronized

    在计算机操作系统中,并发在宏观上是指在同一时间段内,同时有多道程序在运行. 一个程序可以对应一个进程或多个进程,进程有独立的存储空间.一个进程包含一个或多个线程.线程堆空间是共享的,栈空间是私有的.同 ...

  9. Vue中Js动画 与Velocity.js 多组件多元素 列表过渡

    Vue提供我们很多js动画钩子 写在tansition标签内部 入场动画 @before-enter="" 处理函数收到一个参数(e l) el为这个元素 @enter=" ...

  10. iview checkbox demo(文档改写)

    <template> <div class="content"> <div style="border-bottom: 1px solid ...