您的位置:首页 > 理论基础 > 计算机网络

Python3-网络编程Socket学习

2017-11-03 17:22 609 查看


首先在学习应该知道什么是网络编程?


           网络编程最主要的工作就是在发送端把信息通过规定好的协议进行组装包,在接收端按照规定好的协议把包进行解析,从而提取出对应的信息,达到通信的目的。

 那么计算机与计算机之间的通信要解决那些问题?
通信协议:通信协议就是指信息的交流方式(就好比你和某人的一种约定,如果没有约定,你用写信的方式给他邮递过去,他一直在等你打电话,根本不会去看什么邮箱,所以就需要约定一种交流方式)
常见的通信协议: 
tcp  :TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。


(必须双方或多方同时在线,创建连接,才能进行数据的传递)
udp
:UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,IETF RFC 768是UDP的正式规范。UDP在IP报文的协议号是17。   



(不需要双方或多方同时在线,也无需创建连接) 

        http:超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。
ftp:FTP 是File Transfer Protocol(文件传输协议)的英文简称,而中文简称为“文传协议”。用于Internet上的控制文件的双向传输。(本地)
poo3:POP3,全名为“Post Office Protocol - Version 3”,即“邮局协议版本3”。是TCP/IP协议族中的一员,由RFC1939 定义。本协议主要用于支持使用客户
4000
端远程管理在服务器上的电子邮件。提供了SSL加密的POP3协议被称为POP3S。


这几种方式都各有所长,运用到不同的方面,根据不同的需求进行使用。
如何去实现 计算机与计算机之间的通信?
首先我们要知道 那个是主叫方 那个是被叫方  然后就可以创建他们之间的通信协议了。网络编程我们常用的就是socket


什么是 Socket?

Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯。

接下来我们就来实现一下一个简单的通信:

被叫方:

import socket  #导入socket模块
import threading #导入线程模块
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #使用socket()函数创建套接字
s.bind(("localhost",9998))  #绑定地址(host,port)到套接字, 在AF_INET下,以元组(host,port)的形式表示地址。
s.listen(5) #开始TCP监听。backlog指定在拒绝连接之前,操作系统可以挂起的最大连接数量。该值至少为1,大部分应用程序设为5就可以了。
c=s.accept() #被动接受TCP客户端连接,(阻塞式)等待连接的到来
print("有人连接了!")     #之后有人访问就会显示,这是处于被叫一方
def myrecv(s):          #创建一个接受发送过来的信息的方法
while True:         #循坏接受
msg=s.recv(1024)    #接收TCP数据,数据以字符串形式返回,bufsize指定要接收的最大数据量。
print(msg.decode()) #将接受到的信息解码并输出
threading._start_new_thread(myrecv,(c[0],)) #创建一个线程,每次连接创建一个
while True:     #在这里循坏可以发送消息
msg=input() #输入想发送的信息
c[0].send(msg.encode()) #发送TCP数据,将string中的数据发送到连接的套接字。返回值是要发送的字节数量,该数量可能小于string的字节大小。并进行编码
主叫方:

import socket
import threading
c=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
c.connect(("localhost",9998)) #主动初始化TCP服务器连接,。一般address的格式为元组(hostname,port),如果连接出错,返回socket.error错误。
print("连接成功!")
def myrecv(c): #接下来与上面被叫方的是一样道理
while True:
msg=c.recv(1024)
print(msg.decode())
threading._start_new_thread(myrecv,(c,))
while True:
msg=input()
c.send(msg.encode())
只要完成上面的代码,先讲被叫打开,等待连接即可,之后打开主叫进行连接,然后就可以互相发送消息。
在上面绑定连接
bind(("localhost",9998))
与主动连接
connect(("localhost",9998))
我是采用了本地的("localhost"),还可以自定义端口号,只要不与本地一些服务的端口号冲突。
也可以使用局域网,启动一个被叫方,然后启动几个主叫方共同连接被叫方,就可以多人聊天了。



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: