初学python,也是初学网络通信等等balabala~
这几天终于是把这一块的内容搞差不多了,学习的时候主要参考了《Python网络编程》,《Python技术手册》,《Python学习手册》。有的时候一本书的内容会有一些不全面,或者是对于你自己来说不全面,多翻几本书总会找到想知道的内容啦~
这是实现简单的服务器回传,服务器把客户端发送来的消息再发回去。然后客户端把接受到的消息打出来。
这是服务器的代码:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import socket
import sys
host = ''
port = 8080
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
except socket.error:
print 'fail to set a socket'
sys.exit(1)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind((host, port))
s.listen(2)
while 1:
try:
conn, addr = s.accept()
print conn, addr
except socket.error:
print 'fail to accept'
sys.exit(1)
try:
buf = conn.recv(1024)
print buf
except socket.error:
print 'fail to receive'
sys.exit(1)
try:
conn.sendall(buf)
except socket.error:
print 'fail to send'
sys.exit(1)
print 'over !'
这是客户端的代码:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import socket
import sys
host = ''
port = 8080
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
except socket.error:
raise
except:
print 'fail to create new socket'
sys.exit(1)
try:
s.connect((host, port))
except socket.gaierror:
print 'wrong computer name'
sys.exit(1)
except socket.error:
print 'wrong server'
sys.exit(1)
buf = 'oooh~~oooh~~'
try:
s.sendall(buf)
except socket.error:
print 'fail to send message'
sys.exit(1)
try:
s.shutdown(1)
except socket.error:
print 'fail to send message all'
sys.exit(1)
try:
buf = s.recv(1024)
print buf
except socket.error:
print 'fail to receive'
sys.exit(1)
s.close()
UDP上也是一样的。有少许变化。
这是UDP的广播。。?恩,差不多吧。
服务器:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import socket
import sys
host = ''
port = 8080
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) #这里是UDP啊!!!UDP!!!
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
s.bind((host, port))
while 1:
try:
buf, addr = s.recvfrom(4096)
#print buf, addr
if not len(buf):
print 'over'
break
print 'Get from:', addr
s.sendto('i am heroine!', addr)
except socket.error:
raise
except:
print 'error!'
sys.exit(1)
s.close()
客户端的:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import socket
import traceback
import sys
host = ''
port = 8080
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect((host, port))
buf = '$'*43895
pos = 0
while pos < len(buf)-1:
rpos = min(len(buf)-1, pos+1023)
s.sendall(buf[pos:rpos])
pos = rpos+1
print 'Send %d'%rpos
while 1:
mes = s.recv(1024)
if not len(mes):
print 'over'
break
print "****", mes, "****"
s.close()
Python用起来确实很方便,具体功能有待开发hia~
***************************************************
这里有几点要注意下。
刚开始的时候是我没仔细看呢还是没想清楚。就是服务器在消息回传的时候,不是用服务器的socket.send(),而是用accept()来的客户端的套接字来进行send()。之前不知道这个错了好久。啊,recv()也是一样的。
然后是try..except。因为可以重叠多个except。但是要注意这几个except是平行的,一是如果异常存在继承关系,要把子类异常放前面,不然会被包括在父类异常当中。二是。。如果在上一个except中引发了一个异常,那么下一个except是不会进行捕捉的!因为他们是平行的!!!(⊙v⊙)嗯,好吧,我之前不确定是不是……
over
**********************************************
又写了关于UDP的新的广播方式,总结一下给自己看:
关于UDP的广播几点及思绪???
1、由于是广播,比较特殊,所以不管是客户端还是服务器,都需要这个,s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
2、客户端对服务器不能用connect,直接对服务器sendto
3、服务器不需要listen
*************************************
思路:
服务器:
建立一个套接字,两个setsockopt,绑定端口,然后坐等客户端连入的消息,将消息发回去
客户端:
建立一个套接字,一个setsockopt,直接对服务器地址进行消息发送,然后等着服务器传回内容
**********************************************
对UDP的协议内容,形式不是太了解。