• Python TCP通信网络编程


    最近在看廖雪峰老师的基础教程(http://www.liaoxuefeng.com/),今天实现了一下简单Python的Socket的网络编程。

          1. Socket网络编程

    Socket是网络编程的一个抽象概念。通常我们用一个Socket表示“打开了一个网络链接”,而打开一个Socket需要知道目标计算机的IP地址和端口号,再指定协议类型即可。

         2. 客户端

    大多数连接都是可靠的TCP连接。创建TCP连接时,主动发起连接的叫客户端,被动响应连接的叫服务器。举个例子,当我们在浏览器中访问新浪时,我们自己的计算机就是客户端,浏览器会主动向新浪的服务器发起连接。如果一切顺利,新浪的服务器接受了我们的连接,一个TCP连接就建立起来的,后面的通信就是发送网页内容了。

          3. 服务器和客户端之间Socket通信

    主要实现了服务器和客户端之间的Socket通信:

         服务器

     服务器进程首先要绑定一个端口并监听来自其他客户端的连接。如果某个客户端连接过来了,服务器就与该客户端建立Socket连接,随后的通信就靠这个Socket连接了。

    所以,服务器会打开固定端口(比如80)监听,每来一个客户端连接,就创建该Socket连接。由于服务器会有大量来自客户端的连接,所以,服务器要能够区分一个Socket连接是和哪个客户端绑定的。一个Socket依赖4项:服务器地址、服务器端口、客户端地址、客户端端口来唯一确定一个Socket。

    但是服务器还需要同时响应多个客户端的请求,所以,每个连接都需要一个新的进程或者新的线程来处理,否则,服务器一次就只能服务一个客户端了。

    (1)引入模块

    1 # -*- coding: utf-8 -*-
    2 """
    3 Created on Mon Mar 28 22:28:29 2016
    4 @author: zhanghc
    5 """
    6 #引入模块
    7 import socket
    8 import threading
    9 import time

    (2)创建socket,并监听端口

    1 #创建socket
    2 s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    3 
    4 #监听端口
    5 s.bind(('127.0.0.1',9999))
    6 s.listen(5)
    7 print 'Waiting for connection...'

    (3)服务器端创建循环,永久监听来自客户端的连接

    1 while True:
    2     
    3     #接受一个新连接
    4     sock,addr=s.accept()
    5     
    6     #创建新线程来处理TCP连接
    7     t=threading.Thread(target=tcplink(sock,addr))

    (4)创建TCP连接函数,每个连接创建一个新线程

     1 def tcplink(sock,addr):
     2     print 'Accept new connection from %s:%s...' % addr
     3     sock.send('Welcome!')
     4     while True:
     5         data=sock.recv(1024)
     6         time.sleep(1)
     7         if data=='exit' or not data:
     8             break
     9         sock.send('Hello,%s!'%data)
    10     sock.close()
    11     print 'Connection from %s:%s closed.'%addr

    客户端程序如下:

     1 # -*- coding: utf-8 -*-
     2 """
     3 Created on Mon Mar 28 22:40:41 2016
     4 
     5 @author: zhanghc
     6 """
     7 
     8 import socket
     9 
    10 s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    11 
    12 s.connect(('127.0.0.1',9999))
    13 
    14 print s.recv(1024)
    15 
    16 for data in ['zhang','liu','wang']:
    17     s.send(data)
    18     print s.recv(1024)
    19 
    20 s.send('exit')
    21 s.close()

    最后,需要启动两个程序,服务器和客户端 来验证,结果如下

  • 相关阅读:
    SPOJ1007 VLATTICE
    hdu 4746Mophues[莫比乌斯反演]
    [Offer收割]编程练习赛13 B.最大子矩阵[枚举]
    [SCOI2011]飞镖[数学模拟]
    2333: [SCOI2011]棘手的操作[离线线段树]
    hdu3507 Print Article[斜率优化dp入门题]
    react 日期
    使用arc进行code review
    css冲突2 要关闭的css在项目代码以外,但是是通过<link>标签引入的css(例如bootstrap):解决方法,在APP.css中使用全局样式
    <svg>标签
  • 原文地址:https://www.cnblogs.com/Haichao-Zhang/p/5331207.html
Copyright © 2020-2023  润新知