初识python:scoket 单用户互发消息
实现功能:
启动“服务器”、通过“客户端1”连接“服务器”,然后互发消息。在此过程中,有“客户端2”连接到“服务器”,此时,“客户端2”处于占线状态,必须要等“客户端1”退出之后才能与“服务器”互发消息。
知识点:
s = socket.socket(family,type) 声明一个socket类型,同时创建连接(套接字),一般默认就可以
family 参数:
socket.AF_UNIX # 只能够用于单一的Unix系统进程间通信
socket.AF_INET # IPV4 服务器之间网络通信
socket.AF_INET6 # IPV6
type 参数:
socket.SOCK_STREAM # 流式socket 用于 TCP
socket.SOCK_DGRAM # 数据报式socket 用于 UDP
主要方法:
s.send(以字节类型发送,要发送的信息),返回值为要发送的字节数量,可能小于要发送的字节数。
s.sendall(以字节类型发送,要发送的信息),发送所有。实际是内部递归调用send,发送所有内容。
s.setblocking(True/False) accept或recv时是否阻塞,等待连接。若False,在接收时无数据,则会报错。
s.recv(指定最多可以接收的字节数) 接收信息,以字符串形式返回
s.recvfrom(指定最多可以接收的字节数) 接收信息,返回2个值(要接收的字符串,发送信息的地址)
s.settimeout(多少秒) 设置等待多长时间之后端口连接,单位秒
s.sendfile() 发送文件
s.getpeername() 返回连接的远程地址:ip,端口
s.getsockname() 返回自己的地址:ip,端口
s.close() 关闭连接
s.bind(address) 绑定地址,一般情况是元组形式:(ip,端口)
s.listen(最大连接数) 开始监听传入连接,连接数不能无限大
s.accept() 接收连接(阻塞式),并返回2个值(新的连接对象,连接地址),同时等待连接的到来。
s.connect(address) 连接到指定地址(服务器)
s.connect_ex(address) 连接到指定地址(服务器),连接成功返回0,否者返回错误代码
服务器端流程:声明、绑定监听、获取连接、接收、发送、关闭
1、创建连接(套接字)
2、绑定要监听的ip(本地)、端口
3、开始监听连接
4、连接客户端请求
5、接收客户端信息
6、给客户端发送信息
7、关闭连接
客户端流程:声明、连接、发送、接收、关闭
1、创建连接(套接字)
2、通过ip、端口连接服务器
3、给服务器端发送信息
4、接收服务器端信息
5、关闭连接
整体流程:服务器监听连接,客户端发送连接请求,服务器接收请求,互发信息
具体代码:

#!/user/bin env python
# author:Simple-Sir
# time:2020/7/22 17:01
import socket # 服务器端
s = socket.socket() # 声明一个socket类型,同时创建连接(套接字)
s.bind(('10.108.226.140', 6969)) # 绑定要监听的ip、端口
s.listen(5) # 开始监听连接
print('等待连接...')
while 1:
conn,address = s.accept() # 连接客户端请求(筛选连接对象,在服务器端生产新的连接)
ip_c, port_c = conn.getsockname() # 本地IP
ip_s, port_s = conn.getpeername() # 远程IP
print('{0}:{1}已连接上了。'.format(ip_s,port_s))
while 1:
data2 = conn.recv(1024) # 接收信息,字符串
if not data2:
print('客户端{0}:{1}已断开连接。'.format(ip_s,port_c))
break
print('客户端 {0}:{1}:{2}'.format(ip_s,port_s,data2.decode('utf-8')))
while 1:
info = input('服务器 {0}:{1}:'.format(ip_c, port_c))
if len(info) == 0:
print('不能输入空值,请重新输入!')
else:
break
conn.send(info.encode('utf-8')) # 发送信息,字节
s.close() # 关闭连接
服务器端

#!/user/bin env python
# author:Simple-Sir
# time:2020/7/22 17:35
import socket # 客户端
c = socket.socket() # 定义协议类型、链接对象
c.connect(('10.108.226.140',6969))
while 1:
ip_c,port_c = c.getsockname() # 本地IP
ip_s,port_s = c.getpeername() # 远程IP
info = input('客户端 {0}:{1}:'.format(ip_c,port_c))
if len(info) == 0:
continue
c.send(info.encode('utf-8'))
data1 = c.recv(1024)
print('服务器 {0}:{1}:{2}'.format(ip_s,port_s,data1.decode('utf-8')))
c.close()
客户端
运行结果:
启动“服务器”:

启动客户端1:

客户端1和服务器互发消息:

此时客户端2“呼叫”服务器,服务器还在与客户端1连接中,无法“接通”客户端2,客户端2处于等待状态:

客户端1与服务器断开连接,客户端2接通:

其他连接情况:

