Python网络编程

一、实验目的

1.掌握使用TCP/IP来创建客户端和服务器。
2.掌握使用UDP来创建客户端和服务器。

二、实验环境

计算机、Pycharm软件。

三、实验内容与要求

1、在局域网中,两个同学一组利用Pycharm实现TCP/IP(UDP)网络编程。

(1)从客户端输入一个学生的 id 姓名 年龄 分数
(2)将其发送到服务端,由服务端写入到一个文件中
(3)每个信息占一行
(4)数据传输分别使用TCP和UDP套接字完成。

# 客户端
from socket import *

import self as self


class ss(object):
    def __init__(self, name, age, score, id):
        self.name = name
        self.age = age
        self.score = score
        self.id = id

    def __setitem__(self, k, v):
        self.k = v

    def kehu(self):
        h = 0
        # 创建套接字
        s = socket()
        # 服务器连接
        server_addr = ('192.168.225.1', 1234)
        s.connect(server_addr)
        msg = input('客户端发送消息:')
        n = s.send(msg.encode())
        while True:
            # 发送消息
            # data = connfd.recv(1024)
            # msg = input('客户端发送消息:')
            # n = s.send(msg.encode())

            data = s.recv(1024)
            print("来自服务端的消息:", data.decode())
            ss.id = input('请输入id:')
            msg1 = ss.id
            # n = connfd.send(msg1.encode())
            n = s.send(msg1.encode())
            if not msg1:
                break
            ss.name = str(input('亲输入你的名字:'))
            msg2 = ss.name
            # n = connfd.send(msg2.encode())
            n = s.send(msg2.encode())
            if not msg2:
                break
            ss.age = input('请输入age:')
            msg3 = ss.age
            # n = connfd.send(msg3.encode())
            n = s.send(msg3.encode())
            if not msg3:
                break
            ss.score = input('请输入成绩:')
            msg4 = ss.score
            # n = connfd.send(msg4.encode())
            n = s.send(msg4.encode())
            if not msg4:
                break
        s.close()
a=ss
a.kehu(self)



# 服务器端
import socket
h = 0
a = []
# 创建套接字
sockfd = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定地址
sockfd.bind(('192.168.225.1', 1234))
# 队列
sockfd.listen(85)
# 等待连接
print("wait...")
connfd, addr = sockfd.accept()


# 发送,接收消息
# msg = input('服务器发送消息:')
# n = connfd.send(msg.encode())
data = connfd.recv(1024)
print('接收到客户端的消息:', data.decode())
while True:
    msg = input('服务器发送消息:')
    n = connfd.send(msg.encode())
    if not msg:
        break
    f = open('test.txt', 'a')
    # f.write('  姓名  年龄  分数  学号')
    # if not msg:
    #     break
    i = 0
    while True:
        if i >= 4:
            break
        else:
            data = connfd.recv(1024)
            msg = data.decode()
            a.append(msg)
            i = i + 1
    print('id:{0} name:{1} age:{2} score:{3}'.format(a[4 * h + 0], a[4 * h + 1], a[4 * h + 2], a[4 * h + 3]))
    f.write('\n')
    f.write(str('%d. %s    %s     %s     %s' % (h+1, a[4 * h + 0], a[4 * h + 1], a[4 * h + 2], a[4 * h + 3])))
    h = h + 1
    f.close()
sockfd.close()


2、客户端利用pyqt5来实现与服务器端(控制台)的聊天通信。

具体要求如下:
(1)通过pyqt5创建聊天程序客户端,点击设置连接按钮,和服务器端连接,点击发送按钮,将用户名和发送的消息发送给客户端和文本框内显示,服务器端发送的消息,点击接收按钮,在文本框内显示,如下图所示。

在这里插入图片描述

      可以类似,但是不唯一
(2)利用TCP协议建立通信,服务器端控制台来循环接收和输入消息,在控制台输出的消息,显示在客户端界面上。将服务器端和客户端的内容存储在数据库的表中。

#客户端
from PyQt5 import QtWidgets, QtCore
import pymysql
from qq_ import Ui_MainWindow
from socket import *

# 创建套接字
s = socket()

db = pymysql.connect(host='localhost',
                     port=3306,
                     user='root',
                     passwd='qwe151314',
                     database='stu_info',
                     charset='utf8')


class Ui_main(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self):
        super(Ui_main, self).__init__()
        self.setupUi(self)
        self.pushButton.clicked.connect(lambda: {self.cl(), self.stackedWidget.setCurrentIndex(1)})
        self.pushButton_2.clicked.connect(lambda: {QtWidgets.QApplication.quit()})
        self.pushButton_3.clicked.connect(lambda: {self.shot()})
        self.pushButton_4.clicked.connect(lambda: {self.sl(), QtWidgets.QApplication.quit()})
        self.pushButton_5.clicked.connect(lambda: {self.textEdit.clear()})

    def cl(self):
        # 服务器连接
        server_addr = ('192.168.225.1', 1234)
        s.connect(server_addr)
        self.textEdit.append("连接成功!")

    def sl(self):
        s.close()

    def shot(self):
        msg = self.lineEdit.text()
        n = s.send(msg.encode())
        # h = "self.lineEdit_2.text()':'self.lineEdit.text()"
        h = self.lineEdit_2.text()
        self.textEdit.append(h + ":" + msg)
        # 接收
        data = s.recv(1024)
        # print("来自服务端的消息:", data.decode())
        self.textEdit.append("服务端:"+data.decode())
        j = data.decode()
        # 获取游标,创建游标对象
        cur = db.cursor()
        # 数据操作,
        db.ping(reconnect=True)
        # print(data)
        # print(j)
        cur.execute("insert into client values  ('%s','%s');" % (msg, j))
        # cur.execute("insert into client values ('%d','%s','%d','%d');" % (id, name, age, score))
        print(msg)
        # 将修改内容提交到数据库
        db.commit()
        # 关闭游标和数据库连接
        cur.close()
        db.close()


if __name__ == "__main__":
    import sys

    QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)
    # 使窗体按照Qt设计显示
    app = QtWidgets.QApplication(sys.argv)
    window = Ui_main()
    window.show()
sys.exit(app.exec_())



#服务器
# main 服务器端
import socket

# 创建套接字
sockfd = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定地址
sockfd.bind(('192.168.225.1', 1234))
# 队列
sockfd.listen(85)
# 等待连接
print("wait...")
connfd, addr = sockfd.accept()
while True:
    data = connfd.recv(1024)
    # print('接收到客户端的消息:', data.decode())
    if not data:
        break
    if data:
        # msg = input('服务器发送消息:')
        n = connfd.send('合适'.encode())

效果截图

在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Desire..

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值