使用socket编程可以分成基于tcp和基于udp,tcp和udp两者最主要的区别是有无面向连接。

基于tcp的socket流程:

基于udp的socket的流程图:

(以上两图来源于网络)

可以看到基于udp的socket要简单得多,udp的客户端不需要事先connect,而udp的服务器端也不需要listen和accept。

下面贴上一些tcp client, tcp server, udp client, udp server的简单实现代码

tcp client:

__author__ = 'seven'
import socket target_host = "127.0.0.1"
target_port = 80 client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect((target_host, target_port))
client.send("ABCDEF")
response = client.recv(4096) print response
client.close()

tcp server:

__author__ = 'seven'
import socket
import threading bind_ip = "0.0.0.0"
bind_port = 80 server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind((bind_ip, bind_port))
server.listen(5)
print "[*] Listening on %s:%d" % (bind_ip, bind_port) def handle_client(client_socket):
request = client_socket.recv(1024)
print "[*] Received: %s" % request
client_socket.send("ACK!")
client_socket.close() while True:
client, addr = server.accept()
print "[*] Accepted connection from: %s:%d" % (addr[0], addr[1])
client_handler = threading.Thread(target=handle_client, args=(client,))
client_handler.start() server.close()

udp client:

__author__ = 'seven'
import socket target_host = "127.0.0.1"
target_port = 80 client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
client.sendto("ABCDEF", (target_host, target_port))
data, addr = client.recvfrom(4096) print data
client.close()

udp server:

__author__ = 'seven'
import socket bind_ip = "0.0.0.0"
bind_port = 80 server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server.bind((bind_ip, bind_port)) while True:
data, addr = server.recvfrom(4096)
if not data:
print "client has exist"
break
server.sendto("ACK!", addr)
print "received:%s from %s" % (data, addr) server.close()

稍微解释一下一些参数:

AF_INET参数说明使用标准的IPv4地址或主机名

AF_INET6参数说明使用IPv6地址或主机名

SOCK_STREAM参数说明是一个TCP客户端

SOCK_DGRAM参数说明是一个UDP客户端

最新文章

  1. ZeroMQ接口函数之 :zmq_curve – 安全的认证方式和保密方式
  2. IE7下如何判断复选框是否被选中(利用jquery)
  3. QTP处理各类鼠标事件fireEvent
  4. 深入理解javascript中的立即执行函数(function(){…})()
  5. Python 基本语法1
  6. C++ delete operator做了什么事
  7. db2 alter table 语法
  8. ubuntu常用命令(转)
  9. Java知多少(87)选择框和单选按钮(转)
  10. URLEncode编码和URLDecode解码
  11. 浅谈java类集框架和数据结构(2)
  12. python unittest 测试笔记(二):使用Requests
  13. MyBatis的关联关系补充 多对多 继承
  14. 简易RPC框架-客户端限流配置
  15. VINS 估计器之检查视差
  16. 将一个html文件引入另一个html文件的div中
  17. js-跨域源资源共享(CORS)
  18. NODE_ENV不是内部或外部命令,也不是可运行的程序
  19. eslint那些事儿
  20. beta阶段测试基本概况对应机型硬件信息

热门文章

  1. [译]ANDROID 11: BETA 计划
  2. B. Marvolo Gaunt's Ring 前缀后缀
  3. E. A Simple Task
  4. vue.prototype和vue.use的区别和注意点
  5. Spring官网阅读(六)容器的扩展点(一)BeanFactoryPostProcessor
  6. 利用css+js制作下拉列表
  7. jquery判断邮箱及密码是否输入正确的表单提交
  8. CF-557C Arthur and Table 权值线段树
  9. 【HDU4991】树状数组
  10. Python单元测试框架:pytest