网络编程2

承接上文: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地址的种类:
A类地址:第一个字节0开头,其余7位为网络地址,后3个字节为主机地址A类地址是起始地址为:1~126,有效网络数字为126,每个网络号所包含的有效主机数为16,777,214。
范围1.0.0.1~126.225.255.254
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。
范围192.0.0.1~223.255.255.254
D类地址:第一个字节1110开头,通常用于多点传送或者组的寻址。
范围224.0.0.0~239.255.255.255
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))










  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值