网络编程基础

socket概念

socket层

Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。

其实站在你的角度上看,socket就是一个模块。我们通过调用模块中已经实现的方法建立两个进程之间的连接和通信。
也有人将socket说成ip+port,因为ip是用来标识互联网中的一台主机的位置,而port是用来标识这台机器上的一个应用程序。
所以我们只要确立了ip和port就能找到一个应用程序,并且使用socket模块来与之通信。

 

套接字(socket)初使用

tcp是基于链接的,必须先启动服务端,然后再启动客户端去链接服务端

server端

import socket
sk=socket.socket()#这里相当于一个买手机的过程
# sk.bind('ip','port')
sk.bind(('127.0.0.1',8080))#绑定手机卡
sk.listen()#监听,等着有人给我打电话
conn,addr=sk.accept()#接听到别人的电话,connection连接,address,地址
ret=conn.recv(1024)#听别人说话
print(ret)
conn.send(b'hi')#和别人说话,传输必须是bytes类型
conn.close()#挂电话
sk.close()#关手机

client端

import socket
sk=socket.socket()
sk.connect(('127.0.0.1',8080))
sk.send(b'hello')
ret=sk.recv(1024)
print(ret)
sk.close()

 注意在使用的过程中先启动sever端,再启动service端口

在使用的过程中可能会遇到

这是由于socket实际上是利用操作系统的端口进行了通信,但是在使用的过程中,有可能程序是关闭了,但是操作系统的关闭有滞后效应。所以出现这种现象。

具体解决办法

法一:直接将‘8898’换成‘8890’或者其他数字

法二:

import socket
sk=socket.socket()#这里相当于一个买手机的过程
sk.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)#避免服务重启的时候,报错address already in use
# sk.bind('ip','port')
sk.bind(('127.0.0.1',8080))#绑定手机卡
sk.listen()#监听,等着有人给我打电话
conn,addr=sk.accept()#接听到别人的电话,connection连接,address,地址
ret=conn.recv(1024)#听别人说话
print(ret)
conn.send(b'hi')#和别人说话,传输必须是bytes类型
ret=conn.recv(1024)
print(ret.decode('utf-8'))
conn.send(bytes('油泼面',encoding='utf-8'))
conn.close()#挂电话
sk.close()#关手机

进阶实现sever和clent的聊天

sever端口

import socket
sk=socket.socket()#这里相当于一个买手机的过程
sk.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)#避免服务重启的时候,报错address already in use
# sk.bind('ip','port')
sk.bind(('127.0.0.1',8080))#绑定手机卡
sk.listen()#监听,等着有人给我打电话
conn,addr=sk.accept()#接听到别人的电话,connection连接,address,地址
ret=conn.recv(1024)#听别人说话
print(ret)
conn.send(b'hi')#和别人说话,传输必须是bytes类型
ret=conn.recv(1024)
print(ret.decode('utf-8'))
conn.send(bytes('油泼面',encoding='utf-8'))
conn.close()#挂电话
sk.close()#关手机

clent端口

import socket
sk=socket.socket()
sk.connect(('127.0.0.1',8080))
sk.send(b'hello')
ret=sk.recv(1024)
print(ret.decode('utf-8'))
sk.send(bytes('中午吃什么',encoding='utf-8'))
ret=sk.recv(1024)
print(ret.decode('utf-8'))
sk.close()

利用while循环实现自动聊天

sever端口

import socket
sk=socket.socket()#这里相当于一个买手机的过程
sk.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)#避免服务重启的时候,报错address already in use
# sk.bind('ip','port')
sk.bind(('127.0.0.1',8080))#绑定手机卡
sk.listen()#监听,等着有人给我打电话
conn,addr=sk.accept()#接听到别人的电话,connection连接,address,地址
while 1:
    ret=conn.recv(1024)#听别人说话
    print(ret)
    conn.send(b'hi')#和别人说话,传输必须是bytes类型
    ret=conn.recv(1024)
    print(ret.decode('utf-8'))
    conn.send(bytes('油泼面',encoding='utf-8'))
conn.close()#挂电话
sk.close()#关手机

clent端口

import socket
sk=socket.socket()
sk.connect(('127.0.0.1',8080))
while 1:
    sk.send(b'hello')
    ret=sk.recv(1024)
    print(ret.decode('utf-8'))
    sk.send(bytes('中午吃什么',encoding='utf-8'))
    ret=sk.recv(1024)
    print(ret.decode('utf-8'))
sk.close()

实现类似于QQ的对话工具

sever端口

import socket
sk=socket.socket()#这里相当于一个买手机的过程
sk.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)#避免服务重启的时候,报错address already in use
# sk.bind('ip','port')
sk.bind(('127.0.0.1',8080))#绑定手机卡
sk.listen()#监听,等着有人给我打电话
conn,addr=sk.accept()#接听到别人的电话,connection连接,address,地址
while 1:
    ret=conn.recv(1024).decode('utf-8')#听别人说话
    print(ret)
    if ret=='bye':
        break
    info=input('>>>>')
    conn.send(bytes(info,encoding='utf-8'))

conn.close()#挂电话
sk.close()#关手机

clent端口

import socket
sk=socket.socket()
sk.connect(('127.0.0.1',8080))
while 1:
    info=input('>>>>')
    sk.send(bytes(info,encoding='utf-8'))
    ret=sk.recv(1024).decode('utf-8')
    print(ret)
    if ret=='bye':
        sk.send(b'bye')
        break
sk.close()

 

ip协议属于网络osi七层协议中的那一层:网络层
tcp协议,udp协议属于传输层
arp协议属于数据链路层

posted @ 2019-03-22 00:23  舒畅123  阅读(106)  评论(0编辑  收藏  举报