美高梅娱乐4858.com首先年

互联网未是一律层层的电话线

每当2006年, Senator Ted Stevens做了一个互联网历史上,著名的平等差演讲:

“The internet is not something that you just dump something on. It’s
not a big truck. It’s a series of tubes”

当自己先是浅下互联网的是:1995年,我于高等学校之电脑实验室中,我之所以Netscape浏览器上网,当时漫无目的的瞎逛。

本身当下想:每次连上一个网站,就生有“真实的连日”,就比如电话线。我深奇,当自身老是看一个初的网站的时用花费稍微钱?(作者就觉得,每次看网站都是成立于同样漫长通信线路之上,就像电话线,需要拉线)不会见有人找上门,让自己交这些线路的支出吧?

当,这个想法现在羁押起老愚蠢。

相了高山,就清楚努力的势头

本身思念,我师父就是自个儿眼中的小山,我尽力的大方向。《代码大全》中生出句话,是如此说的:

当一个初家或进阶者,这并从未呀错。当一个生出力量的程序员而不是负责人,这为没有错。真正的荒谬是,当您懂哪些去增强时,仍然选择做一样称作新家。

本身充分肯定这句话。同时,我找到同样份新的做事,工作环境好好,干为止自己之活着,可以举行和好之工作。所以,我运动及了进阶的道。因为只要非算是12月(离职,找工作,休息),从1月至5月自我形容了47首文章(有无数胡竽充数的)。

1.
为提高自己之英语水平,我开翻文章,我翻译的首先首稿子,用了一个礼拜:

  • 《什么是当真的程序员》

2. 下手写有物(还有不少不足)

  • 爬虫
  • holleworld网站(用tornado框架,未完成)

    美高梅娱乐4858.com 1

3. 上为主的纱知识

  • HTTP真的怪简短

  • 什么是web框架?

  • HTTP
    Header详解(转载)

  • HTTP
    状态代码表示什么意思?

  • 网游中之大网编程系列

4. 咬牙每天以github上push

美高梅娱乐4858.com 2

5. 看书,逛github

  • 我的书单

  • 我做的github月刊

日渐的万事变的好起来,文章有人看了,有人点赞了,有人品了。几乎都是鞭策的话,还有通过博客园的平台认识了不少长辈。在与她们之交流着,学会了十分东西,感谢。

自家依然走以进阶的征途及,要效仿的事物还有多,我深信:不积跬步,无以至千里!,坚持做。我偶尔听到一篇歌唱,分享给大家:其一岁数

检测断开连接

咱们什么样检测断开连接?

假如一个接连于一定为接收数据包,那么断开连接就可以定义为非接收数据包。

以考察我们从未受数据包,服务器和客户端两止还精打细算:从达到亦然坏收取至数据包的始,到下一个收到及数据包的时日。(也就是是所谓的‘超时时间’)

每次只要我们接至数据包,就重置计时器(’超时时间’清零)。如果计时器超过设定的值,侧接连‘超时’,我们即便是断开连接(不再限制连接客户端的IP和端口)。

立马也是一律种植优雅的方法因此来拍卖,第二个客户端请求都成立连接的服务器的情状。建立从接连的服务器不见面接来自其它客户端的数据包,所以亚单客户端接收不顶服务器响应的数据包,所以亚独客户端连接超时并处于断开连接的状态。

找个‘老司机’

后我哪怕因为编程新手,走来校园,步入职场了,求职的经过:学渣的心酸(求职篇)。最终,我好幸运,找到了单实在的‘老司机’,我的大师。

生只‘老驾驶员’的最主要,我思念大家都懂。跟着自己师父的即时段时日,我开了见识:

  • 艺及:我意识linux原来是如此玩的、代理、代码原来要这么形容、代码规范、git工作流、HTTP是呀破、MVVM、Mysql。

  • 外:Mac、机械键盘、VPS、看英文文档而不是百度、英语的重大、做程序员而非是码农,死亡连环问、提问的技巧、自己招来答案的历程得的可比别人给的如多之几近。

  • 书:《python核心编程》,《图解HTTP》。

每日自己便想一个饿汉一样疯狂之修各种知识,那段时间今回想起来,真的自我师父对自家用心良苦,每次自我师父被我安排的任务都是再度三合计,力求我在好这个职责的进程,能增长自身之力。正如,我点说:我问问我师父问题,一般得无顶一直的答案,我师父会帮自己理清思路,从而自己找到答案。

