承接上文:http://blog.csdn.net/cj_forever/article/details/79143240
有关TCP和UDP的区别,我觉得有必要了解一下,:
首先了解一下不同的地方在哪:
TCP---“
传输控制协议”,提供的是
面向连接
,最重要的是可靠、安全性高!在服务端和客户端交换数据前,必须先建立一个TCP连接,之后才能传输数据。
TCP提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另一端。
而UDP是“
用户数据报协议”,是一个简单的面向数据报的运输层协议。
UDP可靠性弱,它只是把应用程序传给IP层的数据报,发送出去,不能保证它们能到达目的地。由于UDP在传输数据报前不用在客户和服务器之间建立一个连接,故而传输速度很快
网络编程的一般步骤:
对TCP连接来说:
服务器端
1)创建套接字create; 2)绑定端口号bind; 3)监听连接listen; 4)接受连接请求accept,并返回新的套接字;5)用新返回的套接字recv/send; 6)关闭套接字。
客户端
1)创建套接字create; 2)发起建立连接请求connect; 3)发送/接收数据send/recv; 4)关闭套接字。
对于UDP连接来说:
服务器端:
1)创建套接字create; 2)绑定端口号bind; 3)接收/发送消息recvfrom/sendto; 4)关闭套接字。
客户端:
1)创建套接字create; 2)发送/接收消息sendto/recvfrom; 3)关闭套接字.
不管是
TCP还是UDP,步骤差不多;就在接收发送时,所用的函数不一样
拓展一下IP地址的种类:
范围:1.0.0.1~126.225.255.254
B类地址:第一个字节10开头,前2个字节为网络地址,后2个字节为主机地址,B类地址的起始地址为:128~191,有效网络数为16,382个,每个网络号所包含的有效主机数为65,531。
B类地址:第一个字节10开头,前2个字节为网络地址,后2个字节为主机地址,B类地址的起始地址为:128~191,有效网络数为16,382个,每个网络号所包含的有效主机数为65,531。
范围:128.0.0.1~191.255.255.254
C类地址:第一个字节110开头,前3个字节为网络地址,后1个字节为主机地址,C类地址的起始地址为192~223,有效网络数为2,097,150个,每个网络号所包含的有效主机数为254。
C类地址:第一个字节110开头,前3个字节为网络地址,后1个字节为主机地址,C类地址的起始地址为192~223,有效网络数为2,097,150个,每个网络号所包含的有效主机数为254。
范围:192.0.0.1~223.255.255.254
D类地址:第一个字节1110开头,通常用于多点传送或者组的寻址。
D类地址:第一个字节1110开头,通常用于多点传送或者组的寻址。
范围:224.0.0.0~239.255.255.255
E类地址:第一个字节11110开头,实验地址,保留给将来使用。
E类地址:第一个字节11110开头,实验地址,保留给将来使用。
范围:240.0.0.0~247.255.255.255
下面写一些案例,练习一下:
首先是一对一的服务端:
import socket import threading seversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) seversocket.bind(("172.16.0.133",9999)) print("服务器在等待") seversocket.listen(5) print("最多同时接收5个") c = seversocket.accept() print(c) def myreceive(c): while True: msg = c[0].recv(1024) print(msg.decode()) threading._start_new_thread(myreceive,(c,)) def myinput(): while True: msg = input() c[0].send(msg.encode()) threading._start_new_thread(myinput())
客户端:
import socket import threading clint = socket.socket(socket.AF_INET, socket.SOCK_STREAM) clint.connect(("192.168.1.106",9999)) #引号中为IP地址 后方的是端口 print("客户端已经连接") def myreceive(c): while True: msg = c.recv(1024) print(msg.decode()) threading._start_new_thread(myreceive,(clint,)) def myinput(): while True: msg = input() clint.send(msg.encode()) threading._start_new_thread(myinput())
进行一下拓展,弄一个群聊服务端,一个服务器可以和多个客户端进行互相通信!
注:必须先启动服务端,再启动客户端!!
import socket import threading seversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) seversocket.bind(("192.168.1.106",9999)) print("服务端正在等待") seversocket.listen(5) print("最多连接5个") msg = None lock = threading.Lock() mythread = threading.Condition(lock) def server_recv(c): global msg while True: mystr = c.recv(1024) mythread.acquire() msg = str(a) + mystr.decode() print(msg) mythread.notify_all() mythread.release() def server_send(c,a): global msg while True: mythread.acquire() mythread.wait() mythread.release() c.send(msg.encode()) print(msg) while True: c,a = seversocket.accept() threading._start_new_thread(server_recv, (c, )) threading._start_new_thread(server_send, (c,a))