代码改变世界

socket基础

2016-03-12 21:22  qing_add  阅读(413)  评论(0编辑  收藏  举报

 

socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求。

socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”(unix 系统出现的时候,网络协议还没有出来),对于文件用【打开】【读写】【关闭】模式来操作。socket就是该模式的一个实现,socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO、打开、关闭)

socket和file的区别:

  • file模块是针对某个指定文件进行【打开】【读写】【关闭】
  • socket模块是针对 服务器端 和 客户端Socket 进行【打开】【读写】【关闭】

下面是socket 在客户端和server 端通讯的具体情况

 

socket 作为“文件“来实现网络的通讯的基本情况

运行方式: 先运行socket_server,然后运行socket-client

实现的情况,客户端发送的一句话,服务器发送一句话

基本的形式

 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 
 4 import socket
 5 
 6 ip_port = ('127.0.0.1',9999)
 7 
 8 sk = socket.socket()
 9 sk.bind(ip_port)    ###实现到服务器上申请端口,开启服务的情况
10 sk.listen(5)     ####最大允许链接5个
11 
12 while True:
13     print('server waiting...')
14     conn,addr = sk.accept()   ###在服务器端,开启端口后,默认是阻塞状态
15 
16     client_data = conn.recv(1024)    ###接收客户端的数据
17     print(str(client_data,'utf8'))  ###打印客户端的数据
18     conn.sendall(bytes('不要回答,不要回答,不要回答','utf8'))   ###给客户发送数据    ####socket发送和接收的过程是使用的bytes 形式
19 
20     conn.close()
socket-server
 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 import socket    ######导入socket 模块
 4 ip_port = ('127.0.0.1',9999)  ##定义一个ip加端口的元组
 5 
 6 sk = socket.socket()  ###实例化一个socket
 7 sk.connect(ip_port)   ###调用上面提到的定义的元组   connect 去实现连接
 8 
 9 sk.sendall(bytes("请求占领地球",encoding='utf8'))   ###发送数据的写法   ###bytes的形式
10 
11 server_reply = sk.recv(1024)   ###定义一个接收到的数据的限制
12 print(str(server_reply,'utf8'))  ###打印接收到的信息,    ###字符串的形式
13 
14 sk.close()    ###关闭socket
socket-client

 

二   在socket 基础上,添加功能实现了,和qq聊天类似的功能(你说一句,我说一句,继续下去)

运行方式:先运行socket_server,然后运行socket-client,两边都有输入

代码如下:

 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 
 4 import socket
 5 
 6 ip_port = ('127.0.0.1',9999)
 7 
 8 sk = socket.socket()
 9 sk.bind(ip_port)
10 sk.listen(5)     ####最大允许链接5个
11 
12 while True:
13     print('server waiting...')
14     conn,addr = sk.accept()
15 
16     client_data = conn.recv(1024)
17     print(str(client_data,'utf8'))
18     conn.sendall(bytes('不要回答,不要回答,不要回答','utf8'))
19     while True:     ######用while 循环来实现输入
20         client_data = conn.recv(1024)   ###接收client的输入
21         print(str(client_data,'utf8'))   ###打印输入
22         server_response = input("\033[31;1m>>:\033[0m").strip()  ###实现颜色的区分   ,这个需要后续再琢磨颜色的问题
23         conn.send(bytes(server_response,'utf8'))   ###发送用户输入的内容
24     conn.close()
socket-server-2
 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 import socket
 4 ip_port = ('127.0.0.1',9999)
 5 
 6 sk = socket.socket()
 7 sk.connect(ip_port)
 8 
 9 sk.sendall(bytes("请求占领地球",encoding='utf8'))
10 
11 server_reply = sk.recv(1024)
12 print(str(server_reply,'utf8'))
13 
14 while True:  ###使用循环实现 多次说话
15     user_input = input(">>:").strip()
16     sk.send(bytes(user_input,'utf8'))  ##发送client 端的输入
17     server_reply = sk.recv(1024)   ##接收server 端发送的内容
18     print(str(server_reply,'utf8'))  ##
19 
20 sk.close()
socket-client-2

 

三  在二的基础上,修改一下,实现了一个server 和clienta通讯,当clienta 关闭了,开启clientb 时,能在server 不关闭的情况和clientb 实现通讯

运行方式:先运行socket_server,然后运行socket-clienta, 然后关闭clienta,开启clientb, 能实现了clientb 和server的通讯

在代码实现的过程中,为了简化形式,只是client发送什么内容,server返回client 发送的内容

代码如下:

 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 
 4 import socket
 5 
 6 ip_port = ('127.0.0.1',9999)
 7 
 8 sk = socket.socket()
 9 sk.bind(ip_port)
10 sk.listen(5)     ####最大允许链接5个
11 
12 while True:
13     print('server waiting...')
14     conn,addr = sk.accept()
15 
16     client_data = conn.recv(1024)
17     print(str(client_data,'utf8'))
18     conn.sendall(bytes('不要回答,不要回答,不要回答','utf8'))
19     while True:
20         try:
21             client_data = conn.recv(1024)
22             print(str(client_data,'utf8'))
23         except Exception:    ########因为client 断开,server端程序会异常,为了让这个现象不再出现,而设置的这个异常处理
24             print("client closed,break")
25             break                ###只要出现任何异常,break 跳出while  执行conn.close()
26         conn.send(client_data)
27     conn.close()
28 
29 
30 
31 
32 '''
33 try:            ###抓异常的语法
34 client_data = conn.recv(1024)
35 print(client_data)
36 except Exception:   ###所有的异常都处理
37 break
38 '''
socket-server-3
 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 import socket
 4 ip_port = ('127.0.0.1',9999)
 5 
 6 sk = socket.socket()
 7 sk.connect(ip_port)
 8 
 9 sk.sendall(bytes("请求占领地球",encoding='utf8'))
10 
11 server_reply = sk.recv(1024)
12 print(str(server_reply,'utf8'))
13 
14 while True:
15     user_input = input(">>:").strip()
16     sk.send(bytes(user_input,'utf8'))
17     server_reply = sk.recv(1024)
18     print(str(server_reply,'utf8'))
19 
20 sk.close()
socket-client-3