最近换工作后负责小组内测试开发工作,用到的python比较多,没有系统的学习使用过python,刚开始有些吃力,后续会不断总结一些入门的例程写在这里。(血的教训,应该多总结编程时比较棒的例程,好记性不如烂blog

客户端代码

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import socket

def connectServer():
    try:
        # 配置客户端
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        host = '192.168.0.102'     # 配置服务器IP地址
        print('Current computer IP address:' + host)
        port = 8888    # 配置服务器端口号(使用1025~65535端口号)

        # 连接服务端
        s.connect((host, port))
        data = s.recv(1024).decode('utf-8')    # 接收欢迎信息
        print(data)
        s.send(b'Welcome_To_Join_The_Conference')    # 发送消息到服务端
 
            
    except Exception,err:
        print(err)
    finally:
        s.send(b'exit')
        s.close()

if __name__ == '__main__':
    connectServer()

服务端代码

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import socket

def startServer():

    # 配置服务端
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    host = '192.168.0.102'     # 配置服务器IP地址
    port = 8888    # 配置服务器端口号(使用1025~65535端口号)
            
    # 绑定端口
    try:
        s.bind((host, port))        # 绑定端口
        print("Server started successfully !")
    except OSError:
        return False
    
    s.listen(5)
    print('Waiting for connection...')
    
    # 等待客户端连接
    sock, addr = s.accept()
    print('Accept new connection from %s:%s...' % addr) 
    sock.send(b'Welcome_To_Join_The_Conference')    # 发送欢迎信息
    while True:
        data = sock.recv(1024)  # 接收客户端信息
        if not data or data.decode('utf-8') == 'exit':
            break

    # 关闭连接
    sock.close()
    print('Connection from %s:%s closed.' % addr)


if __name__ == '__main__':
    startServer()

 

修改配置后,用python先运行上面的服务端,再运行服务端就好了。

问题:这个例程只能是一对一的,也就是一个服务端只能连接一个客户端,而且发完了消息就彻底结束了

可以使用python的多线程来解决这个问题(python的多线程在cpu使用上可以说是假的多线程,但是功能上不影响)

修改后的服务端代码

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import socket
import threading

def tcplink(sock, addr):
    print('Accept new connection from %s:%s...' % addr) 
    sock.send(b'Welcome_To_Join_The_Conference')    # 发送欢迎信息
    while True:
        data = sock.recv(1024)  # 接收客户端信息
        if not data or data.decode('utf-8') == 'exit':
            break
    
    # 关闭连接
    sock.close()
    print('Connection from %s:%s closed.' % addr)

def startServer():

    # 配置服务端
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    host = '192.168.0.102'     # 配置服务器IP地址
    port = 8888    # 配置服务器端口号(使用1025~65535端口号)
            
    # 绑定端口
    try:
        s.bind((host, port))        # 绑定端口
        print("Server started successfully !")
    except OSError:
        return False
    
    s.listen(5)
    print('Waiting for connection...')
        
    # 启动多线程,等待客户端连接
    while True:
        sock, addr = s.accept()
        t = threading.Thread(target=tcplink, args=(sock, addr))
        t.start()


if __name__ == '__main__':
    startServer()

修改后的服务端可以只启动一次,然后接受多个客户端的连接,即使一个客户端关闭,服务端并不会受到影响。

具体内容详见廖雪峰老师的教程

https://www.liaoxuefeng.com/wiki/897692888725344/923056653167136

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