代码改变世界

Socket编程学习笔记

2017-05-27 15:09  核桃不是桃  阅读(384)  评论(0)    收藏  举报

什么是TCP/IP、UDP?

TCP/IP(Transmission Control Protocol/Internet Protocol)也就是传输控制协议/网间协议,是一个工业标准的协议集,它是为广域网WANs设计的。

UDP(User Data Protocol, 用户数据报协议)是与TCP相对应的协议。是与TCP相对应的协议。属于TCP/IP协议族中的一种。其关系如下图所示:

TCP/IP协议族包含运输层、网络层、链路层。

Socket在哪里?

一图胜千言:

Socket是什么呢?

Socket是应用层和TCP/IP协议族通信的中间软件抽象层,扮演一个中间人的角色。

简单说,它是一组接口,在设计模式种,Socket其实就是一个门面模式,将复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合制定的协议。

Socket就是为了方便搞网络编程的。但凡搞网络编程,就少不了和Socket打交道,因此了解Socket编程的工作原理,就显得很有必要。

如上图所示,服务器端先初始化Socket,然后与端口绑定(bind()),对端口进行监听(listen()),调用accept()方法阻塞,等待客户端连接。

此时,如果有一个客户端初始化一个Socket,然后通过connect()方法连接到服务器,如果连接成功,就建立了一个连接。服务器端接受并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束。

在python中,用Socket创建一个TCP服务器,需要使用socket()函数。代码如下图所示:

#_*_coding:utf-8_*_
__author__ = 'hetao'
__date__ = '2017/5/27 14:44'

from socket import *

HOST = ''
PORT = 21567
ADDR = (HOST, PORT)
BUFSIZ = 1024

tcp_server = socket(AF_INET, SOCK_STREAM)
tcp_server.bind(ADDR)
tcp_server.listen(5)

while True:
    print 'waiting for connection'
    tcp_client, addr = tcp_server.accept()
    print '...connected from:', addr

    while True:
        data = tcp_client.recv(BUFSIZ)
        if not data:
            break
        tcp_client.send('im server,hello client!')

    tcp_client.close()
tcp_server.close()

然后我写了一个简单的客户端程序:

#_*_coding:utf-8_*_
__author__ = 'hetao'
__date__ = '2017/5/27 14:54'

from socket import *

HOST = 'localhost'
PORT = 21567
BUFSIZ = 1024
ADDR = (HOST, PORT)

tcp_client = socket(AF_INET, SOCK_STREAM)
tcp_client.connect(ADDR)

while True:
    data = raw_input('>')
    if not data:
        break
    tcp_client.send(data)
    data = tcp_client.recv(BUFSIZ)
    if not data:
        break
    print data

tcp_client.close()

运行后测试通过,发现正如上图所示。