程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

python網絡編程-socket

編輯:Python

創建TCP套接字

import socket
# 創建tcp套接字 socket.SOCK_STREAM TCP socket.SOCK_DGRAM UDP
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 關閉套接字
s.close()

創建UDP 套接字

import socket
# 創建tcp套接字 socket.SOCK_STREAM TCP socket.SOCK_DGRAM UDP
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 關閉套接字
s.close()

UDP 發送數據

Servers 端

import socket
# 創建tcp套接字
s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
# 准備接收方地址
dest_addr =('192.168.199.101',8080)
# 綁定本地信息 ip一般不寫,表示本機的任何一個地址
local_addr = ('', 8888)
s.bind(local_addr)
send_date = input("請輸入數據")
s.sendto(send_date.encode('utf-8'),dest_addr)
# 關閉套接字
s.close()

Cllient

# -*- coding: UTF-8 -*-
from socket import *
def main():
# 創建套接字
s = socket(AF_INET, SOCK_DGRAM)
# 綁定本地信息 ip一般不寫,表示本機的任何一個地址
local_addr = ('', 8888)
s.bind(local_addr)
# 等待接收方發送數據 recvfrom 沒有數據時會阻塞
recv_data = s.recvfrom(1024) # 1024表示本次接收的最大字節數
# 顯示接收到數據
print(recv_data) # (b'數據', ('127.0.0.1 發送方IP', 8080 端口))
# windows 接收數據使用 gbk解碼 Linu下 使用發送方格式解碼
print(recv_data[0].decode("gbk"))
# 關閉套接字
s.close()
if __name__ == '__main__':
main()

Tcp socket
Clinet

# -*- coding: UTF-8 -*-
from socket import *
def main():
# 創建套接字
tcp_cli_socket = socket(AF_INET, SOCK_STREAM)
# 綁定本地信息
server_ip = ('127.0.0.1', 8888)
# 連接服務器
tcp_cli_socket.connect(server_ip)
# 發送數據
send_data = input("請輸入要發送的數據:")
tcp_cli_socket.send(send_data.encode("gbk"))
# 接收數據
rescv_data = tcp_cli_socket.recv(1024)
print(rescv_data.decode('gbk'))
tcp_cli_socket.close()
if __name__ == '__main__':
main()

Tcp service

# _*_encoding:utf-8 _*_
from socket import *
# tcp 服務器 流程 1. 創建socket 2.bind 綁定ip和端口 3. listen 使套接字變為被動鏈接
# 4.accept 等待客戶端接入 5.recv/send 接收發送數據
def main():
# 創建套接字
tcp_ser_socket = socket(AF_INET, SOCK_STREAM)
# 本地信息
local_addr = ("", 8808)
# 綁定
tcp_ser_socket.bind(local_addr)
# 使用socket的套接字默認屬性是主動的, 使用listen將其變為被動的, 這樣就可以接收別人的連接
tcp_ser_socket.listen(1024)
# 如果新的客戶端來鏈接服務器 ,那麼就產生一個新的套接字,專門為這個用戶服務
# client_socket 某個客戶端服務
client_socket, clientAddr = tcp_ser_socket.accept()
print("---------------")
print("client_socket:{} \n clientAddr:{}".format(client_socket, clientAddr))
print("***************")
# 接收對方發送的數據
recv_data = client_socket.recv(1024)
print("接收到數據:", recv_data.decode('gbk'))
# 發送給客戶端數據
client_socket.send("test from server".encode('gbk'))
# 關閉為這個客戶端分配的套接字
client_socket.close()
tcp_ser_socket.close()
if __name__ == '__main__':
main()

循環 為客戶端服務

# _*_encoding:utf-8 _*_
from socket import *
# tcp 服務器 流程 1. 創建socket 2.bind 綁定ip和端口 3. listen 使套接字變為被動鏈接
# 4.accept 等待客戶端接入 5.recv/send 接收發送數據
def main():
# 創建套接字
tcp_ser_socket = socket(AF_INET, SOCK_STREAM)
# 本地信息
local_addr = ("", 8808)
# 綁定
tcp_ser_socket.bind(local_addr)
# 使用socket的套接字默認屬性是主動的, 使用listen將其變為被動的, 這樣就可以接收別人的連接
tcp_ser_socket.listen(1024)
while True:
# 如果新的客戶端來鏈接服務器 ,那麼就產生一個新的套接字,專門為這個用戶服務
# client_socket 某個客戶端服務
client_socket, clientAddr = tcp_ser_socket.accept()
print("---------------")
print("client_socket:{} \n clientAddr:{}".format(client_socket, clientAddr))
print("***************")
while True: # 為同一個客戶端服務多次
# 接收對方發送的數據
recv_data = client_socket.recv(1024)
print("接收到數據:", recv_data.decode('gbk'))
if recv_data:
# 發送給客戶端數據
client_socket.send("test from server".encode('gbk'))
else:
# 關閉為這個客戶端分配的套接字
break
client_socket.close()
print("---over---")
tcp_ser_socket.close()
if __name__ == '__main__':
main()


加入多線程socket

import socket
import threading
def recv_data(udp_socket):
while True:
data = udp_socket.recvfrom(1024)[0].decode('gbk')
print("\n接收數據:" + data)
def send_data(udp_socket):
while True:
s_data = input("請輸入要發送的數據")
udp_socket.sendto(s_data.encode('gbk'),("127.0.0.1",7890))
def main():
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
udp_socket.bind(("", 7788))
resv_thread = threading.Thread(target=recv_data, args=(udp_socket,))
send_thread = threading.Thread(target=send_data, args=(udp_socket,))
send_thread.start()
resv_thread.start()
if __name__ == '__main__':
main()

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved