server client 套接字连接

server端:

  1.  阻塞型套接字,不能满足多个客户端同时访问

    import socket

    server = socket.socket()

    server.bind((""127.0.0.1,8898))

    while True:

    server.listen(2)    2为最大同时连接数,python3.6以上有用

    conn,addr = server.accept()

    data = conn.recv(1024)  1024为最大接收字节

    conn.close()      服务器连接关闭

    图例:

        

   2.  非阻塞形套接字,用单线程模拟多线程并发,实现多个客户端同时访问

    import socket

    server = socket.socket()

    server.setblocking(False)

    server.bind(("127.0.0.1",8898))

    server.listen(5)

    conn_list = []    储存客户端请求

    while True:

      try:

        conn,addr = server.accept()

        conn.setblocking(False)

        conn_list.append(conn)

      except BlockingIOError:

        pass

      for conn in conn_list:

        try:

          data = conn.recv(1024)

          if data:

            print(data)

            conn.send(data)

          else:

            conn.close()

            conn_list.remove(conn)

        except  BlockingIOError:

            pass

  图例:
      

 

    

 

client端:

  import socket

  client = socket.socket()

  client.connect(("127.0.0.1",8898))

  client.send(b"hello")

  client.close()

  图例:

    

 

转载于:https://www.cnblogs.com/cxhzy/p/9961701.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Windows下,可以使用select函数来检测客户端连接是否断开。select函数可以监视多个套接字的状态,当有套接字状态发生变化时,select函数就会返回。如果客户端连接断开,相应的套接字状态也会发生变化,通过检测套接字状态可以判断客户端连接是否断开。 以下是使用select函数检测客户端连接是否断开的示例代码: ```c #include <winsock2.h> #include <stdio.h> int main() { // 初始化Winsock WSADATA wsaData; if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) { printf("WSAStartup failed.\n"); return 1; } // 创建监听套接字 SOCKET listenSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (listenSock == INVALID_SOCKET) { printf("socket failed.\n"); WSACleanup(); return 1; } // 绑定监听套接字 sockaddr_in addr; addr.sin_family = AF_INET; addr.sin_port = htons(12345); addr.sin_addr.s_addr = INADDR_ANY; if (bind(listenSock, (sockaddr*)&addr, sizeof(addr)) == SOCKET_ERROR) { printf("bind failed.\n"); closesocket(listenSock); WSACleanup(); return 1; } // 开始监听 if (listen(listenSock, SOMAXCONN) == SOCKET_ERROR) { printf("listen failed.\n"); closesocket(listenSock); WSACleanup(); return 1; } // 创建fd_set并将监听套接字添加进去 fd_set readSet; FD_ZERO(&readSet); FD_SET(listenSock, &readSet); // 循环等待客户端连接 while (true) { // 调用select函数等待客户端连接或数据到达 fd_set tempSet = readSet; int ret = select(0, &tempSet, NULL, NULL, NULL); if (ret == SOCKET_ERROR) { printf("select failed.\n"); break; } // 检测监听套接字是否有连接请求 if (FD_ISSET(listenSock, &tempSet)) { SOCKET clientSock = accept(listenSock, NULL, NULL); if (clientSock == INVALID_SOCKET) { printf("accept failed.\n"); break; } printf("client connected.\n"); // 将新连接的客户端套接字添加进fd_set FD_SET(clientSock, &readSet); } // 检测客户端套接字是否有数据到达或连接断开 for (int i = 0; i < readSet.fd_count; i++) { SOCKET sock = readSet.fd_array[i]; if (sock != listenSock && FD_ISSET(sock, &tempSet)) { char buf[1024]; int ret = recv(sock, buf, sizeof(buf), 0); if (ret == SOCKET_ERROR || ret == 0) { // 客户端连接断开,将套接字从fd_set中删除 printf("client disconnected.\n"); closesocket(sock); FD_CLR(sock, &readSet); } else { // 处理接收到的数据 // ... } } } } // 关闭监听套接字 closesocket(listenSock); // 清理Winsock WSACleanup(); return 0; } ``` 注意:以上代码仅为示例代码,实际使用时还需要进行错误处理和异常情况处理等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值