实现不同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()

image-20211109144907263

然后是客户端代码:

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)

下面是运行截图

img

img

个人思考

首先程序使用了Python语言中的Socket包来实现了不同PC之间的通信,要求是两台PC处于同一个局域网下可以相互ping通(比如连同一个手机热点_(:з」∠)_)

在Socket编程下,服务端要实现的正确顺序是

socket()
bind()
listen()
accept()
read()/write()
close()

在服务端成功开启后,打开客户端,实现两个PC间的通信。

要注意的是,将代码中的ip地址改为服务端PC的ip地址,端口号选择一个不常用的端口号,两边相同即可。


一只古灵古灵的精怪