只是,故事之结局总是悲剧的,因为及时自无限年轻气盛,并不知道我师父的用心良苦,也不克明了自己师父为什么连年拿自之问题转化为其他的题材,让自身逮狂(因为及时自我之技能确实十分不同,很多编程基础都非知道,导致未能够了解自己师父的语句——死亡连环问)。同时,因为自己想出来看,四单月后自己离职了。

随即四个月被,我几无写博客,很不满自己师父教我之这些东西,并没记录在博客中。我师父是我具体中之编程启蒙先生,他未只有使为本人技术。我师父总是说一样句子话:我是当使得而解决问题之章程(技巧)。我师父对自我发生知遇之恩(我当即菜之抠脚),当时自家都非敢给我师父为‘师父’,我还望而生畏人家无乐意当我这有些菜鸟的大师傅,后来深受多矣自身怀念我师父也不怕信服了咔嚓(哈哈哈,强行拜师)。说了这般多,都发出硌想自己师父了。

直车手的根本,不言而喻,同样的理,找到有共同爱好,志同道合的伙伴,也堪有助于提高。

博客园中相见对的伴的概率很怪!老司机也不在少数!

目录

  1. 网游中的网编程系列1:UDP vs.
    TCP
  2. 网游中的纱编程2:发送和接收数据包
  3. 网游中的网编程3:在UDP上立虚拟连接
  4. TODO

最后

扣押了马上篇文章的看官们,或许会感觉有些失望,没有呀葵花宝典,没有什么了不起的履历。又或者听到我分享我之那篇歌,回一下和好的编程过程,是否唏嘘不已?

长辈的程序员曾告知我:“你所处的此时大好,自己想套什么就好效仿,但是我们那时候公司称什么就要去举行什么,当年的工薪还格外没有。现在开源之物那么多,交流这么便利,网上资源也格外多。学起来差不多方便啊!”

一经没有动力学编程,推荐提早入:Mac和同等管500上述的教条键盘,花钱多?你坑我?不不不,到时刻你会惦记:“投了如此多钱,还敢于不出彩学啊?”(欢迎入坑!!Mac会提高你的编程效率,严肃脸)

博客园对自吧早已是不行缺失的一个阳台,它整体的笔录自己之编程过程,正像自己的博客名写的同等:

美高梅娱乐4858.com 3

老二、在UDP上立虚拟连接

全总开头难

自之率先篇稿子:博客的第一天,我还读了同全勤,发现有无数错别字,也未曾什么排版。我也就未转了,保持“原汁原味”。看罢这篇稿子,我仍然会感受及,当时本身写下就篇博客的情怀,我思念及时即是:写博客的一个便宜有,就同照片一样,会记录下就之场面。对自身来说文字或会重复‘生动’一些,我得从自家之字里行间,回忆起不少东西。

每当博客园始发勾画博客,也是自个儿运动及编程道路的启,当时大四,啥都非会见,我想初学编程的都经历了‘剃牦牛’的历程(布置开发环境、安装软件、配置)。这段时间是大痛之,我还记得这学python,在windows下编程,输出中文我折腾了一个夜晚。现在纪念起来,我嘴角挂于了微笑。腿上拓宽正雷同按起图书馆借的《笨方法学python》,找着书写上一点点底由,运行,报错,调试,再报错!

赶上其他问题,我哪怕百度瞬间,后来意识众多python问题,都是超越反到一个曰廖雪峰网站。所以,我‘拜了’我的率先单编程启蒙先生廖雪峰——廖先生,我跟廖老师学的git,知道了Github。并将我上过程中形容的代码有,都置身Github上面:笨方法学python。我将《笨方法学python》所有代码都敲诈了单(没有稍微),我于是了一个月的年华!《笨方法学python》这本开,不摆任何代码背后的事物和高等特性,都是有大概的代码有,就是以让您拟会用,跑起就是吓了。我看罢就本开,感觉温馨要什么还不见面!但是,最起码我能被程序走起了,哈哈哈。

初,在廖先生的python教程,我委没看明白好也?什么面向函数式编程,面向对象,多线程,生成器。。。不知所云。起初,我独自学会了一个高级特性,就是‘切片’。就屁颠屁颠地失去写爬虫了:新手写爬虫全经过(已成功),整个经过用了同样天。我作为止马上篇博客,发现有人被自家评论了!自家五月份,写了全方位一个月的博客,没有同长达评论,有人交流之发的确非常好,会给你更有动力去形容博客!所以,呼吁大家多评论,留言(当然,我马上点召开的啊不好。。。低头扣手)

