码迷,mamicode.com
首页 > 编程语言 > 详细

python之socket模块详解--小白博客

时间:2019-03-23 10:40:27      阅读:705      评论:0      收藏:0      [点我收藏+]

标签:阻塞   info   art   数据   ring   字符   具体流程   有一个   信息   

主要是创建一个服务端,在创建服务端的时候,主要步骤如下:
创建socket对象socket——》绑定IP地址和端口bind——》监听listen——》得到请求accept——》接收请求recv——》发送信息send——》关闭close
客户端代码就是连接服务器,接收和发送消息,具体流程如下:
创建socket对象socket——》connet连接服务器——》获取消息recv——》发送消息send——关闭close

1、服务端代码

#服务器端
import socket
import subprocess
import threading
server = socket.socket()
server.bind((‘‘, 8888))
server.listen(5)
print(等待电话.....)
conn, addr = server.accept()
print(电话来了......)
def recv():
    while True:
        data = conn.recv(10240)
        print(data.decode(utf-8))
def send():
    while True:
        data = input(===>:)
        conn.send(data.encode(utf-8))
t1 = threading.Thread(target=recv)
t2 = threading.Thread(target=send)
t1.start()
t2.start()

2、客户端代码

#客户端
import socket
import threading
client = socket.socket()
client.connect((localhost, 8888))
def send():
    while True:
        info = input(===>:)
        client.send(info.encode(utf-8))
def recv():
    while True:
        data = client.recv(1024)
        print(data.decode(utf-8))

t1 = threading.Thread(target=send)
t2 = threading.Thread(target=recv)
t1.start()
t2.start()

3、 基本描述

在使用socket模块的时候,创建对象一般是使用如下的代码:

s = socket.socket()

在使用默认值的时候,表示创建的是TCP 的socket,地址家族表示为socket.AF_INET,socket类型默认值为socket.SOCK_STREAM表示为TCP的,而UDP的为socket.SOCK_DGRAM,表示为数据包

绑定的代码如下:

s.bind((IP,port)) 

注意在绑定的时候,参数只有一个表示为元组tuple,其中第一个元素为ip地址或者是hostname,第二个参数为port端口号,也就是开始监听哪个IP地址的哪个端口

监听的代码如下:

s.listen(5)
其中的参数为整数,5表示阻塞五个连接,实际上,,经过测试,十几个都没问题,主要是阻塞式的,当有一个连接上的时候,那么其他的都不会连接上,只有在第一个推出的时候,其他的才能进行连接,开始还以为是可以同时连接五个,然后测试下,发现不行,无论是同一个服务器上还是不同的机器上,是不能同时进行连接的,也就是所谓的阻塞式。

被动接受请求的代码如下:

conn,addres = s.accept()
返回的是一个元组,也就是在接受客户端的连接,返回的第一个元素是一个socket对象,可以认为是客户端的socket对象,address表示为客户端的地址,其实这个也就使用和客户端进行通信的。

客户端连接服务器端的代码如下:

s.connect((ip,port))
参数为服务器的IP地址和服务器监听的端口。

发送消息的代码如下

conn.send(‘string is send‘)
conn.sendall(‘send‘)
l两个都是用来发送消息的,区别就是sendall尽量一次发送,而send的话主要看接收能力,如果超出范围的话,那么会进行发送两次进行发送

接收消息的代码如下:

conn.recv(1024)

主要方法是recv方法表示接收消息,最多接收的字节数为1024,那么多余的字符将会在下次接收的过程中进行接收。

 

4、运行客服端和服务端

在运行客户端和服务端代码之后,发现是可以交互的,也就是客户端和服务端进行说话,就想其他的一些交流软件一样,注意,在上述的代码中还存在一些bug

 

python之socket模块详解--小白博客

标签:阻塞   info   art   数据   ring   字符   具体流程   有一个   信息   

原文地址:https://www.cnblogs.com/zhou2019/p/10582688.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!