实现不同PC之间的进程通信
使用Python的socket包实现了不同PC间通信,要求是处于同一个局域网下(即同一个手机热点可以相互ping通)
首先是服务端代码:
#如果要实现不同PC通信,需要修改下方ip为本机ip(客户端也要改),并且使用热点在同一局域网下可以相互ping通,端口号可以换个不常用的
from socket import *
import tkinter as tk
import tkinter.scrolledtext as tst
import time
import tkinter.messagebox
import threading
class Application(tk.Frame):
def __init__(self, master):
tk.Frame.__init__(self, master)
self.grid()
self.createWidgets()
def createWidgets(self): # 聊天窗口
self.textEdit = tst.ScrolledText(self, width=80, height=25)
self.textEdit.grid(row=0, column=0, rowspan=1, columnspan=4)
self.textEdit.tag_config('server', foreground='green') # 字体颜色
self.textEdit.tag_config('guest', foreground='blue')
# 编辑窗口
self.inputText = tk.Text(self, width=60, height=10)
self.inputText.grid(row=1, column=0, columnspan=1)
self.inputText.bind("<KeyPress-Return>", self.textSendReturn)
# 车即可发送消息
self.btnSend = tk.Button(self, text='发送', command=self.textSend)
self.btnSend.grid(row=1, column=3)
t = threading.Thread(target=self.getInfo)
t.start()
def textSend(self):
str = self.inputText.get('1.0', 'end-1c')
if str != "":
timemsg = ' 服 务 端 ' + time.strftime('%Y-%m-%d%H:%M:%S', time.localtime()) + '\n'
self.textEdit.config(state='normal')
self.textEdit.insert(tk.END, timemsg, 'server')
self.textEdit.insert(tk.END, str + '\n')
self.textEdit.see(tk.END)
self.textEdit.config(state='disabled')
self.inputText.delete(0.0, tk.END) # 删除输入哈尔滨工业大学(威海) 《python 程序设计》实验报告
sendMessage = bytes(str, encoding='utf8') # 发送到服务端
connectionSocket.send(sendMessage)
def getInfo(self):
while True:
recMsg = connectionSocket.recv(1024).decode("utf-8") + '\n'
revTime = ' 客 户 端 ' + time.strftime('%Y-%m-%d%H:%M:%S', time.localtime()) + '\n'
self.textEdit.config(state='normal')
self.textEdit.insert(tk.END, revTime, 'guest')
self.textEdit.insert(tk.END, recMsg)
self.textEdit.see(tk.END)
self.textEdit.config(state='disabled')
def textSendReturn(self, event):
if event.keysym == "Return":
self.textSend()
root=tk.Tk()
root.title('服务器窗口')
serverPort=6666
serverSocket=socket(AF_INET,SOCK_STREAM)
serverSocket.bind(('192.168.184.22',serverPort))
serverSocket.listen(1)
print('等待连接....')
connectionSocket,addr=serverSocket.accept()
print('连接成功')
app=Application(master=root)
app.mainloop()
然后是客户端代码:
import socket
import sys
# 创建一个socket套接字
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 与对应的ip地址端口号建立连接
s.connect(('192.168.184.22', 6666))
while True:
#发送数据:
try:
data = input("客户端:")
s.send(data.encode())
buf = s.recv(1024).decode()
if buf != 'exit':
print("服务端: " + buf)
except:
print("Dialogue Over")
s.close()
sys.exit(0)
下面是运行截图
个人思考
首先程序使用了Python语言中的Socket包来实现了不同PC之间的通信,要求是两台PC处于同一个局域网下可以相互ping通(比如连同一个手机热点_(:з」∠)_)
在Socket编程下,服务端要实现的正确顺序是
socket()
bind()
listen()
accept()
read()/write()
close()
在服务端成功开启后,打开客户端,实现两个PC间的通信。
要注意的是,将代码中的ip地址改为服务端PC的ip地址,端口号选择一个不常用的端口号,两边相同即可。