socket通訊
server端
import os
from socket import socket
import hashlib
def chat(connect: socket, address):
while True:
message = input('>>>')
# 9、傳送訊息使用send,傳送的內容需要使用encode函式將字串轉換成bytes型資料
connect.send(message.encode())
if message in ['拜拜', '再見', 'Bye-Bye']:
return
# 10、接受資料
re_message = connect.recv(1024).decode(encoding='utf-8')
# address是一個列表,第一個元素是訊息源ip地址,第二個是埠號
print(f'{address[0]}:{re_message}')
if re_message in ['拜拜', '再見', 'Bye-Bye']:
return
def send_image(connect: socket):
# 獲取資料夾中所有圖片的名稱(列表形式存貯)
all_image_name = os.listdir('./serverImage')
message = ''
for index, item in enumerate(all_image_name):
message += f'{index}.{item} '
# 傳送圖片資訊
connect.send(message.encode())
# 接受客戶端的選擇
index = connect.recv(1024).decode(encoding='utf-8')
try:
if 0 <= int(index) < len(all_image_name):
image_name = all_image_name[int(index)]
print('傳送圖片...')
with open('serverImage/'+image_name, 'rb') as f:
image_content = f.read()
# 生成圖片的摘要
hash = hashlib.md5()
hash.update(image_content)
digest = hash.hexdigest()
# 傳送摘要
connect.send(digest.encode())
# 傳送圖片
connect.send(image_content)
else:
print('取消圖片傳送')
except ValueError:
print('取消圖片傳送')
def create_server():
# 1、建立套接字物件
server = socket()
# 2、服務端繫結Ip地址和埠號
server.bind(('10.7.165.86', 4568))
# 3、監聽請求,其中的200為最大通訊的數量
server.listen(200)
# 4、等待客戶端的連線
while True:
print('等待.....')
# 5、接受客戶端的請求-這句話會阻塞執行緒,直到有客戶端的請求才會執行
connect, address = server.accept()
# 建立連線後的操作
while True:
# 6、接受訊息,接收到的訊息都是二進位制(bytes),需要使用decode轉換成字串型別資料
message = connect.recv(1024).decode(encoding='utf-8')
# 7、功能選擇
if message == 'chat':
print('聊天')
chat(connect, address)
elif message == 'image':
print('發圖片')
send_image(connect)
elif message == 'close':
# 8、斷開伺服器的連線
connect.close()
break
if __name__ == '__main__':
create_server()
# int('hj')
client端
import re
from socket import socket
import hashlib
import uuid
def get_digest(data):
hash = hashlib.md5()
hash.update(data)
return hash.hexdigest()
def chat(client):
# 告訴伺服器現在要聊天
client.send('chat'.encode(encoding='utf-8'))
while True:
re_message = client.recv(1024).decode(encoding='utf-8')
print('伺服器:'+re_message)
if re_message in ['拜拜', '再見', 'Bye-Bye']:
return
message = input('客戶端:')
client.send(message.encode())
if message in ['拜拜', '再見', 'Bye-Bye']:
return
def get_image(client):
# 告訴伺服器現在要拿圖
client.send('image'.encode(encoding='utf-8'))
# 接受圖片資訊
image_message = client.recv(1024).decode(encoding='utf-8')
print(image_message+'')
index = input('請選擇(輸入標號,如果不需要輸入其他值):')
# 傳送選擇的圖片的標號
client.send(index.encode())
# 根據選擇判斷是否需要接受圖片
all_index = re.findall(r'\b(\d+)\.', image_message)
if index in all_index:
print('接受圖片')
# 接受圖片摘要
digest = client.recv(1024).decode(encoding='utf-8')
# 接受圖片
image_data = bytes()
while True:
image_data += client.recv(2048)
if get_digest(image_data) == digest:
print('圖片接受完成')
with open('clientImage/'+uuid.uuid4().hex, 'wb') as f:
f.write(image_data)
break
else:
print('不接受圖片')
def close_connection(client):
# 告訴伺服器關閉連線
client.send('close'.encode(encoding='utf-8'))
client.close()
exit()
def create_client():
client = socket()
client.connect(('10.7.165.86', 4568))
while True:
print('1. 聊天\n2. 獲取圖片\n3. 斷開連線')
value = input('請選擇(1~3):')
if value == '1':
# print('聊天')
chat(client)
elif value == '2':
# print('獲取圖片')
get_image(client)
elif value == '3':
print('斷開連線')
close_connection(client)
else:
print('輸入有誤!')
if __name__ == '__main__':
create_client()
# message = '0.avatar.png 1.icon2.png 2.tie2.png 3.luffy1.png '
# print(re.findall(r'\b(\d+)\.', message))
# print(uuid.uuid4().hex)
相關文章
- Android Socket 通訊Android
- socket.IO通訊
- 程式間通訊(Socket)
- socket通訊的建立
- 簡單的Socket通訊
- socket.io通訊原理
- Android Socket連線,使用Socket進行通訊(Android)Android
- koa-socket即時通訊
- 溫故之.NET Socket通訊
- socket 完成簡單的通訊
- Linux學習/TCP Socket通訊LinuxTCP
- Socket.IO IM通訊元件元件
- Fanuc Socket Message通訊第一講
- 網路程式設計-Socket通訊程式設計
- Java基礎(Socket通訊和NIO)Java
- Socket搭建即時通訊伺服器伺服器
- 14.8 Socket 一收一發通訊
- Java 和 Python 之間的 Socket 通訊JavaPython
- Java的Socket通訊簡單例項Java單例
- 手把手教你 Socket 通訊(TCP/IP)TCP
- 【Spring Boot】整合Netty Socket.IO通訊框架Spring BootNetty框架
- 在 Laravel 中使用 Workerman 進行 socket 通訊Laravel
- IO建立Socket通訊中慎用BufferReader中的readLine()
- JAVA - 基於Socket的多執行緒通訊Java執行緒
- c#實現最簡單的socket通訊C#
- Android Wifi熱點 資料傳輸Socket 通訊AndroidWiFi
- 什麼時候採用socket通訊,什麼時候採用http通訊HTTP
- Thinking in Java--使用NIO實現非阻塞Socket通訊ThinkingJava
- C# 實現socket通訊程式(伺服器端)C#伺服器
- java socket 通訊socketServer 服務端多執行緒JavaServer服務端執行緒
- Windows Socket程式設計精華《TCP通訊伺服器》Windows程式設計TCP伺服器
- SOCKET通訊中TCP、UDP資料包大小的確定TCPUDP
- JS實時通訊三把斧系列之二: socket.ioJS
- USB共享網路:android手機通過USB與Ubuntu進行socket網路通訊AndroidUbuntu
- 跨平臺socket通訊系統橋接技術的討論橋接
- C# 簡單的聊天大廳功能及原始碼(socket通訊)C#原始碼
- Socket最簡單的客戶端與服務端通訊-Java客戶端服務端Java
- 玩轉 PHP 網路程式設計全套之 unix 本地域 socket 通訊PHP程式設計