Socket教程

Socket教程

1.概述

Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口,把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。

Socket教程

2.Socket

1.

3.socket聊天室代码

1.socket server代码的步骤一般如下

Socket教程

2.服务器端口

1.服务器首先初始化好socket

2.绑定这个socket服务器运行的ip地址和端口

3.监听这个服务器

4.等待socket连接,这个步骤会一直阻塞,直到有socket链接进来

5.当连接成功之后,服务器就可以读取客户端发送的socket消息

6.服务器可以选择给客户端回传socket消息

7.服务器关闭socket

3.客户端

1.客户端初始化socket

2.客户端去和服务器建立链接

3.客户端向服务器发送数据

4.客户端等待服务器相应数据

5.客户端关系socket

4.按照上述描述,python代码(伪)书写应该如下

ss = socket() 
ss.bind() 
ss.listen() 
inf_loop:
	  cs = ss.accept() 
	  comm_loop:
	      cs.recv()/cs.send() 
	      cs.close()
	  ss.close()

2.python socket库基础知识

1.要创建套接字,必须使用 socket.socket()函数,它一般的语法如下。 socket(socket_family, socket_type, protocol=0)。socket.socket是new出来socket套接字对象,但是通信的运输层有tcp或者upd来通信. 网络层有ip协议来传输和本地[非网络的 AF_LOCAL/AF_UNIX]套接字来传输数据。所以我们需要配置socket_family和socket_type

1.socket_family
1.AF_INET表示使用ipv4协议来传输
2.AF_UNIX表示使用非网络的套接字来传输
2.socket_type
1.SOCK_STREAM 表示tcp协议
2.SOCK_DGRAM 表示使用upd协议来连接
3.综合
所以说 tcpSock = socket(AF_INET, SOCK_STREAM)表示使用ip和tcp来进行通信

2.s.bind(): 将地址(主机名、端口号对)绑定到套接字上

3.ss.listen():

设置并启动 TCP 监听器

4.ss.accept():

被动接受 TCP 客户端连接,一直等待直到连接到达(阻塞)

5.s.recv():

接受socket消息,请注意 上面的方法是接受连接

6.s.send():

发送 TCP 消息

7.s.close():

关闭套接字

3.服务器/客户端实际代码v1(简单的流程演示):

1.服务器代码:

tcp_ip_socket/socket_chat/v1/server.py

  import socket

	bind_address = ("0.0.0.0",19527)
	
	#申明
	ss = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
	#绑定地址和监听
	ss.bind(bind_address)
	ss.listen()
	#获取客户端socket和地址
	cli,addr = ss.accept()
	#获取tcp消息 一次1kb
	msg = cli.recv(1024)
	print(msg)
	#回送消息
	cli.send(b'get')
	ss.close()

2.客户端代码

tcp_ip_socket/socket_chat/v1/client.py

	import socket
	send_address = ("0.0.0.0",19527)
	cli = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
	#直接连接
	cli.connect(send_address)
	#发送数据
	cli.send(b'teset')
	#接受数据
	msg = cli.recv(1024)
	print(msg)
	cli.close()

4.服务器/客户端代码(更有交互性的代码)

1.说明: 这次的代码,让服务器和客户端更有交互性,客户端输入消息后,服务器返回消息

2.代码:

tcp_ip_socket/socket_chat/v2/server.py

import socket

ss_address = ("0.0.0.0",19534)
ss = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
ss.bind(ss_address)
ss.listen(2)
while True:
    #获取连接
    cli,addr = ss.accept()
    print('收到来自ip为{}的连接'.format(addr))
    #在连接的时候,进入循环
    while True:
        # 接受消息
        data = cli.recv(1024)
        if not data:
            break
        re_msg = "收到你的消息{}".format(data.decode('utf8'))
        cli.send(re_msg.encode('utf8'))
    cli.close()

tcp_ip_socket/socket_chat/v2/client.py

import socket

ss_address = ("0.0.0.0",19534)
ss = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
ss.bind(ss_address)
ss.listen(2)
while True:
    #获取连接
    cli,addr = ss.accept()
    print('收到来自ip为{}的连接'.format(addr))
    #在连接的时候,进入循环
    while True:
        # 接受消息
        data = cli.recv(1024)
        if not data:
            break
        re_msg = "收到你的消息{}".format(data.decode('utf8'))
        cli.send(re_msg.encode('utf8'))
    cli.close()

5.客户端接受http请求,并且返回http代码

1.说明: 我们在获取http代码的时候,获取http代码的库文件,或者浏览器底层,就是用了socket来获取http报文,我们可以模拟底层的报文请求方式,来深一步的了解http报文结构

2.代码:

tcp_ip_socket/socket_chat/v5/server.py

import socket
import threading

def cli_msg(cli,addr):
    print('收到来自ip为{}的连接'.format(addr))
    #在连接的时候,进入循环
    while True:
        # 接受消息
        data = cli.recv(1024)
        if not data:
            break
        re_msg = "收到你的消息{}".format(data.decode('utf8'))
        cli.send(re_msg.encode('utf8'))
    cli.close()
    return True

ss_address = ("0.0.0.0",19534)
ss = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
ss.bind(ss_address)
ss.listen(2)


while True:
    #获取连接
    cli,addr = ss.accept()
    threading.Thread(target=cli_msg,args=(cli,addr)).start()

tcp_ip_socket/socket_chat/v5/client.py

import socket

ss_address = ("0.0.0.0",19534)

ss = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

ss.connect(ss_address)

while True:
    data = input('请输入消息:')
    if not data:
        break
    ss.send(data.encode('utf8'))
    print(ss.recv(1024).decode('utf8'))


ss.close()