网路编程练习

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()方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值