5-4日 socket套接字
1,socket定义
Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。
2,基于tcp协议的socket
tcp是基于链接的,必须先启动服务端,然后再启动客户端去链接服务端。
server端
import socket
sk = socket.socket()#创建服务端套接字 sk.bind(('127.0.0.1',9090))#把地址绑定到套接字
sk.listen()#监听链接 conn,addr = sk.accept()#接受客户端链接
print(addr)#打印客户端地址
conn.send('你好'.encode('utf-8'))#向客户端发送信息
ret = conn.recv(1024)#接受客户端信息
print(ret.decode('utf-8'))#打印客户端信息 conn.close()#关闭客户端套接字
sk.close()#关闭服务器套接字(可选)
client端
import socket sk = socket.socket()#创建客户端套接字
sk.connect(('127.0.0.1',9090))# 尝试连接服务器
ret = sk.recv(1024)#接受服务端信息
print(ret.decode('utf-8'))#打印服务端信息
sk.send('你也好'.encode('utf-8'))# 对话(发送/接收) sk.close()# 关闭客户套接字
3,基于UDP协议的socket
udp是无链接的,启动服务之后可以直接接受消息,不需要提前建立链接
server端
import socket
sk = socket.socket(type=socket.SOCK_DGRAM)
sk.bind(('127.0.0.1',9090))
while True:
msg,client_addr = sk.recvfrom(1024)
print(msg.decode('utf-8'))
inp = input('>>>')
sk.sendto(inp.encode('utf-8'),client_addr) sk.close()
client端
import socket sk= socket.socket(type=socket.SOCK_DGRAM)
while True:
inp = input('>>>')
sk.sendto(inp.encode('utf-8'),('127.0.0.1',9090))
msg,addr = sk.recvfrom(1024)
print(msg.decode('utf-8')) sk.close()
qq轻聊版
server端
import socket
lst = {'egon':'\031[1;31m','yuan':'031[1;31m'}
sk = socket.socket(type=socket.SOCK_DGRAM)
sk.bind(('127.0.0.1',9090))
while True:
msg,client_addr = sk.recvfrom(1024)
name,mesg = msg.decode('utf-8').split(':')
color = lst.get(name.strip(),'')
print('%s%s\033[0m'%(color,msg.decode('utf-8')))
inp = input('>>>')
sk.sendto(inp.encode('utf-8'),client_addr)
sk.close()
client端
import socket
sk = socket.socket(type=socket.SOCK_DGRAM) name = input('name')
while True:
inp = input('>>>')
sk.sendto(('%s:%s'%(name,inp)).encode('utf-8'),('127.0.0.1',9090))
msg,addr = sk.recvfrom(1024)
print(msg.decode('utf-8'))
sk.close()
时间服务器
server端
import time
import socket
sk = socket.socket(type = socket.SOCK_DGRAM)
sk.bind(('127.0.0.1',9090))
while True:
msg,addr = sk.recvfrom(1024)
sk.sendto(time.strftime(msg.decode('utf-8')).encode('utf-8'),addr) sk.close()
client端
import time
import socket sk = socket.socket(type=socket.SOCK_DGRAM)
while True:
sk.sendto('%Y/%m/%d %H:%M:%S'.encode('utf-8'),('127.0.0.1',9090))
ret,addr = sk.recvfrom(1024)
print(ret.decode('utf-8'))
time.sleep(2) sk.close()
socket参数的详解
socket.socket(family=AF_INET,type=SOCK_STREAM,proto=0,fileno=None)
创建socket对象的参数说明:
| family | 地址系列应为AF_INET(默认值),AF_INET6,AF_UNIX,AF_CAN或AF_RDS。 (AF_UNIX 域实际上是使用本地 socket 文件来通信) |
| type |
套接字类型应为SOCK_STREAM(默认值),SOCK_DGRAM,SOCK_RAW或其他SOCK_常量之一。 SOCK_STREAM 是基于TCP的,有保障的(即能保证数据正确传送到对方)面向连接的SOCKET,多用于资料传送。 SOCK_DGRAM 是基于UDP的,无保障的面向消息的socket,多用于在网络上发广播信息。 |
| proto | 协议号通常为零,可以省略,或者在地址族为AF_CAN的情况下,协议应为CAN_RAW或CAN_BCM之一。 |
| fileno |
如果指定了fileno,则其他参数将被忽略,导致带有指定文件描述符的套接字返回。 与socket.fromfd()不同,fileno将返回相同的套接字,而不是重复的。 这可能有助于使用socket.close()关闭一个独立的插座。 |
5-4日 socket套接字的更多相关文章
- java 25 - 3 网络编程之 Socket套接字
Socket Socket套接字: 网络上具有唯一标识的IP地址和端口号组合在一起才能构成唯一能识别的标识符套接字. Socket原理机制: 通信的两端都有Socket. 网络通信其实就是Socket ...
- 进程、线程、socket套接字-资源大小 & 切换代价
另,进程 & 线程的很多知识可以看这里:http://www.cnblogs.com/charlesblc/p/6135666.html 今天查了一下进程和线程的资源占用. 比如问:栈和堆的大 ...
- linux网络环境下socket套接字编程(UDP文件传输)
今天我们来介绍一下在linux网络环境下使用socket套接字实现两个进程下文件的上传,下载,和退出操作! 在socket套接字编程中,我们当然可以基于TCP的传输协议来进行传输,但是在文件的传输中, ...
- linux网络编程-(socket套接字编程UDP传输)
今天我们来介绍一下在linux网络环境下使用socket套接字实现两个进程下文件的上传,下载,和退出操作! 在socket套接字编程中,我们当然可以基于TCP的传输协议来进行传输,但是在文件的传输中, ...
- socket套接字TCP API
socket套接字TCP API socket概念 socket又称"套接字",是计算机网络中进程间通信数据通道的一个端点.或称之为句柄.IP地址+port号就能够唯一确定一个so ...
- 进程间通信系列 之 socket套接字实例
进程间通信系列 之 概述与对比 http://blog.csdn.net/younger_china/article/details/15808685 进程间通信系列 之 共享内存及其实例 ...
- 进程间通信系列 之 socket套接字及其实例
进程间通信系列 之 概述与对比 http://blog.csdn.net/younger_china/article/details/15808685 进程间通信系列 之 共享内存及其实例 ...
- 一、网络编程-UDP传输协议及socket套接字使用
知识点基本介绍:1.网络通信协议一般就是UDP和TCP俩种传输协议,这一章先说UDP,UDP是一种比较简单的传输协议,如qq使用的就是UDP 2.ip:ip就是标记网络中中的一台电脑 ...
- 网络编程初识和socket套接字
网络的产生 不同机器上的程序要通信,才产生了网络:凡是涉及到倆个程序之间通讯的都需要用到网络 软件开发架构 软件开发架构的类型:应用类.web类 应用类:qq.微信.网盘.优酷这一类是属于需要安装的桌 ...
随机推荐
- (转)c++ 回调函数
https://www.cnblogs.com/chenyuming507950417/archive/2012/01/02/2310114.html 今天讨论下C/C++中的回调函数. 在理解“回调 ...
- python与java的猜拳游戏
python版: import randomprint("-----猜拳游戏-----")print("---0.剪刀--1.石头--2.布---")while ...
- numpy的使用方法
一.numpy快速入门 1.什么是numpy: numpy是python的一个矩阵类型,提供了大量矩阵处理的函数,非正式来说,就是一个使运算更容易,执行更迅速的库,因为它的内部运算是通过c语言而不是p ...
- 逻辑回归 代价函数J关于系数theta求导
J=-y*loga-(1-y)*log(1-a) 梯度下降,求dJ/d_theta_j
- Linux列字符替换
假如存在file1.txt,其内容如下: aa bb cc dd ee ff gg hh 现将第一列(aa 和 ee)统一修改为mm 则需要输入命令行: awk '{$1="mm" ...
- 第二十二节,TensorFlow中RNN实现一些其它知识补充
一 初始化RNN 上一节中介绍了 通过cell类构建RNN的函数,其中有一个参数initial_state,即cell初始状态参数,TensorFlow中封装了对其初始化的方法. 1.初始化为0 对于 ...
- POJ 2240 Arbitrage (Bellman Ford判正环)
Arbitrage Time Limit: 1000MS Memory Limit: 65536K Total Submissions:27167 Accepted: 11440 Descri ...
- 高级组件——表格JTable
JTable(Object[][] rowData,Object[] columnNames) 表格数据 列名集合 setSe ...
- zookeeper的监控
1.idea插件: zookeeper https://blog.csdn.net/long290046464/article/details/52974061 优点:直接查看,不用来回切换监控 缺点 ...
- Luogu P4197 Peaks
题目链接 \(Click\) \(Here\) 做法:\(Kruskal\)重构树上跑主席树 构造方法:把每条边拆出来成一个点,点权是原先的边权.每次连边的时候,连的不再是点,而是其原先点所在的联通块 ...