python网络编程
/*×××××××××××××××××××××××××
创建一个能接受客户端的消息,
在消息前加一个时间戳后返回的tcp服务器
×××××××××××××××××××××××××*/
#!/usr/bin/env python from socket import * from time import ctime HOST='' PORT=21567 BUFSIZ = 1024 ADDR = (HOST, PORT) tcpSerSock = socket(AF_INET, SOCK_STREAM) tcpSerSock.setsockopt(SOL_SOCKET, SO_REUSEADDR, True) tcpSerSock.setsockopt(SOL_SOCKET, SO_REUSEPORT, True) tcpSerSock.bind(ADDR) tcpSerSock.listen(5) while True: print'waiting for connect ...' tcpCliSock, addr = tcpSerSock.accept() print'... connected from :' ,addr while True: data = tcpCliSock.recv(BUFSIZ) if not data: break tcpCliSock.send('[%s] %s'%(ctime(), data)) tcpCliSock.close() tcpSerSock.close()
在进入到服务器无限循环后,被动的等待连接,当有连接的时候,我们进入对话循环,等待客户端发送数据,如果消息为空,表示客户端已经退出,那就再去等待下一个客户端连接,得到客户端消息后,我们要在消息前加一个时间戳然后返回,最后一行不会被执行,放在这里是提醒,服务器退出的时候记得调用close()函数
/*×××××××××××××××××××××××××
创建一个tcp客户端,
程序会提示用户输入要传给服务器的信息,
显示服务器返回的加了时间戳的结果
×××××××××××××××××××××××××*/
#!/usr/bin/env python from socket import * HOST= 'localhost' PORT=21567 BUFSIZ = 1024 ADDR = (HOST, PORT) tcpCliSock = socket(AF_INET, SOCK_STREAM) tcpCliSock.connect(ADDR) while True: data = raw_input('> ') if not data: break tcpCliSock.send(data) data = tcpCliSock.recv(BUFSIZ) if not data: break print data tcpCliSock.close()
客户端有一个无限循环,用户没有输入或者服务器由于某种原因退出的时候,导致函数recv()失败,在一般情况下,客户端会把用户输入的字符发送给服务器进行处理,然后接收并显示服务器传回来的加了时间戳的字符串
/*×××××××××××××××××××××××
×创建一个udp的服务器和客户端
×××××××××××××××××××××××××*/
#!/usr/bin/env python from socket import * from time import ctime HOST = '' PORT = 21567 BUFSIZ = 1024 ADDR = (HOST, PORT) udpSerSock = socket(AF_INET, SOCK_DGRAM) udpSerSock.bind(ADDR) while True: print 'waiting for message...' data, addr = udpSerSock.recvfrom(BUFSIZ) udpSerSock.sendto('[%s] %s' % (ctime(), data), addr) print '...received from and returned to:', addr udpSerSock.close() #!/usr/bin/env python from socket import * HOST = 'localhost' PORT = 21567 BUFSIZ = 1024 ADDR = (HOST, PORT) udpCliSock = socket(AF_INET, SOCK_DGRAM) while True: data = raw_input('> ') if not data: break udpCliSock.sendto(data, ADDR) data, ADDR = udpCliSock.recvfrom(BUFSIZ) if not data: break print data udpCliSock.close()
UDP和TCP服务器的区别,由于数据报套接字是无连接的,所以无法吧客户端连接交给另外的套接字进行后续的通讯,这些服务器只是接受消息,需要的话,给客户端返回一个结果就可以的
UDP和TCP客户端的区别,我们不用先去和UDP服务器建立连接,而是直接把消息发出去,等待服务器的回复,得到了加了时间戳的字符串以后,把他显示出来,然后再继续其他消息,在输入结束后,退出循环,关闭套接字