编写myqq即时聊天脚本,实现相互通信(tcp协议)

 

编写myqq即时聊天脚本,实现相互通信

主要涉及socket通信,tcp协议

与udp相比,tcp有一些不同。对比见程序中的注释。

udp链接 https://mp.csdn.net/postedit/83316495

注意:执行时要先运行server端,这也是跟udp的不同之一。

 

# TCP-Server

import socket

 # 1. 创建 socket 对象

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

 # 2. 将 socket 绑定到指定地址

#127.0.0.1这儿可以为空,表示可以接受任意主机的请求。

#127.0.0.1表示本机

address = ('127.0.0.1', 10140) 

s.bind(address)

 # 3. 接收连接请求
 
        #udp没有
 
 #主要作用:修改服务器端的socket状态为监听状态(不会产生阻塞)
 
s.listen(5)

 # 4. 等待客户请求一个连接(实现三次握手,会产生阻塞)
 
 #与udp最主要的区别,udp没有这一步建立连接的过程

# 调用 accept 方法时,socket 会进入 "waiting" 状态。

# accept方法返回一个含有两个元素的元组 (connection, address)。

# 第一个元素 connection 是新的 socket 对象,服务器必须通过它与客户通信;

# 第二个元素 address 是客户的 Internet 地址。

ss, addr = s.accept()

print( 'got connect from', addr)

 # 5. 处理:服务器和客户端通过 send 和 recv 方法通信

# send 方法返回已发送的字节个数。

# 调用 recv 时,服务器必须指定一个整数,它对应于可通过本次方法调用来接收的最大数据量。

# recv方法在接收数据时会进入 "blocked" 状态,最后返回一个字符 串,用它表示收到的数据。

# 如果发送的数据量超过了recv 所允许的,数据会被截短。

# 多余的数据将缓冲于接收端。以后调用recv时,多余的数据会从缓冲区删除。

while True:

    ra = ss.recv(1024)

    print( 'client:', ra.decode("utf-8"))

    message = input(">")

    if not message:

        break

    ss.send((message.encode("utf-8")))

 # 6. 传输结束,关闭连接

ss.close()

s.close()
 

 

#TCP-Client

import socket

#HOST=127.0.0.1

#PORT=10149

address = ('127.0.0.1',10140)

#socket第一个参数对应网络层,代表ip协议
#第二个代表传输层协议,STREAM代表tcp,DGRAM代表udp

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

#使用udp时。-----------------------------区别一!!!!!

#s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

#区别二!!!udp不需要连接

s.connect(address)

while True:

    message = input(">")

    if not message:

        break

    #s.send(bytes(message,'utf-8'))

#区别三!!!!udp是sendto

    s.send((message.encode()))

#区别四!!!udp是recvfrom,

    #sendto和recvfrom的区别主要原因时udp每次发送都需要建立连接,

    #而tcp已经使用connect已经建立好连接了,不需要每次都重新建立连接,直接收发数据就可以了

    data = s.recv(1024)

    print( 'server:',data.decode())

    #print( 'server:',data.decode("gbk"))

 

s.close()
 

 

 

你可能感兴趣的:(udp,python,socket通信)