socket,又叫套接字,是一个抽象的概念。通常用socket表示打开了一个网络连接。
在计算机网络中学过TCP/IP协议,将网络分为物理层、网际层、传输层,应用层等。网络编程一般属于传输层之上的内容,会用到TCP、UDP协议。其中TCP是有连接传输,UDP是无连接的。
开始
网络的作用是实现计算机互连与资源共享,因此数据传输是其核心内容。要实现数据的传输,需要知道要传输目标的IP地址,因此双方互连需要至少知道一个地址。
通常把提前知道地址的那一端称作服务器,发送数据请求的那一端称作客户端:
服务器
服务器接收客户端的数据请求,从客户端的请求信息中得到其地址,然后通过地址将所需数据发送回去。
分为有连接的TCP服务器和无连接的UDP服务器。
TCP的服务器需先建立连接后发送数据,而UDP无需建立连接随时可以接收与发送数据。
def tcp_sever():
while(true):
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.bind(('127.0.0.1',9999))
s.listen(2)
sock, addr = s.accept()
data = sock.recv(1024)
print data
sock.send('hello')
sock.close()
def udp_sever():
while(true):
s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
s.bind(('127.0.0.1',9999))
data = sock.recv(1024)
print data
sock.send('hello')
sock.close()
这两段代码的作用都是从客户端接收数据,打印数据然后发送一个hello,然后结束连接。
bind代表将服务器绑定到一个地址和一个端口上,0.0.0.0是所有地址,代表接收所有地址发来的信息,这里使用本机地址;端口号9999代表这个程序的所在端口。
listen表示开始监听是否有连接
要对多个客户端进行处理必须用到多线程,这里暂时放下。
客户端
客户端要连接服务器必须先知道服务器的IP地址,这里使用127.0.0.1即本机地址作为测试。(连接一些网站用的是网站的域名,域名可以通过域名服务器转换为IP地址)
def tcp_client():
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(('127.0.0.1',9999))
str = raw_input()
s.send(str)
print s.recv(1024)
s.close()
def udp_client():
s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
str = raw_input()
s.sendto(str,('127.0.0.1',9999))
print s.recv(1024)
s.close()
编写测试代码
def mainfunc():
cho = raw_input()
if(cho == '1'):
print 'tcp_sever'
tcp_sever()
elif(cho == '2'):
print 'tcp_client'
tcp_client()
elif(cho == '3'):
udp_sever()
elif(cho == '4'):
udp_client()
if __name__ == '__main__':
mainfunc()