1. 程式人生 > >python_day26__socket網路程式設計之簡易聊天

python_day26__socket網路程式設計之簡易聊天

   真的是好久沒有寫部落格了,或者說是好久沒有去學python了,可能最近導師和師姐那邊的壓力比較大吧,但是最近看開了,我只要完成你們的任務,我就可以去學我想要學的物件了啊
自己累不累的,也想清楚了,不要在華別人的眼光吧,簡簡單單的做自己就好了,都無所謂的,那麼接下來加油吧,


#Author:'haijing'

#date:2018/10/30
#服務端:在別人的哪裡

import socket #socket是一個介面 ·內部封裝了有關ip地址和埠號的資訊 並且建立ip和埠號

#在socket類中family=AE_INET type=SOCK_STRAM;INET是在ipv4網路下的一個引數;
# SOCK_STRAM 是資料流 建立TCP連線的資料

# SOCK_Dgram 是資料流 建立UDP連線的資料

# family=AE_INET 對應的是ipv4,伺服器之間的通訊 這一句不加有可以,預設就是這樣的
# family=AE_INET6 對應的是ipv6
# family=AE_UNIX Unix不同程序之間的通訊
sk = socket.socket() #建立一個socket物件s 服務端的sk物件和客戶端的sk物件完全是不一樣的

address = ('127.0.0.1',8000) #設定一個元組,元組內放的是ip和埠號
#埠號都是自己任意新增,0-1024都是系統給我們設定的,能用的是1024之後的
#以後用8000以後就好了

sk.bind(address) #繫結ip和埠號,bind方法後跟的必須是一個元組


sk.listen(3) #3表示服務端最多和三個客戶端同時建立通訊,但是傳送資訊的話只能是一個一個的來

print('waiting...')
conn,addr = sk.accept() #等待客戶端來連線服務端 sk.accept是一個元組,裡面有兩個內容,分別用conn和addr來盛
#conn拿到的是一個客戶端的socket物件,addr是建立連線的client.py的ip地址和埠號等資訊
# print(conn)#(<socket.socket fd=504, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 8000), raddr=('127.0.0.1', 52686)>, ('127.0.0.1', 52686))

#conn中封裝了建立的socket資訊
#以上只是準備的資訊,還並沒有進行通訊

#接下就是進行服務端和客戶端之間進行通訊
#客戶端先發送第一條訊息
# server下的方法:bind() listen() accept() recv()收 send()發的是一個位元組 sendall()發,一次發不乾淨多次發
#client下的方法:connect()

#只要建立好連線之後,誰先發送都沒有問題,關鍵是要一發一收 *****
#server端發
inp = input('>>>')
inp_server = bytes(inp,'utf8') #在python3中傳送的值一定是bytes型別,在python2中沒有此問題
conn.send(inp_server) #第33行 對應client.py下第十一行的接收函式data=sk.recv()

#server端收
data = conn.recv(1024) #sk是server端自己的sk,真正與客戶端進行通訊的物件是conn這個物件
#而且不可能只有一個客戶端,所以手法資料都是通過conn找到對應的客戶端進行通訊的
#sk只是用於進行服務端和客戶端之間進行連線用的
data = str(data,'utf8') #將bytes型別轉換為字串型別,同時支援漢字
print(data)


#Author:'haijing'
#date:2018/11/7

#服務端:在別人的哪裡
#必須線開啟server端

import socket #socket是一個介面 ·內部封裝了有關ip地址和埠號的資訊 並且建立ip和埠號

sk = socket.socket() #建立一個socket物件s 服務端的sk物件和客戶端的sk物件完全是不一樣的
address = ('127.0.0.1',8000) #設定一個元組,元組內放的是ip和埠號:8000
sk.bind(address) #繫結ip和埠號,bind方法後跟的必須是一個元組
sk.listen(3) #3表示服務端最多和三個客戶端同時建立通訊,但是傳送資訊的話只能是一個一個的來
print('waiting...')
conn,addr = sk.accept() #等待,同時建立物件conn

while 1:
#min收
data = conn.recv(1024) #sk是server端自己的sk,真正與客戶端進行通訊的物件是conn這個物件
data = str(data,'utf8') #將bytes型別轉換為字串型別,同時支援漢字
# if not data: break #如果接收到對方發是空子節,那麼同時結束對話
if not data:
conn, addr = sk.accept() #如果對方退出了,則server端可以在這裡另外接受新的網友
continue #繼續去判斷while迴圈的條件是否成立
print(data)

#min發 收了之後,便阻塞在這裡,一直到傳送過去
inp = input('>>>')
inp_server = bytes(inp,'utf8') #在python3中傳送的值一定是bytes型別,在python2中沒有此問題
conn.send(inp_server) #第33行 對應client.py下第十一行的接收函式data=sk.recv()

haijing in HZ miss you

2018.11.07 晚