tcp套接字与udp套接字的区别

tcp套接字与udp套接字的对比

1.tcp套接字

服务端
import socket
import struct
import json
import os
import hashlib
# #1.买手机
phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#2.绑定手机卡
phone.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
phone.bind(('127.0.0.1',8084))
#3.开机
phone.listen(5)    #可以最多挂起5个连接


def get(filename_str,path):
    header_dict={'filename':filename_str,
                 'total_size':os.path.getsize(path),
                 'sha1': 'c38edee18ff56c46b49a751d72'
                }

    header_json=json.dumps(header_dict)
    header_bytes=header_json.encode('utf-8')

    conn.send(struct.pack('i',len(header_bytes)))

    conn.send(header_bytes)

    with open(path,'rb') as f:
        m=hashlib.md5()
        for line in f:
            conn.send(line)
            m.update(line)
    md5=m.hexdigest()
    conn.send(md5.encode('utf-8'))


#4.等电话连接
while True:   #连接循环
    print('starting...')
    conn,addr=phone.accept()
    print('IP:%s,PORT:%s' %(addr[0],addr[1]))
   #5.收发信息
    while True:    #通信循环
        try:
            filename=conn.recv(1024)
            filename_str=filename.decode('utf-8')
            path='D:/text/'+filename_str
            get(filename_str,path)
        except Exception:
            break

    conn.close()


phone.close()


客户端
import socket
import struct
import json
import hashlib
# 1.买手机
phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 2.打电话
phone.connect(('127.0.0.1',8084))
# 3.发收消息
while True:
    filename=input('>>>:').strip()
    if filename=='q':break
    if not filename:continue
    phone.send(filename.encode('utf-8'))


    obj=phone.recv(4)
    header_size=struct.unpack('i',obj)[0]

    header_bytes=phone.recv(header_size)
    header_json=header_bytes.decode('utf-8')
    header_dict=json.loads(header_json)
    total_size=header_dict['total_size']

    recv_size=0
    path='F:/text/'+filename
    with open(path,'wb') as f:
        m=hashlib.md5()
        while recv_size<total_size:
            res_data=phone.recv(1024)
            f.write(res_data)
            recv_size+=len(res_data)
            m.update(res_data)
    phone_md5=m.hexdigest()
    a=phone.recv(1024)
    server_md5=a.decode('utf-8')
#4.挂电话
phone.close()
下载文件

2.udp套接字

服务端
from  socket import *
server=socket( AF_INET,SOCK_DGRAM)
server.bind(('127.0.0.1',8080))
while True:
    data,client_addr=server.recvfrom(1024)
    server.sendto(data.upper(),client_addr)


server.close()



客户端
from  socket import *
client=socket( AF_INET,SOCK_DGRAM)


while True:
    client.sendto(b'hello',('127.0.0.1',8080))
    data,server_addr=client.recvfrom(1024)
    print(data.decode())
udp套接字

3.操作系统的作用

(1)可以将复杂、丑陋的硬件接口抽象出良好的接口,供用户使用

(2)管理、调度进程,使多个进程变得有序化

4.多道技术

(1)针对单核,实现并发;多核主机每个核都用到多道技术,至于如何调用哪一个核,取决于操作系统的调度算法

(2)空间上的复用:如内存中存在多道程序

(3)时间上的复用:复用一个CPU的时间片

 

posted @ 2017-10-30 14:33  星雨5213  阅读(994)  评论(0)    收藏  举报