本篇主要介绍网络编程的基础,以及UDP/TCP网络的socket编程,关于UDP套接字聊天器的实现、以及基于TCP套接字的服务器/客户端的实现上传下载功能。

一、网络通信

  关于网络通信即通过网络(介质)来进行信息的交换(数据的接收和发送),而需要实现一台终端与另一台终端的通信,首先我们需要找到那台终端,那么我们怎么找到那台终端或者说通过什么找到那台终端进行通信呢?这里就需要IP地址;那通过IP地址找到了那台终端就可以吗?在一台终端上可能运行了许多进程(如QQ、微信、陌陌等用户程序),那么我们怎么才能找到该终端上的需要进行通信的用户程序呢(进程)?这里就需要端口port;

 IP地址:

  IP地址:用来表示网络上的一台终端的,例如:192.168.13.55等,在一个局域网内IP地址具有唯一性;

端口port:

  端口port:端口就像一个房子的房门,一台终端可以同时运行很多应用程序即进程就像房子可以有很多门,而每个门均有其门牌号,而端口也是通过端口号来标记的,端口号只有整数,范围是从0到65535。

  端口可以分为:

    1、知名端口,即众所周知的端口号,其范围为:0--1023;由于一个端口只能标识一个应用程序,故如果一个程序需要使用知名端口的需要有root权限。

    2、动态端口,其范围为:1024--65335。即指当一个系统程序或应用程序程序需要网络通信时,它向主机申请一个端口,主机从可用的端口号中分配一个供它使用,而当这个程序关闭时,该程序所占用端口就会被释放。

之所以称为动态端口,是因为它一般不固定分配某种服务,而是动态分配。

  以上可知,我们知道了目标IP地址和端口号,就可以找到对方的终端以及其终端中需进行通信的进程;那么我们怎么实现通信呢?这里就需要接下来的socket编程。

  在学习socket套接字之前建议大家想看一下这篇博客,关于 基于UDP/TCP协议下的socket套接字的介绍,请点击>>>


二、socket

  1、在学习socket之前我们需要知道我们为什么要学习它?

  可能很多人都听说过C/S架构,即client/server架构(客户端/服务端架构),而C/S架构有硬件C/S架构(打印机),软件C/S架构(如百度网站就是服务端,而我的浏览器就是客户端,当然也有人讲这为B/S架构等);而我们学习socket就是为了实现C/S架构,在一定程度上也可以说为了实现网络通信;

  2、什么是socket?

  其实socket在python中就是其中的一个模块,而具体来说Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。

  

  注:也有人将socket说成ip+port,ip是用来标识互联网中的一台主机的位置,而port是用来标识这台机器上的一个应用程序,ip地址是配置到网卡上的,而port是应用程序开启的,ip与port的绑定就标识了互联网中独一无二的一个应用程序,而程序的pid是同一台机器上不同进程或者线程的标识。

  3、UDP协议下socket的实现

  基于UDP协议下的网络程序的socket发送、接收流程如下:

    

  当然,也可以实现接收和发送:

import socket
def main():
# 1.创建套接字对象
udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) # 2、绑定本地终端及进程的信息
udp_socket.bind(("",7878))
aim_addr=("192.168.11.68",8080) # 目标IP地址和端口号,以元组的形式传入 while True:
#发送
send_content=input("please enter what you want to send:")
if send_content == "exit":
break
udp_socket.send_to(send_content.encode("uft-8"),aim_addr) #接收
recv_data=udp_socket.recvfrom(1024)
recv_content=recv_data[0].decode("gbk")
recv_addr=recv_data[1]
# 4、将解析的数据打印到屏幕上
print("%s send %s to you ."%(recv_addr,recv_content))
# 5、关闭套接字
udp_socket.close() if __name__=="__main__":
main()

基于UDP协议的socket接收和发送

  上述的形式,只能实现必须等发送完了才能进行接收,这是由于其中input和recvfrom均为一种阻塞机制,只有等它们执行完成才会继续执行下一步。故若想实现随时发送,随时接收的功能,则需应用到后面的多进程等知识。故后面再进行补充。

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import socket # 接收信息
def recv_msg(socket_obj):
recv_data=socket_obj.recvfrom(1024)
recv_content =recv_data[0].decode("gbk")
recv_addr =recv_data[1]
print("%s send %s to you ." %(recv_addr,recv_content)) # 发送信息
def send_msg(socket_obj):
desk_ip = input("enter desk IP --》:")
desk_port = input("enter desk port-->:")
send_content=input("enter what you want to send-->:")
socket_obj.sendto(send_content.encode("utf-8"),(desk_ip,int(desk_port))) def main():
"""实现一个简单的聊天器,可以选择发送和接收消息"""
# 1.创建套接字
udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
# 2.绑定本地信息
udp_socket.bind(("",6868))
# 3、接收信息
# 4、发送信息
while True:
print("1.发送信息; 2.接收信息; 0.退出聊天")
choice = input("请选择聊天功能:")
if choice == "":
send_msg(udp_socket)
elif choice == "":
recv_msg(udp_socket)
elif choice == "":
break
else:
print("sorry ,your enter is error..")
# 5、关闭套接字
udp_socket.close() if __name__ =="__main__":
main()