新兴,因为新入编程的小圈子,一切都是神秘之,不知所措的。别人建议程序员一定要是会见linux(同时自发现招聘中的技巧要求啊大都还要回linux),我就夺学:今天安了麒麟系统。然后,跟着慕课网的Tony先生的视频一步步继做,有的上边打游戏(推荐劳逸结合)还放正tony先生的视频当做相声听。

五、六月为止了,我以博客园刻画下了27首文章,都是些没有什么技术含量的章,我之定论就是是:就是描摹!没人看也勾勒!同时,我当博客园中的园友都是坏友善的,因为我勾勒的小白文章,都没人嘲讽,大家知道:谁还是这样过来的(或者是无意间打字嘲讽)

python实现

或者引进看,英文原稿中之源代码

在押了理论有,下面我就是就此python根据上述原理实现:我勾勒的UDP上落实虚拟连接只开了少码事:每次只能有一个socket和server进行通信;如果以一段时间无数按照传输,则取消掉原来的接连,允许建立新的接连。

流淌:下面代码中多细节无拍卖,仅供大家参考。

  • protocol id:我打算就此时间戳hash一个字符串
  • 监测断开连接:通过settimeout()方法,捕获socket.timeout异常

test_server.py

#!/usr/bin/env python
# -*- coding:utf-8 -*-
#
#   Author  :   XueWeiHan
#   E-mail  :   595666367@qq.com
#   Date    :   16/5/11 下午3:54
#   Desc    :   server

import socket
import time

UDP_IP = ''
UDP_PORT = 5000
_ID = []  # 存储建立连接的protocol_id
_IP = None  # 存储建立连接的IP和端口
TIME_OUT = 2  # 超时时间(s)

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind((UDP_IP, UDP_PORT))
sock.settimeout(TIME_OUT)

def check_protocol_id(protocol_id, _ID):
    '''
    检测protocol_id
    '''
    if _ID:
        if protocol_id in _ID:
            return True
        else:
            return False
    else:
        _ID.append(protocol_id)
        return True

print '准备接收内容。'
while 1:
    try:
        response = ''
        data, addr = sock.recvfrom(1024)  # 缓冲区大小为1024bytes
        protocol_id, data = data.split('|')
        if _IP:
            if _IP == addr:
                response = '建立连接'
                print '从{ip}:{port},接收到内容:{data}'.format(ip=addr[0],
                                                               port=addr[1], data=data)
            else:
                response = '无法建立连接'
        else:
            if check_protocol_id(protocol_id, _ID):
                _IP = addr
                response = '建立连接'
                print '从{ip}:{port},接收到内容:{data}'.format(ip=addr[0],
                                                               port=addr[1], data=data)
            else:
                response = '无法建立连接'
        # 返回响应数据包给客户端
        sock.sendto(response, addr)
    except socket.timeout:
        print '连接超时,注销连接,其他socket可以连入'
        _IP = None
        _ID = []

test_client.py

#!/usr/bin/env python
# -*- coding:utf-8 -*-
#
#   Author  :   XueWeiHan
#   E-mail  :   595666367@qq.com
#   Date    :   16/5/11 下午3:54
#   Desc    :   client
import socket
import time
import hashlib

UDP_IP = ''
UDP_PORT = 5000
MESSAGE = 'Hello, world!'
TIME_OUT = 3

print 'UDP 目标IP:', UDP_IP
print 'UDP 目标端口:', UDP_PORT
print '发送的内容:', MESSAGE

class Udp(object):
    def __init__(self):
        self.socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        self.server_addr = None
        # 设置超时时间
        self.socket.settimeout(TIME_OUT)

    @property
    def protocol_id(self):
        hash = hashlib.md5(str(time.time()) + 'xueweihan')
        return hash.hexdigest()

    def send_mesaage(self):
        # 这里只简单用|分割protocol_id和发送内容
        message = self.protocol_id +'|'+ MESSAGE
        self.socket.sendto(message, (UDP_IP, UDP_PORT))

    def get_message(self):
        data, addr = self.socket.recvfrom(1024)
        if self.server_addr:
            # 客户端也只接收建立连接的服务端的数据包
            if self.server_addr == addr:
                return data
            else:
                return None
        else:
            self.server_addr = addr
            return data

s1 = Udp()
for i in range(2):
    try:
        s1.send_mesaage()
        print s1.get_message()
    except socket.timeout:
        print '连接超时'
        # 清除原来建立连接的数据
        s1.server_addr = None        

s2 = Udp()
for i in range(2):
# 此时是无法建立连接的,因为上一个连接还没有销毁
    try:
        s2.send_mesaage()
        print s2.get_message()
    except socket.timeout:
        print '连接超时'
        # 清除原来建立连接的数据
        s2.server_addr = None

