第一个例子,单线程
server
import socket
#创建socket对象
tcpServerSocket=socket.socket()
#获取本地主机名
host = socket.gethostname()
host = '127.0.0.1'
print(host)
#设置端口
port=8008
#将地址与套接字绑定,且套接字要求是从未被绑定过的
tcpServerSocket.bind((host,port))
#排队等待connect的最大数目
tcpServerSocket.listen(5)
while True:
#建立客户端连接,接受connection,返回两个参数,c是该connection上可以发送和接收数据的新套接字对象
#addr是与connection另一端的套接字绑定的地址
c, addr = tcpServerSocket.accept()
print ('连接地址:', addr)
s ='来自服务端的消息!'
r = c.recv(4096).decode()
c.send((s+':'+r).encode())
#套接字在垃圾收集garbage-collected时会自动close
#close关闭该connection上的资源但不一定马上断开connection
#想要立即断开connection,要先调用shutdown再close
#关闭连接
c.close()
client
import socket
#创建 socket 对象
tcpClientSocket= socket.socket()
#服务端ip
host = '127.0.0.1'
#服务端port
port = 8008
#连接服务端
tcpClientSocket.connect((host, port))
#发数据给服务端
tcpClientSocket.send('hello'.encode())
#该函数返回接收到的数据,数据均以字节表示,参数bufsize表示一次收到的最大的字节数
#使用这个方法好处是如果信号处理器未收到异常或系统请求中断,会重新尝试使系统重新请求而不是直接报错
r = tcpClientSocket.recv(4096).decode()
print(r)
#关闭连接
tcpClientSocket.close()
第二个例子,多线程
server
# -*- coding:utf-8 -*-
import socket
import threading
def threadfun(sock, addr):
try:
while True:
data = sock.recv(1024).decode()
if data:
print("Message from %s: %s" % (addr[0], data))
sock.send(("Hello,%s" % data).encode())
except Exception as e:
print("Other exception: %s" % str(e))
finally:
sock.close()
def test(port):
# 创建TCP套接字
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 启用地址重用
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
# 绑定地址和端口号
srv_addr = ("0.0.0.0", port)
sock.bind(srv_addr)
# 侦听客户端
sock.listen(5)
while True:
# 接受客户端连接
conn, addr = sock.accept()
t = threading.Thread(target=threadfun, args=(conn, addr))
t.start()
if __name__ == "__main__":
test(8008)
client
# -*- coding:utf-8 -*-
import socket
def test(host, port):
# 创建TCP套接字
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 连接服务器
srv_addr = (host, port)
sock.connect(srv_addr)
# 发送并接收数据
try:
# 发送消息
for i in range(10):
msg = "hi"
sock.sendall(msg.encode())
data = sock.recv(1024)
print("Message from server: %s" % data)
except Exception as e:
print("Other exception: %s" % str(e))
finally:
sock.close()
if __name__ == "__main__":
host = '127.0.0.1'
port = 8008
test(host, port)