Python 套接字中的发送和接收是如何工作的?

Ami*_*ami 5 python sockets send

我使用 python 套接字工作了一段时间,我写了一些很好的简单程序。

我每次遇到的问题都是关于套接字中的发送和接收方法!给你一个基本而简单的例子:

这是接收器(服务器!):

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('', 4001))
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.listen(5)


while True:
  conn, addr = s.accept()
  print conn, addr

  data1 = conn.recv(64)
  data2 = conn.recv(64)

  print 'uname is %s , password is: %s' %(data1, data2, )
  conn.close()
Run Code Online (Sandbox Code Playgroud)

这是发件人(或客户!):

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('', 4001))

uname = raw_input('enter username>')
passw = raw_input('enter password>')

s.send(uname)
s.send(passw)

print 'exiting ...'
s.close()
Run Code Online (Sandbox Code Playgroud)

所以问题是,为什么服务器在第一个 s.recv() 方法中同时收到 uname 和 passw ?这意味着 data2 总是空的!

我真的不知道当客户端使用 s.send() 时会发生什么。我在想每个 s.send() 都会向目的地 (ip,port) 发送一个“数据包”!!

有人可以向我解释为什么第二个代码(另一个客户端)正在工作?

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('', 4001))

uname = raw_input('enter username>')
s.send(uname)

passw = raw_input('enter password>')
s.send(passw)

print 'exiting ...'
s.close()
Run Code Online (Sandbox Code Playgroud)