Python socket programming TCP and UDP

Socket on the server side (TCP)

import sys
import socket

ip_port=('127.0.0.1',9999) #获取IP和端口
sk=socket.socket() #创建一个服务器端的socket对象
sk.bind(ip_port) #socket与IP端口绑定
sk.listen(5) #设定socket为监听状态
print('服务器端的socket进入监听状态...')
conn,addr=sk.accept() #等待客户端连接,conn为连接后的对象,addr为客户端的ip和端口
client_data=conn.recv(1024) #接收客户端的数据,数据量最大为1024字节
print(client_data.decode('utf-8')) #解码收到的数据内容
conn.send('我是服务器端发送的数据'.encode('utf-8')) #向客户端发送数据
conn.close() #关闭连接

Client socket (TCP)

import socket

ip_port=('127.0.0.1',9999) #服务器端的ip和端口
sk=socket.socket() #生成socket对象
sk.connect(ip_port) #连接服务器
sk.send('我是客户端发送的数据'.encode('utf-8')) #向服务器端发送数据
server_reply=sk.recv(1024) #接收服务器端的数据,最大不超过1024字节
print(server_reply.decode('utf-8')) #解码收到的数据
sk.close() #关闭连接

Socket on the server side (UDP)

from socket import *
from time import ctime

HOST='' #服务器短的ip,这里不填默认为本机
PORT=1200 #端口号
BUFSIZ=128 #接收数据的最大字节数
ADDR=(HOST,PORT) #将ip和端口放在一起

sk=socket(AF_INET,SOCK_DGRAM) #AF_INET,SOCK_DGRAM表示用UDP协议,用socket.socket()创建的为TCP协议
sk.bind(ADDR) #绑定服务器ip和端口
print('服务器端进入监听状态。。。')
data,addr=sk.recvfrom(BUFSIZ) #接收客户端的数据,data为客户端的数据,addr为客户端的ip端口
print(data.decode('utf-8')) #解码客户端发来的数据
sk.sendto(b'%s %s[%s]' %('这是服务器端发送的数据'.encode('utf-8'),ctime().encode('utf-8'),data),addr)
#'这是服务器端发送的数据'.encode('utf-8') 表示要发的数据,ctime().encode('utf-8') 表示当前时间,data表示收到客户端的数据

sk.close()

Client socket (UDP)

from socket import *

HOST='localhost' #服务器端的ip,这里默认为本机ip
PORT=1200 #端口号
BUFSIZ=128 #发送数据的最大字节数
ADDR=(HOST,PORT) #将ip和端口放在一起

sk=socket(AF_INET,SOCK_DGRAM)
data=input('>') #输入要向服务器发送的内容
sk.sendto(data.encode('utf-8'),ADDR) #向服务器发送数据
data,ADDR=sk.recvfrom(BUFSIZ) #接收服务器的数据
print(data.decode('utf-8')) #解析收到的数据
sk.close()

Server side loop connection

import socket

HOST='127.0.0.1' #服务器的ip和端口
PORT=8085

sk=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #创建socket,socket.SOCK_STREAM表示用TCP协议,也可以不写,默认TCP;如果更换为SOCK_DGRAM,表示用UDP协议
sk.bind((HOST,PORT)) #绑定服务器的ip和端口
sk.listen(1) #开始监听,listen中的参数表示可以多少客户端进行连接
while 1:
    print('服务器开始监听')
    conn,addr=sk.accept() #conn为连接对象,addr为客户端的ip
    print('已连接的客户端:',addr)
    while 1:
        try:
            conn.settimeout(10) #10秒内未收到数据抛出异常
            data=conn.recv(1024) #接收客户端的数据
            print('客户端:',data.decode('utf-8')) #解码客户端发来的数据
            if data.decode('utf-8').strip()=='bye':
                break
            conn.sendall('服务器:已收到数据'.encode('utf-8'))
        except socket.timeout:
            conn.close()
            print('服务器长时间未接受到数据,连接已断开')
            break
        except Exception:
            conn.close()
            print('连接异常,已断开连接')
            break
    conn.close()
        

Client sends data cyclically

import sys
import socket

HOST='127.0.0.1' #服务器端ip和端口
PORT=8085

sk=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #创建socket
sk.connect((HOST,PORT)) #连接服务器
while 1:
    cmd=input('请输入要发给服务器的数据:') #输入要发送的数据
    sk.sendall(cmd.encode('utf-8')) #将数据发送给服务器
    if cmd=='bye':
        break
    data=sk.recv(1024) #接收服务器发来的数据
    print(data.decode('utf-8')) #解码数据
sk.close()

Guess you like

Origin blog.csdn.net/weixin_44123630/article/details/113196928