最近换工作后负责小组内测试开发工作,用到的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