vmware linux问题 写一个程序
1、服务器端进程建立 DeviceRecode.txt文件,等待客户端的请求,接收数据,并写入客户端传来的信息。
2、客户端进程运行时,提示“请输入学号和姓名:,等待用户输入学号和姓名,输入的信息发送给服务器,提示“请输入设备号:”等待用户输入设备号,输入的设备号发送给服务器;然后提示“请输入设备名称:”,等待用户输入设备名称,输入的设备名称发送给服务器,然后提示“请输入参数:”,等待用户输入参数,输入的参数发送给服务器。服务器接收信息后写入DeviceRecode.txt文件,同时发送接收到的信息给客户端,客户端显示接收的信息。
3、系统采用进程互斥的方式添加信息,防止接收的信息发生错位的现象。
该回答引用ChatGPT
还请尝试下面代码
服务器端代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <pthread.h>
#define MAX_BUF_SIZE 1024
char device_file[] = "DeviceRecord.txt";
pthread_mutex_t mutex;
void *handle_client(void *client_fd_ptr) {
int client_fd = *((int*)client_fd_ptr);
char buffer[MAX_BUF_SIZE];
int n;
memset(buffer, 0, MAX_BUF_SIZE);
n = read(client_fd, buffer, MAX_BUF_SIZE-1);
if (n < 0) {
perror("Error reading from socket");
close(client_fd);
return NULL;
}
printf("Received data from client: %s\n", buffer);
pthread_mutex_lock(&mutex);
FILE *fp;
fp = fopen(device_file, "a");
if (fp != NULL) {
fprintf(fp, "%s\n", buffer);
fclose(fp);
} else {
printf("Failed to open file %s\n", device_file);
}
pthread_mutex_unlock(&mutex);
n = write(client_fd, buffer, strlen(buffer));
if (n < 0) {
perror("Error writing to socket");
close(client_fd);
return NULL;
}
close(client_fd);
return NULL;
}
int main(int argc, char *argv[]) {
int sockfd, newsockfd, portno;
socklen_t clilen;
struct sockaddr_in serv_addr, cli_addr;
pthread_t thread_id;
if (argc < 2) {
printf("Usage: %s port\n", argv[0]);
exit(1);
}
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) {
perror("Error opening socket");
exit(1);
}
memset((char*)&serv_addr, 0, sizeof(serv_addr));
portno = atoi(argv[1]);
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY;
serv_addr.sin_port = htons(portno);
if (bind(sockfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) < 0) {
perror("Error on binding");
exit(1);
}
listen(sockfd, 5);
printf("Server started, waiting for clients...\n");
while (1) {
clilen = sizeof(cli_addr);
newsockfd = accept(sockfd, (struct sockaddr*)&cli_addr, &clilen);
if (newsockfd < 0) {
perror("Error on accept");
continue;
}
pthread_create(&thread_id, NULL, handle_client, (void*)&newsockfd);
}
close(sockfd);
return 0;
}
客户端代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#define PORT 8888
#define BUF_SIZE 1024
int main() {
int client_socket;
struct sockaddr_in server_addr;
char buf[BUF_SIZE];
char stu_num[50], name[50], device_num[50], device_name[50], param[50];
// 创建套接字对象
if ((client_socket = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
perror("socket");
exit(EXIT_FAILURE);
}
// 设置服务器地址信息
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(PORT);
server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
memset(server_addr.sin_zero, 0, sizeof(server_addr.sin_zero));
// 连接服务器
if (connect(client_socket, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) {
perror("connect");
exit(EXIT_FAILURE);
}
// 循环输入学号、姓名、设备号、设备名称、参数
while (1) {
printf("请输入学号:");
scanf("%s", stu_num);
printf("请输入姓名:");
scanf("%s", name);
printf("请输入设备号:");
scanf("%s", device_num);
printf("请输入设备名称:");
scanf("%s", device_name);
printf("请输入参数:");
scanf("%s", param);
// 将输入的信息打包成字符串
snprintf(buf, BUF_SIZE, "%s %s %s %s %s", stu_num, name, device_num, device_name, param);
// 发送数据到服务器
if (send(client_socket, buf, strlen(buf), 0) == -1) {
perror("send");
exit(EXIT_FAILURE);
}
// 接收服务器返回的数据并打印
if (recv(client_socket, buf, BUF_SIZE, 0) == -1) {
perror("recv");
exit(EXIT_FAILURE);
}
printf("接收到的信息:%s\n", buf);
}
// 关闭套接字
close(client_socket);
return 0;
}
server端:
import socket
import threading
# 服务器地址和端口
SERVER_ADDRESS = ('0.0.0.0', 8888)
# 设备记录文件路径
DEVICE_RECORD_FILE = 'DeviceRecode.txt'
# 定义全局锁
lock = threading.Lock()
# 处理客户端请求的线程函数
def handle_client(client_socket):
# 接收客户端的学号和姓名
student_id = client_socket.recv(1024).decode()
client_socket.send(f"学号和姓名:{student_id}".encode())
# 接收客户端的设备号
device_id = client_socket.recv(1024).decode()
client_socket.send(f"设备号:{device_id}".encode())
# 接收客户端的设备名称
device_name = client_socket.recv(1024).decode()
client_socket.send(f"设备名称:{device_name}".encode())
# 接收客户端的参数
parameter = client_socket.recv(1024).decode()
client_socket.send(f"参数:{parameter}".encode())
# 构造设备记录字符串
device_record = f"{student_id},{device_id},{device_name},{parameter}"
# 加锁,避免多个线程同时写入文件导致错位
with lock:
with open(DEVICE_RECORD_FILE, 'a') as f:
f.write(device_record + '\n')
# 发送回客户端
client_socket.send(f"已接收:{device_record}".encode())
# 关闭客户端连接
client_socket.close()
# 服务器主函数
def main():
# 创建服务器套接字
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定服务器地址和端口
server_socket.bind(SERVER_ADDRESS)
# 监听客户端连接
server_socket.listen(5)
print(f"服务器已启动,地址:{SERVER_ADDRESS[0]},端口:{SERVER_ADDRESS[1]}")
while True:
# 等待客户端连接
client_socket, client_address = server_socket.accept()
# 开启一个线程处理客户端请求
t = threading.Thread(target=handle_client, args=(client_socket,))
t.start()
if __name__ == '__main__':
main()
client端:
import socket
# 创建一个客户端socket对象
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 服务器IP地址和端口号
server_address = ('192.168.1.100', 8000)
# 连接服务器
client_socket.connect(server_address)
# 等待用户输入学号和姓名
stu_num = input("请输入学号:")
stu_name = input("请输入姓名:")
# 发送学号和姓名给服务器
client_socket.sendall(bytes(stu_num + ',' + stu_name, encoding='utf-8'))
# 接收服务器返回的数据并打印
recv_data = client_socket.recv(1024).decode('utf-8')
print("收到服务器返回的数据:", recv_data)
# 等待用户输入设备号、设备名称和参数
dev_num = input("请输入设备号:")
dev_name = input("请输入设备名称:")
dev_param = input("请输入参数:")
# 发送设备信息给服务器
client_socket.sendall(bytes(dev_num + ',' + dev_name + ',' + dev_param, encoding='utf-8'))
# 接收服务器返回的数据并打印
recv_data = client_socket.recv(1024).decode('utf-8')
print("收到服务器返回的数据:", recv_data)
# 关闭客户端socket
client_socket.close()
以下是一个基于socket和进程互斥的方式实现上述需求的示例程序。这个程序使用Python编写,可以在Linux系统上运行,并假定客户端和服务器端在同一台机器上运行。
import socket
import threading
mutex = threading.Lock()
filename = "DeviceRecord.txt"
def handle_client(client_socket):
# receive student info
student_info = client_socket.recv(1024).decode()
student_id, student_name = student_info.split(",")
# receive device info
device_id = client_socket.recv(1024).decode()
device_name = client_socket.recv(1024).decode()
parameter = client_socket.recv(1024).decode()
# write to file
with mutex:
with open(filename, "a") as f:
f.write(f"{student_id},{student_name},{device_id},{device_name},{parameter}\n")
# send response back to client
response = f"Received: {student_id}, {student_name}, {device_id}, {device_name}, {parameter}"
client_socket.send(response.encode())
# close socket
client_socket.close()
def main():
# create socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(("127.0.0.1", 8888))
server_socket.listen(5)
while True:
# accept connection
client_socket, address = server_socket.accept()
# handle client request in a new thread
t = threading.Thread(target=handle_client, args=(client_socket,))
t.start()
if __name__ == "__main__":
main()
client.py
import socket
def main():
# create socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# connect to server
server_address = ("127.0.0.1", 8888)
client_socket.connect(server_address)
# receive student info
student_id = input("请输入学号:")
student_name = input("请输入姓名:")
student_info = f"{student_id},{student_name}"
client_socket.send(student_info.encode())
# receive device info
device_id = input("请输入设备号:")
device_name = input("请输入设备名称:")
parameter = input("请输入参数:")
client_socket.send(device_id.encode())
client_socket.send(device_name.encode())
client_socket.send(parameter.encode())
# receive response from server
response = client_socket.recv(1024).decode()
print(response)
# close socket
client_socket.close()
if __name__ == "__main__":
main()
在运行这个程序之前,你需要在Linux上安装Python环境,并且将以上代码保存到两个不同的文件中,例如server.py和client.py。在终端中进入这些文件所在的目录,分别运行python server.py和python client.py即可。注意,需要先运行服务器程序再运行客户端程序。
如果对您有帮助,请给与采纳,谢谢。
这个问题的核心在于互斥,不要被同时修改。
其他的功能还好说。
不知道你希望什么语言来处理?
以下是一个简单的基于Python的解决方案,它使用了socket编程库和线程锁(thread lock)来实现进程互斥:
服务器端程序:
import socket
import threading
# 创建线程锁
lock = threading.Lock()
# 创建服务器套接字
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 监听端口号
port = 12345
server_socket.bind(('localhost', port))
# 等待客户端连接
server_socket.listen(1)
print("等待客户端连接...")
# 创建记录设备信息的文件
with open('DeviceRecord.txt', 'w') as f:
f.write('学号\t姓名\t设备号\t设备名称\t参数\n')
# 处理客户端请求的函数
def handle_request(conn):
# 获取客户端的学号和姓名
conn.sendall(b"请输入学号和姓名(用空格分隔):")
student_info = conn.recv(1024).decode().strip().split()
student_id, student_name = student_info[0], student_info[1]
# 获取客户端的设备信息
conn.sendall(b"请输入设备号:")
device_id = conn.recv(1024).decode().strip()
conn.sendall(b"请输入设备名称:")
device_name = conn.recv(1024).decode().strip()
conn.sendall(b"请输入参数:")
parameter = conn.recv(1024).decode().strip()
# 将设备信息写入文件
with lock:
with open('DeviceRecord.txt', 'a') as f:
f.write(f'{student_id}\t{student_name}\t{device_id}\t{device_name}\t{parameter}\n')
# 发送响应给客户端
response = f'成功添加设备信息:{student_id} {student_name} {device_id} {device_name} {parameter}\n'
conn.sendall(response.encode())
# 关闭连接
conn.close()
# 不断等待客户端连接并处理请求
while True:
conn, addr = server_socket.accept()
print(f"客户端 {addr} 已连接")
t = threading.Thread(target=handle_request, args=(conn,))
t.start()
客户端程序:
import socket
# 创建客户端套接字
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 连接服务器
server_address = ('localhost', 12345)
client_socket.connect(server_address)
# 获取用户输入
student_info = input("请输入学号和姓名(用空格分隔):")
device_id = input("请输入设备号:")
device_name = input("请输入设备名称:")
parameter = input("请输入参数:")
# 发送信息给服务器
client_socket.sendall(f"{student_info}\n{device_id}\n{device_name}\n{parameter}\n".encode())
# 接收服务器响应并显示
response = client_socket.recv(1024).decode()
print(response)
# 关闭连接
client_socket.close()
参考gpt
以下是一个简单的示例程序,使用C语言在Linux上实现服务器端和客户端的进程通信。该程序会创建一个名为DeviceRecord.txt的文件,在服务器端接收客户端传来的数据,并将其写入该文件中。同时,客户端会提示用户输入学号、姓名、设备号、设备名称和参数,将这些数据发送给服务器端,并等待服务器端的响应。
服务器端程序:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <fcntl.h>
#include <semaphore.h>
#define PORT 8080
#define MAXLINE 1024
sem_t mutex;
int main()
{
int sockfd, connfd, len;
struct sockaddr_in servaddr, cli;
// 创建套接字
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd == -1) {
printf("socket creation failed...\n");
exit(0);
}
else
printf("Socket successfully created..\n");
// 初始化服务器地址结构体
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(PORT);
// 绑定套接字
if ((bind(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr))) != 0) {
printf("socket bind failed...\n");
exit(0);
}
else
printf("Socket successfully bound..\n");
// 监听套接字
if ((listen(sockfd, 5)) != 0) {
printf("Listen failed...\n");
exit(0);
}
else
printf("Server listening..\n");
len = sizeof(cli);
while (1) {
// 接受客户端请求
connfd = accept(sockfd, (struct sockaddr*)&cli, &len);
if (connfd < 0) {
printf("server acccept failed...\n");
exit(0);
}
else
printf("server acccept the client...\n");
// 创建子进程
if (fork() == 0) {
close(sockfd);
char buffer[MAXLINE];
// 读取客户端传来的数据
read(connfd, buffer, sizeof(buffer));
sem_wait(&mutex); // 进入临界区
printf("Data received from client: %s\n", buffer);
// 将数据写入文件
FILE* fp = fopen("DeviceRecord.txt", "a");
fprintf(fp, "%s\n", buffer);
fclose(fp);
// 发送数据给客户端
write(connfd, buffer, sizeof(buffer));
sem_post(&mutex); // 离开临界区
// 关闭连接
close(connfd);
exit(0);
}
else {
close(connfd);
}
}
close(sockfd);
return 0;
}
客户端程序:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <semaphore.h>
#define PORT 8080
#define MAXLINE 1024
sem
运行结果会根据具体的输入和输出而不同。但是,我们可以简单地描述程序的预期行为和输出。
当服务器端进程运行时,它会创建一个名为DeviceRecode.txt的文件,并等待客户端连接。一旦客户端连接成功并发送数据,服务器进程将接收并写入该文件,并将接收到的数据发送回客户端。
当客户端进程运行时,它会提示用户输入学号和姓名。用户输入学号和姓名后,客户端将这些信息发送到服务器。然后,客户端提示用户输入设备号、设备名称和参数,并将这些信息发送到服务器。客户端接收并显示从服务器返回的信息。
如果多个客户端同时尝试连接服务器,则服务器会按照进程互斥的方式添加信息,以防止信息错位。
服务器端代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <pthread.h>
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
void handle_client(int client_socket) {
char buffer[1024];
int n;
while ((n = recv(client_socket, buffer, sizeof(buffer), 0)) > 0) {
pthread_mutex_lock(&mutex);
FILE *fp = fopen("DeviceRecode.txt", "a");
fwrite(buffer, 1, n, fp);
fclose(fp);
send(client_socket, buffer, n, 0);
pthread_mutex_unlock(&mutex);
}
close(client_socket);
}
void start_server() {
int server_socket, client_socket;
struct sockaddr_in server_address, client_address;
socklen_t client_address_len;
server_socket = socket(AF_INET, SOCK_STREAM, 0);
if (server_socket < 0) {
perror("创建套接字失败");
exit(1);
}
memset(&server_address, 0, sizeof(server_address));
server_address.sin_family = AF_INET;
server_address.sin_addr.s_addr = htonl(INADDR_ANY);
server_address.sin_port = htons(8000);
if (bind(server_socket, (struct sockaddr *)&server_address, sizeof(server_address)) < 0) {
perror("绑定套接字失败");
exit(1);
}
if (listen(server_socket, 5) < 0) {
perror("监听套接字失败");
exit(1);
}
printf("服务器已启动,等待客户端连接...\n");
while (1) {
client_address_len = sizeof(client_address);
client_socket = accept(server_socket, (struct sockaddr *)&client_address, &client_address_len);
if (client_socket < 0) {
perror("接受客户端连接失败");
exit(1);
}
printf("客户端已连接\n");
pthread_t client_thread;
pthread_create(&client_thread, NULL, (void *)&handle_client, (void *)client_socket);
}
close(server_socket);
}
int main() {
start_server();
return 0;
}
客户端代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
void send_data(int client_socket, const char *data) {
send(client_socket, data, strlen(data), 0);
char buffer[1024];
int n = recv(client_socket, buffer, sizeof(buffer), 0);
buffer[n] = '\0';
printf("接收到的信息:%s\n", buffer);
}
void start_client() {
int client_socket;
struct sockaddr_in server_address;
client_socket = socket(AF_INET, SOCK_STREAM, 0);
if (client_socket < 0) {
perror("创建套接字失败");
exit(1);
}
memset(&server_address, 0, sizeof(server_address));
server_address.sin_family = AF_INET;
server_address.sin_port = htons(8000);
if (inet_pton(AF_INET, "127.0.0.1", &server_address.sin_addr) <= 0) {
perror("无效的 IP 地址");
exit(1);
if (connect(client_socket, (struct sockaddr *)&server_address, sizeof(server_address)) < 0) {
perror("连接服务器失败");
exit(1);
}
char data[1024];
printf("请输入学号和姓名:");
fgets(data, sizeof(data), stdin);
send_data(client_socket, data);
printf("请输入设备号:");
fgets(data, sizeof(data), stdin);
send_data(client_socket, data);
printf("请输入设备名称:");
fgets(data, sizeof(data), stdin);
send_data(client_socket, data);
printf("请输入参数:");
fgets(data, sizeof(data), stdin);
send_data(client_socket, data);
close(client_socket);
}
int main() {
start_client();
return 0;
}
在客户端程序中,我们首先创建一个套接字并连接到服务器。然后,从标准输入中读取用户输入的信息,并发送给服务器。每次发送完毕后,我们还会接收服务器返回的数据,并将其打印到控制台上。
在 send_data 函数中,我们先将数据发送到服务器,然后接收服务器返回的数据。注意到我们使用了 recv 函数来接收数据,这个函数在没有数据可读时会阻塞程序,直到有数据可读。在接收到数据后,我们将其打印到控制台上。
为了实现进程互斥,我们使用了一个互斥锁来保护文件的写操作。在 handle_client 函数中,我们首先使用 pthread_mutex_lock 函数获得互斥锁,然后打开文件并写入数据,最后释放互斥锁。这样,我们就可以保证每个进程在写文件时不会相互干扰。
服务器端代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#define BUF_SIZE 1024
int main() {
int server_socket = socket(AF_INET, SOCK_STREAM, 0);
if (server_socket == -1) {
perror("socket() failed");
exit(1);
}
struct sockaddr_in server_addr;
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
server_addr.sin_port = htons(12345);
if (bind(server_socket, (struct sockaddr*)&server_addr, sizeof(server_addr)) == -1) {
perror("bind() failed");
exit(1);
}
if (listen(server_socket, 5) == -1) {
perror("listen() failed");
exit(1);
}
int client_socket;
struct sockaddr_in client_addr;
socklen_t client_addr_size = sizeof(client_addr);
char buf[BUF_SIZE];
int fd = open("DeviceRecode.txt", O_CREAT | O_WRONLY | O_APPEND, 0644);
if (fd == -1) {
perror("open() failed");
exit(1);
}
while (1) {
client_socket = accept(server_socket, (struct sockaddr*)&client_addr, &client_addr_size);
if (client_socket == -1) {
perror("accept() failed");
continue;
}
int n = read(client_socket, buf, BUF_SIZE);
if (n == -1) {
perror("read() failed");
continue;
} else if (n == 0) {
close(client_socket);
continue;
}
buf[n] = '\0';
printf("Received data from client: %s\n", buf);
if (flock(fd, LOCK_EX) == -1) {
perror("flock() failed");
close(client_socket);
continue;
}
if (write(fd, buf, n) == -1) {
perror("write() failed");
flock(fd, LOCK_UN);
close(client_socket);
continue;
}
if (flock(fd, LOCK_UN) == -1) {
perror("flock() failed");
close(client_socket);
continue;
}
if (send(client_socket, buf, n, 0) == -1) {
perror("send() failed");
}
close(client_socket);
}
close(server_socket);
close(fd);
return 0;
}
客户端代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#define BUF_SIZE 1024
int main() {
int client_socket = socket(AF_INET, SOCK_STREAM, 0);
if (client_socket == -1) {
perror("socket() failed");
exit(1);
}
struct sockaddr_in server_addr;
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
server_addr.sin_port = htons(12345);
if (connect(client_socket, (
下面是基于Python实现的一个简单的服务器端和客户端程序,实现了题目中描述的功能:
服务器端代码:
import socket
def process_request(conn, addr):
# 建立 DeviceRecode.txt 文件
with open("DeviceRecode.txt", "w") as f:
f.write("学号\t姓名\t设备号\t设备名称\t参数\n")
while True:
# 接收客户端请求
data = conn.recv(1024)
if not data:
break
# 解析客户端请求
student_id, student_name, device_id, device_name, param = data.decode().strip().split()
# 向 DeviceRecode.txt 文件写入记录
with open("DeviceRecode.txt", "a") as f:
f.write(f"{student_id}\t{student_name}\t{device_id}\t{device_name}\t{param}\n")
# 发送响应给客户端
response = f"已成功添加记录:{student_id}\t{student_name}\t{device_id}\t{device_name}\t{param}\n"
conn.send(response.encode())
conn.close()
if __name__ == '__main__':
# 创建 socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定端口
server_address = ('localhost', 8000)
server_socket.bind(server_address)
# 监听连接
server_socket.listen(5)
while True:
# 接收客户端连接
conn, addr = server_socket.accept()
# 处理客户端请求
process_request(conn, addr)
客户端代码:
import socket
if __name__ == '__main__':
# 创建 socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 连接服务器
server_address = ('localhost', 8000)
client_socket.connect(server_address)
# 输入学号和姓名
student_id = input("请输入学号:")
student_name = input("请输入姓名:")
# 发送学号和姓名
message = f"{student_id} {student_name} "
client_socket.send(message.encode())
# 输入设备号、设备名称和参数
device_id = input("请输入设备号:")
device_name = input("请输入设备名称:")
param = input("请输入参数:")
# 发送设备信息
message = f"{device_id} {device_name} {param}"
client_socket.send(message.encode())
# 接收服务器响应
response = client_socket.recv(1024).decode()
# 显示服务器响应
print(response)
# 关闭 socket 连接
client_socket.close()
以下答案基于ChatGPT与GISer Liu编写:
以下是一个简单的Python程序实现了你提出的功能,注意需要在服务器端建立名为DeviceRecord.txt的文件并在程序中指定路径,程序中使用了socket库实现客户端和服务器端之间的通信,同时使用了threading库实现进程互斥。
服务器端代码:
python
import socket import threading # 服务器IP和端口 SERVER_ADDRESS = ('0.0.0.0', 8888) # DeviceRecord.txt文件路径 RECORD_PATH = '/path/to/DeviceRecord.txt' # 互斥锁 mutex = threading.Lock() def handle_client(conn, addr): # 接收学号和姓名 student_id = conn.recv(1024).decode() name = conn.recv(1024).decode() # 接收设备号、设备名称和参数 device_id = conn.recv(1024).decode() device_name = conn.recv(1024).decode() parameter = conn.recv(1024).decode() # 写入DeviceRecord.txt文件 with mutex: with open(RECORD_PATH, 'a') as f: f.write(f'{student_id},{name},{device_id},{device_name},{parameter}\n') # 发送接收到的信息 conn.send(f'Received: {student_id}, {name}, {device_id}, {device_name}, {parameter}'.encode()) # 关闭连接 conn.close() def start_server(): # 创建socket server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server_socket.bind(SERVER_ADDRESS) server_socket.listen(5) while True: # 接收连接 conn, addr = server_socket.accept() # 开启新线程处理连接 t = threading.Thread(target=handle_client, args=(conn, addr)) t.start() if __name__ == '__main__': start_server()
客户端代码:
python
import socket # 服务器IP和端口 SERVER_ADDRESS = ('127.0.0.1', 8888) def send_message(message): # 创建socket client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client_socket.connect(SERVER_ADDRESS) # 发送消息 client_socket.send(message.encode()) # 接收服务器响应 response = client_socket.recv(1024).decode() print(response) # 关闭连接 client_socket.close() if __name__ == '__main__': # 输入学号和姓名 student_id = input('请输入学号:') name = input('请输入姓名:') # 发送学号和姓名 send_message(f'{student_id}\n{name}\n') # 输入设备号、设备名称和参数 device_id = input('请输入设备号:') device_name = input('请输入设备名称:') parameter = input('请输入参数:') # 发送设备信息 send_message(f'{device_id}\n{device_name}\n{parameter}\n')
注意替换服务器IP和端口,以及DeviceRecord.txt文件的路径。运行客户端程序后,按照提示输入相应的信息即可完成数据传输。
该回答引用ChatGPT
使用VMware Linux中的Socket编程来实现上述功能。首先,您需要在服务器端编写一个Socket服务器,用于接收客户端发送的信息,并将信息写入DeviceRecode.txt文件,同时将接收到的信息发送给客户端;然后,您需要在客户端编写一个Socket客户端,用于接收服务器发送的信息,并将用户输入的信息发送给服务器;最后,您需要使用进程互斥的方式来添加信息,以防止接收的信息发生错位的现象。