文章目录
一、实验目的
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())
效果截图