典型的SocketServer端程序.

导读:
  
  CPP文件:
  #include "LogServer.h"
  LogServer::LogServer(WORD wPort)
  {
  this->Port = wPort;
  this->addr_len = sizeof(struct sockaddr);
  this->count = 0;
  if((this->SockFd.sock = socket(AF_INET, SOCK_STREAM, 0)) == -1)
  {
  printf("Log Server Error!!/n");
  return;
  }
  this->SockFd.server_addr.sin_family = AF_INET;
  this->SockFd.server_addr.sin_port = htons(this->Port);
  this->SockFd.server_addr.sin_addr.s_addr = INADDR_ANY;
  memset(this->SockFd.server_addr.sin_zero, 0, sizeof(this->SockFd.server_addr.sin_zero));
  if(bind(this->SockFd.sock, (struct sockaddr *)&this->SockFd.server_addr, sizeof(struct sockaddr)) == -1)
  {
  printf("Log Server Bind Error!!/n");
  return;
  }
  if(listen(this->SockFd.sock, BACKLOG) == -1)
  {
  printf("Log Server Listen error!!/n");
  return;
  }
  this->SockFd.is_connect = 0;
  this->SockFd.wait_cycle = 0;
  }
  void LogServer::Execute()
  {
  while(1)
  {
  tv.tv_sec = 0;
  tv.tv_usec = 0;
  FD_ZERO(&readfds);
  FD_SET(this->SockFd.sock, &readfds);
  if (this->SockFd.is_connect == 1)
  {
  FD_SET(this->SockFd.subsock, &readfds);
  }
  if (select(FD_SETSIZE, &readfds, NULL, NULL, &tv) >0)
  {
  if (FD_ISSET(this->SockFd.sock, &readfds)) //new connect
  {
  if (this->SockFd.is_connect == 1)
  {
  close(this->SockFd.subsock);
  }
  //send_read_p[i] = send_write_p[i];
  //receive_read_p[i] = receive_write_p[i];
  this->SockFd.subsock = accept(this->SockFd.sock,(struct sockaddr *)&this->SockFd.client_addr, &addr_len);
  this->SockFd.is_connect = 1;
  printf("PORT %d is connected to LogServer./n", this->Port);//连接成功,现在服务端就可以向客户端发信息了.
  
  //write(this->SockFd.subsock,WriteBuff,iLength);
  }
  else
  {
  if (FD_ISSET(this->SockFd.subsock, &readfds)) //read socket
  {
  this->count = read(this->SockFd.subsock, this->ReadBuff, 512);
  if (count <= 0) //close connect
  {
  close(this->SockFd.subsock);
  //send_read_p[i] = send_write_p[i];
  //receive_read_p[i] = receive_write_p[i];
  this->SockFd.is_connect = 0;
  printf("PORT %d is disconneced/n", this->Port);
  }
  else
  {
  //if(GetDebug())
  {
  printf("/nLog Server Receive Data:/n");
  for (int k=0; k
  {
  printf("%02X ",this->ReadBuff[k]);
  }
  }
  
  }
  }
  }
  }
  usleep(10000); //10ms
  }
  }
  
  头文件:
  #include
  #include
  #include
  #include
  #include
  #include
  #include
  #include //sockaddr_in结构定义在这个文件中
  #include
  #include
  #include
  #include
  #define BACKLOG 10
  struct StrSock{
  int sock;
  int subsock;
  struct sockaddr_in server_addr;
  struct sockaddr_in client_addr;
  int is_connect;
  int wait_cycle;
  };
  class LogServer
  {
  private:
  struct StrSock SockFd;
  WORD Port;
  socklen_t addr_len; //这个变量有的操作系统中可以被定义为int型的,不过在这个操作系统中不能这么定义,必须被定义为socklen_t型的.
  struct timeval tv;
  fd_set readfds;
  int count;
  BYTE ReadBuff[512];
  struct hostent *local;
  public:
  LogServer(WORD iPort);
  void Execute();
  };

本文转自
http://zxlest.blog.163.com/blog/static/2312490420073239144488/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以给您提供一个简单的 Python 程序示例,实现客户启动多个线程向服务器连续请求数据服务,服务器可提供分类的数据服务等。以下是代码示例: 服务器代码: ```python import socketserver class MyTCPHandler(socketserver.BaseRequestHandler): def handle(self): while True: data = self.request.recv(1024) if not data: break # 根据客户请求的服务类型,返回对应的数据 if data == b'type1': self.request.sendall(b'service1 data') elif data == b'type2': self.request.sendall(b'service2 data') else: self.request.sendall(b'unknown service') if __name__ == "__main__": HOST, PORT = "localhost", 9999 server = socketserver.TCPServer((HOST, PORT), MyTCPHandler) server.serve_forever() ``` 客户代码: ```python import threading import socket class ClientThread(threading.Thread): def __init__(self, threadID, name, server_address, service_type): threading.Thread.__init__(self) self.threadID = threadID self.name = name self.server_address = server_address self.service_type = service_type def run(self): print("Starting " + self.name) # 创建一个 TCP/IP 套接字 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 连接服务器 sock.connect(self.server_address) try: # 发送服务类型请求 sock.sendall(self.service_type.encode()) # 接收数据 data = sock.recv(1024) print("{}: {}".format(self.name, data)) finally: # 关闭套接字 sock.close() if __name__ == "__main__": # 服务器地址 server_address = ("localhost", 9999) # 创建多个客户线程 threads = [] for i in range(5): thread = ClientThread(i, "Thread-{}".format(i), server_address, "type1") threads.append(thread) for i in range(5, 10): thread = ClientThread(i, "Thread-{}".format(i), server_address, "type2") threads.append(thread) # 启动所有线程 for thread in threads: thread.start() # 等待所有线程完成 for thread in threads: thread.join() ``` 以上代码示例中,服务器使用 socketserver 库创建 TCP 服务器,客户使用 socket 库创建 TCP 客户,每个客户在一个独立的线程中运行。客户线程向服务器发送服务类型请求,服务器根据请求类型返回对应的数据。如果请求类型未知,则返回“unknown service”提示信息。客户接收到数据后打印输出,然后关闭套接字。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值