基于UDP协议下利用socket实现简单的聊天器

  上述例子,相当于实现一个简单的传呼机装置,可以选择接收或者发送消息,这里我们将发送消息和接收消息利用函数进行了简单的封装,并且使用if--elif--else语句设定了选择,可以选择性的发送和接收消息。进阶版的UDP聊天器,请点击>>>

  4、基于TCP协议下的socket实现简单的C/S架构

  在学习这部分内容之前,我们肯定在想既然有了前面的UDP协议,那么为什么还要TCP协议呢?即TCP协议相对于UDP协议的好处有哪些呢?这里我们先对TCP协议进行了解。

  TCP协议:

    即传输控制协议,(英语:Transmission Control Protocol,简称TCP;),是一种面向连接的、可靠的、基于字节流的传输层通信协议。

  TCP通信:需要经过创建连接、数据传送、终止连接三个步骤。在TCP通信模型中,在通信开始之前,一定要先建立相关的链接,才能发送数据,类似于生活中--》"打电话""。而UDP类似于生活中的--》“写信”。

  

  接下来我们先看一下简单的基于TCP协议的简单的服务端和客户端的实现上传下载的功能: 

  客户端:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import socket def main():
# 1、创建基于TCP的套接字
client_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 2、链接服务端
server_ip = input("enter server IP--->:")
server_port =input("enter server Port -->:")
server_addr =(server_ip,int(server_port))
# client_socket.connect(("192.168.17.37",6969))
client_socket.connect(server_addr)
# 3、发送接收数据
while True:
file_name = input("enter filename which you want to download-->: ")
client_socket.send(file_name.encode("utf-8"))
recv_data=client_socket.recv(1024)
if len(recv_data)!=0:
with open("[download]"+file_name,"wb") as f:
f.write(recv_data) # 4、关闭套接字
client_socket.close() if __name__=="__main__":
main()

  服务端:

#!/usr/bin/env python
# -*- coding:utf-8 -*- import socket def send_file(server_client):
filename = server_client.recv(1024).decode("gbk")
if filename:
return False
# print(filename, type(filename)) try:
f = open(filename, "rb",)
send_content = f.read()
# print(send_content)
server_client.send(send_content)
except Exception as e:
print(e) return True def main():
# 1、基于TCP创建监听套接字
server_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 2、绑定本地终端地址
server_socket.bind(("",7878))
# 3、监听
server_socket.listen(128) while True:
print("listening...")
# 4、接受,获取客户端地址并且创建服务套接字
server_client_socket,client_addr = server_socket.accept()
print("accepting...")
# 5、接收发送数据
while True:
if not send_file(server_client_socket):
break # 6、关闭套接字
server_client_socket.close()
server_socket.close() if __name__=="__main__":
main()

  Over------------------------------------------------------------》想到了再补充。