# 暂停2秒,等待服务器注销上一次的连接
time.sleep(2)
s3 = Udp()
for i in range(2):
# 此时是可以建立连接的,因为上面连接以超时
    try:
        s3.send_mesaage()
        print s3.get_message()
    except socket.timeout:
        print '连接超时'
        # 清除原来建立连接的数据
        s3.server_addr = None

上面代码还有多相差之地方(TODO:超时,部分发生题目),所以就供参考。所有代码都于github直达,代码运行效果如下:
美高梅娱乐4858.com 4

前言

到来博客园一律年整治了,也是自身走及编程道路的同年。这同样年里,我开始学编程,从高校毕业,工作,写博客。转眼也一样年了,打算写个小结,总结下者里面的涉以及收获。

美高梅娱乐4858.com 5

今天,打开编辑器,看正在闪动着的光标,思绪就回去一年前,大四时分的下。

介绍

UDP是凭连接的,一个UDPsocket可以给用做,与自由数量的微机交换数据包。然而,在差不多口游玩被,我们一味望当平略部分建立于连年的测算中,交换数据包。

据此,我们用做的第一步就是是:在UDP上为个别雅电脑,建立从虚拟连接。

然而,首先,我们先深入到脚,弄明白互联网是如何做事之。

检测连续

当今咱们要一个反省连续的法子。

自我们可开片错综复杂的抓手,此过程用发送和接收多个UDP数据包。或许客户端‘请求连接’数据包,发送服务器,服务器响应返回给客户端‘连接接受’,或者一旦客户端请求和,已经跟其余客户端起于连年的服务器,建立连接,则服务器就见面回去给客户端‘忙碌中’。

要,我们可被服务器检查接收到的首先只数据包的protocol
id是否对,然后考虑是不是建连接。

客户端假定与服务器建立由接连,然后给服务器发送数据包。当服务器接受到客户端发来的率先个数据包,就记下该客户端的IP地址及端口号,最后,返回响应数据包。

客户端就亮服务器的地方和端口。所以,当客户端接受数据包,客户端会了滤掉任何不是服务器地址的要。同样,服务器收到到客户端的首先单数据包,通过recvfrom计,能收获到客户端的IP地址和端口。所以服务器也得以忽略不自指定客户端的其他数据包。

咱们得采取是简单之法,因为咱们只需要在点滴玉电脑之间成立连接。在后面的篇章被,我们见面提升我们的连系统,用于支持有限单以上的微处理器连,并且使连接更加强壮。

(就是与特定ip地址与端口的电脑进行传输数据)

未曾直接的连接

互联中:没有一样长条通信电缆,直接通信的个别台计算机。数据是由IP协议,通过数据包,从一个个处理器传递过来的。(就比如传纸条)

一个数包或由此几个计算机才能够到目的地。你切莫能够知道确切之传递过程(第一步,第二步。。。),这个历程是碰头生成之,是因网质量控制数据包的生一样步走向。你恐怕发送了简单独数据包A和B到跟一个地点,它们或者走的凡差的路子。这个也是数据包无序的一个由。

在Linux和Unix系统上(win可以用‘tracert’),可以使‘traceroute’指令来查看数据包的传递线路及路的主机名以及IP地址。traceroute请参考

试一下traceroute指令:

traceroute: Warning: baidu.com has multiple addresses; using 220.181.57.217
traceroute to baidu.com (220.181.57.217), 64 hops max, 52 byte packets
 1  192.168.1.1 (192.168.1.1)  4.727 ms  4.960 ms  4.144 ms
 2  223.20.160.1 (223.20.160.1)  13.405 ms  6.047 ms  8.561 ms
 3  218.241.252.185 (218.241.252.185)  4.735 ms  2.130 ms  7.771 ms
 4  218.241.252.197 (218.241.252.197)  6.849 ms  5.335 ms  4.555 ms
 5  202.99.1.217 (202.99.1.217)  4.025 ms  13.324 ms  3.761 ms
 6  * 218.241.244.21 (218.241.244.21)  8.492 ms
    218.241.244.9 (218.241.244.9)  5.389 ms
 7  218.241.244.33 (218.241.244.33)  6.699 ms  4.851 ms  5.386 ms
 8  * * *

专注:第八实行是因起ICMP防火墙,请求于驳回了,所以无探测出目的ip地址。

这进程就是能够诠释:没有一直的连接。

虚拟连接

兹回去连接的话题上。