初识python:scoket 单用户互发消息的更多相关文章
- netty-2.客户端与服务端互发消息
(原) 第二篇,客户端与服务端互发消息 与第一篇的例子类似,这里服务端需要三个类,客户端也需要三个类. 服务端关键代码如下:MyServer与上一个例子中的TestServer 差多,这里只列举不同的 ...
- Handler详解系列(四)——利用Handler在主线程与子线程之间互发消息,handler详解
MainActivity如下: package cc.c; import android.app.Activity; import android.os.Bundle; import android. ...
- Handler具体解释系列(四)——利用Handler在主线程与子线程之间互发消息
MainActivity例如以下: package cc.c; import android.app.Activity; import android.os.Bundle; import androi ...
- QQ互发消息
private NewsData data; private void button3_Click(object sender, EventArgs e) //发送 { string x = text ...
- udp 内网穿透 互发消息
还差实现内网终端,向服务器发送请求,要对方的内网连接自己,实现打洞.在同一网段,或者公网运行,可以相互聊天. 没有实现检测客户端下线功能. 1,服务器代码 package router; import ...
- 通过GUI制作一个简单的消息对话框互发消息
public class LTS extends JFrame { private JPanel contentPane; private JTextField textField; private ...
- java Socket通信,客户端与服务端相互发消息
1.通信过程 网络分为应用层,http.ssh.telnet就是属于这一类,建立在传输层的基础上.其实就是定义了各自的编码解码格式,分层如下: 2.Socket连接 上述通信都要先在传输层有建立连接的 ...
- 我们使用 Kafka 生产者在发消息的时候我们关注什么(Python 客户端 1.01 broker)
之前使用 Kafka 的客户端消费者比较多一点,而且也是无脑订阅使用也没有深入了解过具体的参数.总的来说使用不够细节. 这次公司项目活动期间暴露非常多的问题,于是有了这篇文章. 首先我们来拆解一下 K ...
- 利用python itchat给女朋友定时发信息
利用itchat给女朋友定时发信息 涉及到的技术有itchat,redis,mysql,最主要的还是mysql咯,当然咯,这么多东西,我就只介绍我代码需要用到的,其他的,如果需要了解的话,就需要看参考 ...
随机推荐
- MyBatis通过注解实现映射中的嵌套语句和嵌套结果
案例描述:查看订单或购物车订单信息的同时查询出该订单中所有书籍的信息. 一.嵌套语句 @Select("select* from shopcart where shopcartid = #{ ...
- 【C/C++】习题3-1 得分/算法竞赛入门经典
[题目]一个由O和X组成的串,O的得分为目前连续出现的O的个数,X的得分为0.要求统计得分. 我一开始以为要输出表达式,结果好像不需要? [代码] #include <stdio.h> # ...
- Sqlite 常用操作及使用EF连接Sqlite
Sqlite是一个很轻,很好用的数据库.兼容性很强,由于是一款本地文件数据库,不需要安装任何数据库服务,只需引入第三方开发包就可以.Sqlite的处理速度比MySql和PostgreSQL更快,性能很 ...
- 使用frp进行内网穿透,实现ssh远程访问Linux服务器
搭建一个完整的frp服务链需要: VPS一台(也可以是具有公网IP的实体机) 访问目标设备(就是你最终要访问的设备) 简单的Linux基础(如果基于Linux配置的话) 我这里使用了腾讯云服务器作为服 ...
- 4个优化方法,让你能了解join计算过程更透彻
摘要:现如今, 跨源计算的场景越来越多, 数据计算不再单纯局限于单方,而可能来自不同的数据合作方进行联合计算. 本文分享自华为云社区<如何高可靠.高性能地优化join计算过程?4个优化让你掌握其 ...
- MySQL——基础查询与条件查询
基础查询 /* 语法: select 查询列表 from 表名; 类似于:System.out.println(打印东西); 1.查询列表可以是:表中的字段.常量值.表达式.函数 2.查询的结果是一个 ...
- epoll 使用详解
epoll - I/O event notification facility在linux的网络编程中,很长的时间都在使用select来做事件触发.在linux新的内核中,有了一种替换它的机制,就是e ...
- Wireshark(二):应用Wireshark观察基本网络协议
原文出处: EMC中文支持论坛 TCP: TCP/IP通过三次握手建立一个连接.这一过程中的三种报文是:SYN,SYN/ACK,ACK. 第一步是找到PC发送到网络服务器的第一个SYN报文,这标识了T ...
- 花授粉优化算法-python/matlab
import numpy as np from matplotlib import pyplot as plt import random # 初始化种群 def init(n_pop, lb, ub ...
- ORALE 误删表 Flashback 恢复表
昨天因为种种原因误删了很多表(160多个),一下炸了锅. 我知道影响很大,第一时间想到使用 Flashback 恢复过来.Flashback 听过很久,但是没真正上手过,恢复之后发现使用起来也很简单. ...