点对点通信实验
大家好,又见面了,我是你们的朋友全栈君。
点对点通信实验
语言:python
1.socket基础
参考:百度百科,socket,CSDN上也有很多讲解socket的。
2.python中使用的相关函数
1)socket.socket(family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None)
AF_INET:ipv4协议
SOCK_STREAM:面向连接的稳定数据传输,即TCP
2)socket.bind(address)
s.bind(address)将套接字绑定到地址。address地址的格式取决于地址族。在AF_INET下,以元组(host,port)的形式表示地址。
3)socket.listen(backlog)
开始监听传入连接。backlog指定在拒绝连接之前,可以挂起的最大连接数量。backlog等于5,表示内核已经接到了连接请求,但服务器还没有调用accept进行处理的连接个数最大为5,这个值不能无限大,因为要在内核中维护连接队列
4)socket.setblocking(bool)
是否阻塞(默认True),如果设置False,那么accept和recv时一旦无数据,则报错。
5)socket.accept()
接受连接并返回(conn,address),其中conn是新的套接字对象,可以用来接收和发送数据。address是连接客户端的地址。接收TCP 客户的连接(阻塞式)等待连接的到来
6)socket.connect(address)
连接到address处的套接字。一般,address的格式为元组(hostname,port),如果连接出错,返回socket.error错误。
7)socket.close()
关闭套接字
8)socket.recv(bufsize[,flag])
接受套接字的数据。数据以字符串形式返回,bufsize指定最多可以接收的数量。flag提供有关消息的其他信息,通常可以忽略。
9)socket.send(string[,flag])
将string中的数据发送到连接的套接字。返回值是要发送的字节数量,该数量可能小于string的字节大小。即:可能未将指定内容全部发送。
3.实验
在同一台虚拟机上运行两个docker容器。ip分别为172.17.0.2和172.17.0.3
一个做服务端,一个做客户端
在服务端运行server.py,客户端运行client.py,如下;
注意,在终止程序时使用Ctrl+C不要用Ctrl+Z,否则程序没有完全关掉,下次运行这个程序时会报错。若用Ctrl+Z关闭程序时,这时可以使用ps aus查看进程,使用kill命令杀死进程再运行。
程序如下:
服务端:
import socket
HOST='172.17.0.2'
PORT=5678
def main():
service=socket.socket()
service.bind((HOST,PORT))
service.listen(5)
print("server is listening...")
while True:
connection,addr=service.accept()
print(addr[0]+" is connected.")
while True:
message=connection.recv(1024).decode('utf-8')
print(message)
if message=="#exit#":
print(addr[0]+" exit.")
break;
connection.close()
if __name__ == '__main__':
main()
客户端:
import socket
HOST='172.17.0.2'
PORT=5678
def main():
client=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
if client.connect((HOST,PORT))!=socket.error:
print("connect successfully!")
try:
while 1:
message=input("please input the message you want to send:")
infor=message.encode('utf-8')
client.send(infor)
except KeyboardInterrupt:
message='#exit#'
infor=message.encode('utf-8')
client.send(infor)
print("exit.")
client.close()
if __name__ == '__main__':
main()
注:以上所有操作均在作者在网上搜集资料后,在个人电脑上实验成功,若读者实验时失败,可能由一些未知因素导致,可与作者联系。编写的教程可能由于疏忽出错,请与作者联系。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/159982.html原文链接:https://javaforall.cn
相关文章
- 总结了Vue组件通信方式,别再说不会组件通信了
- 单片机 串口编程之串口通信仿真实验
- 51单片机之红外通信原理图_单片机红外通信原理
- delphi 进程通信_多线程实现java
- 腾讯云2023年新春大促丨CDN&音视频通信优惠购买攻略
- 【Flutter】Flutter 混合开发 ( Flutter 与 Native 通信 | Android 端实现 MethodChannel 通信 )
- C# socket通信实现两个控制台之间聊天详解编程语言
- Linux套接字编程:实现多点通信(linux套接字通信)
- 探索 Linux 对通信技术的卓越应用——Comm Linux(commlinux)
- Linux下的SIP通信:打造高效便捷的语音通话平台(siplinux)
- Linux进程间通信实时探索(linux进程通信实验)
- 基于Redis的高效通信结构研究(redis通信结构)
- 使用Redis订阅发布协议实现消息通信(redis订阅发布协议)
- winform使用委托和事件来完成两个窗体之间通信的实例
- Android中Socket通信的实现方法概述