要是你下TCP
socket,你了解其是面向连接的,看起像一个‘连接’。但是TCP是建立于IP协议上之,而IP协议只是数目包在微机中传递(并没连接的概念),所以TCP的连天概念一定是:虚拟连接。

而TCP可以建立更IP上树虚拟的总是,那么我们呢能够在UDP上落实虚拟连接。

让咱们定义虚拟连接:两高计算机中传输UDP数据包以固定的速度,如每秒10独包。只要数据包传输流畅,我们虽看:两个计算机建立从了虚拟连接。

连接分为两有些:

  • 监听计算机连入,我们遂这计算机为‘服务器’。
  • 经IP地址和端口连接服务器的微处理器,我们成‘客户端’。

俺们管场景设定为(先设定简单的现象,一点点来):不论何时,我们特同意一个客户端连接服务器。同时,我们如果服务器的IP地址不变换,客户端是一直连接服务器。后面的文章再说支持多只客户端连接的事例等,现在先现实我们限定标准下,简单的杜撰连接,这样可另行好的了解虚拟连接。

协议id

UDP是任连接的,UDP socket会收任意计算机发来之数据包。

咱俩拿范围:服务器就于客户端接收数据包,客户端只吃服务器发送数据包(一对一)。我们不能够经过地方过滤数据包,因为服务器无掌握客户端的地址(python中socket可以由此recvfrom方法赢得地方)。所以我们在每个UDP数据包加一个‘头信息’,由32员protocol
id组成:

[uint protocol id]
(packet data...)

protocol id只是有唯一的数字。如果数据包的protocol
id不可知配合我们的protocol id,数据包就是被忽视。如果protocol
id匹配,我们虽接收packet data。

汝只是待选择唯一的数字,可以为此hash你的一日游名字以及磋商版本数字。你吗可以据此外消息作protocol
id,需要确保protocol id的唯一性,因为此protocol
id是咱们连协议的根底。

怎接纳数据包

正如首先首文章,举的可怜简单的事例:收到数据包,就如于一个房,人们手递手传纸条。

互联网是网的纱(网络的汇聚)。当然我们不光以一个稍房子被传递信件,我们能够把她传到世界各地。

顶好的例证是邮局系统!

当您想使发作一样查封信为人家,你要将您的信放到邮箱中,同时你见面相信会到达收件人的眼前。信件怎么到之,你不待关爱,反正到了。总得有人把你的迷信送及目的地,那么究竟是怎送及之也?

率先,邮递员不会见用在您的信奉,直接送至目的地!邮递员将在公的笃信,送至地头邮局,让邮局处理。

倘若立即封信是地面的,本地的邮局会完结过来,安排让另外一个邮递员直接送至目的地。但是,如果信的地方不是地方的,那么当地的邮局不见面直接把信教送及目的地,所以邮局会送至直达一级(镇邮局送及贾邮电局),或者送至临近城市的邮局,如果目的地太远就会送至飞机场。信件的传输方式是因此异常卡车。

咱俩来拘禁一个事例:假定一封信,从洛杉矶依托到都,本地邮局接收到迷信,然后发现是国际信件,就直接送至洛杉矶底邮件中心。这封信,确认收件的地点无误,就配备至下一样次飞机飞往北京底航班。

飞机着陆在北京市,北京的邮件系统肯定是和洛杉矶之邮件系统不等同。北京之邮件中心接到这封信后,就送至实际的区级的本土邮局,最终,这封信会通过一个邮递员直接送至收件人之手里。

即如邮局系统,通过地方传递信件一样。网络传递数据包是通过IP地址。传递数据包之底细和路线选择是非常复杂的,但是基本思想:每个路由器都是均等尊微机,由路由表决定数据下同样步走之地址。(这有些自我大概了有的路由和路由表的局部,我从不扣留明白,后面研究清楚,回来再添全。现在莫影响后面的翻阅)

编辑路由表的行事是网络管理员的行事,不是我们这些程序员关心的题材(还好)。但是,如果你想询问又多关于这点的学问,可以省下面这些文章:

  • ars
    technica:讲网络如何交换数据包和传导的细节
  • routing
    tables
  • border gateway
    protocol

总结

这些就是成立虚拟连接的经过:建立连接,过滤不是自连接的处理器的数据包,检查断开连接,设定过。

咱的建立之连接和另外TCP连接一样,稳定之UDP数据包传输是大半人动作游戏的基本功。

目前为止,已经当UDP上起虚拟的总是,你就是可使用它来进行多人数游玩被之,client/server模式下之数传,来替代TCP。

发表评论

电子邮件地址不会被公开。 必填项已用*标注