1.客户端去服务端获取数据
服务端代码如下:
#-*-coding:gbk-*-
import socket
class Server:
def server(self):
#创建socket对象
serversocket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#获取本地主机名
# host=socket.gethostname()
# port=6666
#绑定端口号
serversocket.bind(('127.0.0.1',6666))
#设置最大连接数
serversocket.listen(2)
while True:
#建立客户端连接
clientsocket,addr=serversocket.accept()
print("连接地址:%s"%str(addr))
msg='欢迎连接serversockt'+'\n'
clientsocket.send(msg.encode('utf-8'))
clientsocket.close()
if __name__ == '__main__':
s=Server()
s.server()
客户端代码如下:
#-*-coding:gbk-*-
import socket
class TestLianxi:
def client(self):
# 创建socket对象
cs=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 连接服务,指定主机和端口
cs.connect(("127.0.0.1",6666))
# 接收小于1024字节的数据
msg=cs.recv(1024)
#关闭服务连接
cs.close()
print(msg.decode('utf-8'))
if __name__ == '__main__':
Tl=TestLianxi()
Tl.client()
运行结果:
服务端返回:连接地址:127.0.0.1 53617
客户端返回:欢迎连接serversockt
2.客户端发送数据到服务端,服务端输入内容和客户端发的信息一块返回给客户端
#-*-coding:gbk-*-
import socket
import threading
import time
class Server:
def server(self):
#创建socket对象
serversocket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#获取本地主机名
# host=socket.gethostname()
# port=6666
#绑定端口号
serversocket.bind(('127.0.0.1',6666))
#设置最大连接数
serversocket.listen(51)
while True:
#建立客户端连接
clientsocket,addr=serversocket.accept()
#创建新线程来处理TCp连接
t=threading.Thread(target=self.tcplink(clientsocket,addr))
t.start()
#关闭循环内套接字
clientsocket.close()
#关闭监听套接字
serversocket.close()
def tcplink(self,clientsocket, addr):
print("新客户端的连接%s:" % str(addr))
clientsocket.send(("欢迎访问服务端").encode())
while True:
data1 = clientsocket.recv(1024).decode("utf-8")
print("接收来自%s的一个消息:%s"%(addr,data1))
time.sleep(3)
if not data1 or data1=='q':
print("没有数据,关闭")
break
msg_x=input("服务端请输入内容:")
#服务端加上自己内容返回给客户端
clientsocket.send(("服务端输入的内容%s:客户端返回的内容:%s" %(msg_x,data1)).encode("utf-8"))
#服务端输入q,退出当前
if not msg_x or msg_x=='q':
break
#服务端和当前客户端断开连接
clientsocket.close()
print("连接地址来自地址%sclose" % str(addr))
if __name__ == '__main__':
s=Server()
s.server()
#-*-coding:gbk-*-
import socket
class TestLianxi:
def client(self):
# 创建socket对象
cs=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 连接服务,指定主机和端口
cs.connect(("127.0.0.1",6666))
while True:
# 需向服务端发送的数据
datas = ['我是客户端A发的水杯', '我是客户端A发的纸巾', '我是客户端A发的耳机','girl']
for data1 in datas:
cs.send(data1.encode())
if not data1 or data1=='q':
break
#cs.send(data1.encode())
# 接收小于1024字节的数据
msg=cs.recv(1024)
print(msg.decode("utf-8"))
if not msg or msg=='q':
break
cs.close()
if __name__ == '__main__':
Tl=TestLianxi()
# mt=Tl.Multiplicationtables()
# Tl.x()
Tl.client()
运行结果:
服务端:
客户端:
遇到的问题:
1.TypeError: a bytes-like object is required, not ‘str’ 翻译"类型错误:需要类似字节的对象,而不是字符串"
解决办法:
解决办法非常的简单,只需要用上python的bytes和str两种类型转换的函数encode()、decode()即可!
str通过encode()方法可以编码为指定的bytes;
反过来,如果我们从网络或磁盘上读取了字节流,那么读到的数据就是bytes。要把bytes变为str,就需要用decode()方法