python 멀 티 채 팅 서버 및 클 라 이언 트 구현
사용 하 는 python 지식 포인트:
네트워크 프로 그래 밍:socket
다 중 스 레 드:threading
그래 픽 프로 그래 밍:tkinter
먼저 클 라 이언 트 가 연결 할 수 있 도록 서버 를 모 의 해 야 합 니 다.여기 서 순환 을 사용 하고 서비스 구역 이 계속 열 린 상태 에 있 도록 해 야 합 니 다.
그 다음 에 다 중 스 레 드 를 사용 해 야 합 니 다.다 중 스 레 드 가 변 수 를 공유 하고 동시에 실행 할 수 있 기 때 문 입 니 다.그렇지 않 으 면 서버 는 하나의 클 라 이언 트 만 연결 할 수 있 습 니 다.
다음은 먼저 코드 를 첨부 한 후에 어떻게 조작 하 는 지 설명 합 니 다.
첫 번 째 py 파일-서버
import tkinter
import socket, threading
win = tkinter.Tk() #
win.title(' ')
win.geometry("400x400+200+20")
users = {}# ,
def run(ck, ca):
userName = ck.recv(1024)# 1k byte
users[userName.decode("utf-8")] = ck#
#print(users)
printStr = "" + userName.decode("utf-8") + "
"#
text.insert(tkinter.INSERT, printStr)
while True:
rData = ck.recv(1024)# 1k byte
dataStr = rData.decode("utf-8")
infolist = dataStr.split(":")#
users[infolist[0]].send((userName.decode("utf-8") + " " + infolist[1]).encode("utf"))
#
def start():
ipStr = eip.get()# ip
portStr = eport.get()# , ( 8080,9876, )
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)#socked ipv4 ipv6,
server.bind((ipStr, int(portStr)))# ip !!!1: str int
#2:bind()
server.listen(10)# ,
printStr = "
"#,
text.insert(tkinter.INSERT, printStr)#
while True:#
ck, ca = server.accept()#
# ca ip ,ck
t = threading.Thread(target=run, args=(ck, ca))#
# Thread
t.start()#
def startSever():
s = threading.Thread(target=start)#
s.start()#
#
labelIp = tkinter.Label(win, text='ip').grid(row=0, column=0)
labelPort = tkinter.Label(win, text='port').grid(row=1, column=0)
eip = tkinter.Variable()
eport = tkinter.Variable()
entryIp = tkinter.Entry(win, textvariable=eip).grid(row=0, column=1)
entryPort = tkinter.Entry(win, textvariable=eport).grid(row=1, column=1)
button = tkinter.Button(win, text=" ", command=startSever).grid(row=2, column=0)
text = tkinter.Text(win, height=5, width=30)
labeltext = tkinter.Label(win, text=' ').grid(row=3, column=0)
text.grid(row=3, column=1)
win.mainloop()
두 번 째 py 파일---클 라 이언 트
import tkinter
import socket
import threading
win = tkinter.Tk()
win.title(" 2")
win.geometry("400x400+200+20")
ck = None#
def getInfo():
while True:
data = ck.recv(1024)#
text.insert(tkinter.INSERT, data.decode("utf-8"))#
def connectServer():
global ck
ipStr = eip.get()
portStr = eport.get()
userStr = euser.get()
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)#socked ipv4 ipv6,
client.connect((ipStr, int(portStr)))# ip !!!1: str int
#2:bind()
client.send(userStr.encode("utf-8"))
ck = client
t = threading.Thread(target=getInfo)
t.start()
def sendMail():
friend = efriend.get()
sendStr = esend.get()
sendStr = friend + ":" + sendStr
ck.send(sendStr.encode("utf-8"))
#
labelUse = tkinter.Label(win, text="userName").grid(row=0, column=0)
euser = tkinter.Variable()
entryUser = tkinter.Entry(win, textvariable=euser).grid(row=0, column=1)
labelIp = tkinter.Label(win, text="ip").grid(row=1, column=0)
eip = tkinter.Variable()
entryIp = tkinter.Entry(win, textvariable=eip).grid(row=1, column=1)
labelPort = tkinter.Label(win, text="port").grid(row=2, column=0)
eport = tkinter.Variable()
entryPort = tkinter.Entry(win, textvariable=eport).grid(row=2, column=1)
button = tkinter.Button(win, text=" ", command=connectServer).grid(row=3, column=0)
text = tkinter.Text(win, height=5, width=30)
labeltext= tkinter.Label(win, text=" ").grid(row=4, column=0)
text.grid(row=4, column=1)
esend = tkinter.Variable()
labelesend = tkinter.Label(win, text=" ").grid(row=5, column=0)
entrySend = tkinter.Entry(win, textvariable=esend).grid(row=5, column=1)
efriend = tkinter.Variable()
labelefriend= tkinter.Label(win, text=" ").grid(row=6, column=0)
entryFriend = tkinter.Entry(win, textvariable=efriend).grid(row=6, column=1)
button2 = tkinter.Button(win, text=" ", command=sendMail).grid(row=7, column=0)
win.mainloop()
이 클 라 이언 트 는 여러 개 일 수 있 습 니 다.즉,두 번 째 py 파일 을 몇 점 복사 하여 각각 다른 파일 에 저장 하 는 것 입 니 다.여기 주의:pycharm 에서 한 항목 에서 여 는 것 이 좋 습 니 다.
1:첫 번 째 파일 을 sever.py 라 고 명명 하고 sever.py 파일 을 실행 하면 나타 납 니 다.
그 중 첫 번 째 줄 은 호스트 의 ipv 4 주 소 를 표시 합 니 다.window 를 사용 하면 모 르 는 것 은 cmd 를 열 고 ipconfig 를 입력 하면 ipv 4 주 소 를 볼 수 있 습 니 다.
두 번 째 줄 은 포트 를 나타 내 는데 여 기 는 좀 큰 8080 또는 9876 등 을 사용 하 는 것 이 좋 습 니 다.그렇지 않 으 면 포트 점용 상황 이 발생 할 것 입 니 다.여 기 는 제 가 9876 을 사용 하 겠 습 니 다.
마지막 으로 앞의 두 줄 을 입력 한 후 시작 을 누 르 십시오.
2.두 번 째 파일 을 여러 번 복사 하여 각각 01.py,02.py 라 고 명명 하고 01.py 파일 을 실행 합 니 다.
이 첫 줄 에 입력 한 것 은 사용자 이름 입 니 다.임의의 문자 일 수 있 습 니 다.
두 번 째 줄 은 연결 할 서버 의 ip 입 니 다.
세 번 째 줄 은 포트 입 니 다.첫 번 째 그림 에 적 힌 포트 가 일치 하도록 주의 하 십시오.
그리고 시동 을 누 르 세 요.
그리고 02.py 를 실행 하고 01.py 의 동작 을 반복 하지만 사용자 이름 이 같 을 수 없 음 을 주의 하 십시오.이 ip 와 포트 번 호 는 같 습 니 다.
더 많은 클 라 이언 트 를 연결 하고 싶다 면 0.3.py 를 실행 하고 02.py 를 반복 할 수 있 습 니 다.
3.여기 서 01.py 와 02.py 를 만 들 고 0.1.py 의 userName 을 123,02.py 의 userName 을 456 으로 가정 하고 ip 와 포트 번호 와 sever.py 의 ip 와 포트 번호 가 같다 고 가정 한 다음 에 두 사람의 채 팅 을 조작 할 수 있 습 니 다.
01.py 실행 후 인터페이스 입력 열기
그리고 발송 을 클릭 합 니 다.
그리고 02.py 가 실 행 된 화면 을 열 면 아래 가 나 옵 니 다.
이렇게 하면 python 으로 여러 사람의 채 팅 서버 와 클 라 이언 트(도형 화 인터페이스)를 모 의 하 는 목 표를 실현 했다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
로마 숫자를 정수로 또는 그 반대로 변환그 중 하나는 로마 숫자를 정수로 변환하는 함수를 만드는 것이었고 두 번째는 그 반대를 수행하는 함수를 만드는 것이었습니다. 문자만 포함합니다'I', 'V', 'X', 'L', 'C', 'D', 'M' ; 문자열이 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.