简单的 socket 代码

TCP 编程

客户端代码

将键盘输入的字符发送到服务端,并将从服务端接收到的字符输出到终端

 1 #!/usr/python3
 2 
 3 import socket
 4 
 5 def socket_client():
 6     s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 7 
 8     #获取主机名
 9     host = socket.gethostname()
10     port = 9999
11 
12     #建立连接
13     s.connect((host, port))
14 
15     #接受欢迎消息
16     print(s.recv(1024).decode('utf-8'))
17     while True:
18         data = input()
19         #发送数据
20         s.send(data.encode('utf-8'))
21         print(s.recv(1024).decode('utf-8'))
22     s.send(b'exit')
23     s.close()
24 
25 def main():
26     socket_client()
27 
28 if __name__ == '__main__':
29     main()
View Code

注意:若服务器需要同时响应多个客户端请求,每个连接都需要一个新进程或新线程处理,否则服务器一次只能服务一个客户端 

 

服务端代码

将从客户端接收到的字符前面加上 HELLO, 再发送回给客户端

 1 #!/usr/bin/python3
 2 
 3 import socket
 4 import threading
 5 import time
 6 
 7 def tcp_link(sock, addr):
 8     print('Accept new connection from %s %s...' % addr)
 9     sock.send('欢迎学习 python 网络编程'.encode('utf-8'))
10     while True:
11         data = sock.recv(1024)
12         time.sleep(1)
13         if not data or data.decode('utf-8') == 'exit':
14             break
15         sock.send(('HELLO, %s' % data.decode('utf-8')).encode('utf-8'))
16     sock.close()
17     print('Connection from %s : %s closed.' % addr)
18 
19 
20 def socket_server():
21     #创建一个 socket 
22     s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)#SOCK_STREAM 指定使用面向流的 TCP 协议
23     #其中 AF_INET 指定使用 IPv4 协议,若要使用 IPv6 则指定该参数为 AF_INET6
24 
25     #获取本地主机名
26     host = socket.gethostname()
27 
28     #获取本地主机名
29     host = socket.gethostname()
30 
31     #设置端口号
32     port = 9999
33 
34     #监听端口
35     s.bind((host, port))
36 
37     #设置最大连接数,超过后排队
38     s.listen(5)
39 
40     while True:
41         #接受一个新连接
42         sock, addr = s.accept()
43         # 创建新线程处理TCP连接
44         t = threading.Thread(target = tcp_link, args = (sock, addr))
45         t.start()    
46 
47 
48 def main():
49     socket_server()
50 
51 
52 if __name__ == '__main__':
53     main()
View Code

 

UDP 编程

 客户端代码

将键盘输入的字符发送到服务端,并将从服务端接收到的字符输出到终端

 1 #!/usr/bin/python3
 2 
 3 import socket
 4 
 5 def socket_udp_client():
 6     host = socket.gethostname()
 7     port = 9999
 8     s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
 9     while True:
10         data = input()
11 
12         #发送数据
13         s.sendto(data.encode('utf-8'), (host, port))
14 
15         #接收数据
16         print(s.recv(1024).decode('utf-8'))
17 
18 
19 def main():
20     socket_udp_client()
21 
22 
23 if __name__ == '__main__':
24     main()
View Code

 

服务端代码

将从客户端接收到的字符前面加上 hello, 再发送回给客户端

 1 #!/usr/bin/python3
 2 
 3 import socket
 4 
 5 def socket_udp_server():
 6     s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) #SOCK_DGRAM 参数指定 socket 的类型是 udp
 7     host = socket.gethostname()
 8     port = 9999
 9 
10     #绑定端口
11     s.bind((host, port))
12 
13     #不需要调用 listen 方法,直接接收来自任何客户端的数据
14 
15     while True:
16         #接收数据
17         data, addr = s.recvfrom(1024)
18         #recvfrom 方法返回数据和客户端的地址与端口。这样,服务器收到数据后,直接调用 sendto 就可以把数据用 udp 发送给客户端
19         print('received from %s: %s.' % addr)
20         s.sendto(b'hello, %s' % data, addr)
21 
22 
23 def main():
24     socket_udp_server()
25 
26 
27 if __name__ == '__main__':
28     main()
View Code

 

posted @ 2018-06-17 17:13  geloutingyu  阅读(868)  评论(0编辑  收藏  举报