第十三篇:socket网络编程的更多相关文章

  1. Python高手之路【十三】socket网络编程

    什么是客户/服务器架构? 什么是客户/服务器架构?不同的人有不同的答案.这要看你问的是什么人,以及指的是软件系统还是硬件系统了.但是,有一点是共通的:服务器是一个软件或硬件,用于提供客户需要的&quo ...

  2. Python基础笔记系列十三:socket网络编程

    本系列教程供个人学习笔记使用,如果您要浏览可能需要其它编程语言基础(如C语言),why?因为我写得烂啊,只有我自己看得懂!!使用python编写一个简易的服务端程序和客户端程序,启动服务端和客户端(监 ...

  3. Java基础篇Socket网络编程中的应用实例

    说到java网络通讯章节的内容,刚入门的学员可能会感到比较头疼,应为Socket通信中一定会伴随有IO流的操作,当然对IO流比较熟练的哥们会觉得这是比较好玩的一章,因为一切都在他们的掌握之中,这样操作 ...

  4. Python之路【第七篇】python基础 之socket网络编程

    本篇文章大部分借鉴 http://www.cnblogs.com/nulige/p/6235531.html python socket  网络编程 一.服务端和客户端 BS架构 (腾讯通软件:ser ...

  5. Socket网络编程-基础篇

    Socket网络编程 网络通讯三要素: IP地址[主机名] 网络中设备的标识 本地回环地址:127.0.0.1 主机名:localhost 端口号 用于标识进程的逻辑地址 有效端口:0~65535 其 ...

  6. 【linux高级程序设计】(第十三章)Linux Socket网络编程基础 2

    BSD Socket网络编程API 创建socket对象 int socket (int __domain, int __type, int __protocol) :成功返回socket文件描述符, ...

  7. Socket网络编程(2)--服务端实现

    中秋了,首先祝大家中秋快乐,闲着无事在家整一个socket的聊天程序,有点仿QQ界面,就是瞎折腾,不知道最后是不是能将所有功能实现. 如果你对socket不了解,请看这篇文章:http://www.c ...

  8. SOCKET网络编程5

    SOCKET网络编程快速上手(二)——细节问题(5)(完结篇) 6.Connect的使用方式 前面提到,connect发生EINTR错误时,是不能重新启动的.那怎么办呢,是关闭套接字还是直接退出进程呢 ...

  9. Socket网络编程--Libev库学习(1)

    这一节是安装篇. Socket网络编程不知不觉已经学了快两个月了.现在是时候找个网络库学学了.搜索了很多关于如何学网络编程的博客和问答.大致都是推荐学一个网络库,至于C++网络库有那么几个,各有各的好 ...

  10. Socket网络编程(TCP/IP/端口/类)和实例

    Socket网络编程(TCP/IP/端口/类)和实例 原文:C# Socket网络编程精华篇 转自:微冷的雨 我们在讲解Socket编程前,先看几个和Socket编程紧密相关的概念: TCP/IP层次 ...

随机推荐

  1. Python - Django - ORM 不常用字段

    BigAutoField(AutoField): bigint 自增列,必须填入参数 primary_key=True 如果没有写自增列,则会自动创建一个列名为 id 的列 SmallIntegerF ...

  2. [ kvm ] 学习笔记 2:虚拟化基础

    1. 虚拟化概念 什么是虚拟化 虚拟化是使用所谓虚拟机管理程序从一台物理机上创建若干个虚拟机的过程.虚拟机的行为和运转方式与物理机一样,但它们会使用物理机的计算资源,如 CPU .内存和存储.虚拟机管 ...

  3. easyui前台改变datagrid某单元格的值

    有时候前台完成某个操作后要修改datagrid的值, 也许这个datagrid是没有保存的, 所以要修改后才能传递到后台; 也许要其他操作过后才需请求后台; 这些情况都需要前台对datagrid的单元 ...

  4. c# .net 查找并安装CA根证书

    https CA根证书 用的是证书指纹来查找. 在用 collection.Find 之前 ,X509Store 一定要打开(Open),否则找到的数量(X509Certificate2Collect ...

  5. 基于TreeSoft实现异构数据同步

    一.为了解决数据同步汇聚,数据分发,数据转换,数据维护等需求,TreeSoft将复杂的网状的同步链路变成了星型数据链路.     TreeSoft作为中间传输载体负责连接各种数据源,为各种异构数据库之 ...

  6. python基础篇(一)

    PYTHON基础篇(一) 变量 赋值 输入,输出和导入 A:输入 B:输出 C:导入 运算符 A:算数运算符 B:比较运算符 C:赋值运算符 D:位运算符 E:逻辑运算符 F:成员运算符 G:身份运算 ...

  7. Mowing the Lawn【线性dp + 单调队列优化】

    题目链接:https://ac.nowcoder.com/acm/contest/2652/G 题目大意:与上一篇博客 烽火传递 差不多. 1.一共n头羊,若超过m头连续的羊在一起,就会集体罢工,每头 ...

  8. smarty中常用的流程控制逻辑

    if else {if $age > 18} <div>年满十八岁!</div> {else if $age > 16} <div>年满十六岁!< ...

  9. eclise -The method onClick(View) of type new View.OnClickListener(){} must override a superclass method 在做arcgis android开发的时候,突然遇到这种错误,The method onClick(View) of type new View.OnClickListener(){} mus

    eclise -The method onClick(View) of type new View.OnClickListener(){} must override a superclass met ...

  10. c语言实现串

    串  (string)是由零个或者多个字符组成的有限序列,又称字符串 一般表示为 S=“ a1 a2 a3 a4  . . . . . an”    其中S 是串名,双引号串起来的是串值,(有些书用单 ...