1、TCP连接的建立方法

客户端在建立一个TCP连接时一般需要两步,而服务器的这个过程需要四步,具体见下面的比较。步骤

TCP客户端

TCP服务器

第一步

建立socket对象

建立socket对象

第二步

调用connect()建立一个和服务器的连接

设置socket选项(可选)

第三步

绑定到一个端口(也可以是一个指定的网卡)

第四步

侦听连接

下面具体来讲这四步的建立方法:

第一步,建立socket对象:这里与客户端一样,依然是:

s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

第二步,设置和得到socket选项

python定义了setsockopt()和getsockopt(),一个是设置选项,一个是得到设置。这里主要使用setsockopt(),具体结构如下:

setsockopt(level,optname,value)

level定义了哪个选项将被使用。通常情况下是SOL_SOCKET,意思是正在使用的socket选项。它还可以通过设置一个特殊协议号码来设置协议选项,然而对于一个给定的操作系统,大多数协议选项都是明确的,所以为了简便,它们很少用于为移动设备设计的应用程序。

optname参数提供使用的特殊选项。关于可用选项的设置,会因为操作系统的不同而有少许不同。如果level选定了SOL_SOCKET,那么一些常用的选项见下表:

选项

意义

期望值

SO_BINDTODEVICE

可以使socket只在某个特殊的网络接口(网卡)有效。也许不能是移动便携设备

一个字符串给出设备的名称或者一个空字符串返回默认值

SO_BROADCAST

允许广播地址发送和接收信息包。只对UDP有效。如何发送和接收广播信息包

布尔型整数

SO_DONTROUTE

禁止通过路由器和网关往外发送信息包。这主要是为了安全而用在以太网上UDP通信的一种方法。不管目的地址使用什么IP地址,都可以防止数据离开本地网络

布尔型整数

SO_KEEPALIVE

可以使TCP通信的信息包保持连续性。这些信息包可以在没有信息传输的时候,使通信的双方确定连接是保持的

布尔型整数

SO_OOBINLINE

可以把收到的不正常数据看成是正常的数据,也就是说会通过一个标准的对recv()的调用来接收这些数据

布尔型整数

SO_REUSEADDR

当socket关闭后,本地端用于该socket的端口号立刻就可以被重用。通常来说,只有经过系统定义一段时间后,才能被重用。

布尔型整数

本节在学习时,用到了SO_REUSEADDR选项,具体写法是:

S.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) 这里value设置为1,表示将SO_REUSEADDR标记为TRUE,操作系统会在服务器socket被关闭或服务器进程终止后马上释放该服务器的端口,否则操作系统会保留几分钟该端口。

下面的方法可以帮助给出该系统下python所支持的socket选项列表:

import socket

solist=[x for x in dir(socket) if x.startswith('SO_')]

solist.sort()

for x in solist:

Print x

第三步:绑定socket

绑定即为服务器要求一个端口号。

S.bind((host,port)),其中host为服务器ip,通常为空,也可以绑定到一个特定的ip地址。Port为端口号。

第四步:侦听连接。

利用listen()函数进行侦听连接。该函数只有一个参数,其指明了在服务器实际处理连接的时候,允许有多少个未决(等待)的连接在队列中等待。作为一个约定,很多人设置为5。如:s.listen(5)

2、简单的TCP服务器实例

这个建立一个简单的TCP服务器和客户端。

服务器端:TCP响应服务器,当与客户端建立连接后,服务器显示客户端ip和端口,同时将接收的客户端信息和'I get it!'传给客户端,此时等待输入一个新的信息传给客户端。

客户端:TCP客户端,首先输入服务器ip地址,然后输入信息,回车后会得到服务器返回信息,然后等待服务器向其发送信息后退出。

具体代码如下:

服务器端:tcpserver.py

# -*- coding: cp936 -*-

##tcp响应服务器,当与客户端建立连接后,服务器显示客户端ip和端口,同时将接收的客户端信息和'I get it!'传给客户端,此时等待输入一个新的信息传给客户端。

##@小五义

import socket,traceback

host=''

port=12345

s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)

s.bind((host,port))

s.listen(1)

while 1:

try:

clientsock,clientaddr=s.accept()

except KeyboardInterrupt:

raise

except:

traceback.print_exc()

continue

try:

print "连接来自:",clientsock.getpeername()

while 1:

data=clientsock.recv(4096)

if not len(data):

break

print clientsock.getpeername()[0]+':'+str(data)

clientsock.sendall(data)

clientsock.sendall("\nI get it!\n")

t=raw_input('input the word:')

clientsock.sendall(t)

except (KeyboardInterrupt,SystemExit):

raise

except:

traceback.print_exc()

try:

clientsock.close()

except KeyboardInterrupt:

raise

except:

traceback.print_exc()

客户端:tcpclient.py

# -*- coding: cp936 -*-

##tcp客户端,首先输入服务器ip地址,然后输入信息,回车后会得到服务器返回信息,然后等待服务器向其发送信息后退出。

##@小五义

import socket,sys

port=12345

host=raw_input('输入服务器ip:')

data=raw_input('输入要发送的信息:')

s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

try:

s.connect((host,port))

except:

print '连接错误!'

s.send(data)

s.shutdown(1)

print '发送完成。'

while 1:

buf=s.recv(4096)

if not len(buf):

break

sys.stdout.write(buf)

执行结果:

客户端输入hello,服务器端输入ok,具体显示结果是:

服务器端:

连接来自:('127.0.0.1',1945)

127.0.0.1:hello

Input the world:ok

客户端:

输入服务器ip:127.0.0.1

输入要发送的信息:hello

发送完成。

hello

I get it!

ok

3、UDP服务器

UDP服务器建立与TCP相类似,具体比较如下:

步骤

UDP

TCP

第一步

建立socket对象

建立socket对象

第二步

设置socket选项

设置socket选项

第三步

绑定到一个端口

绑定到一个端口

第四步

Recvfrom()

侦听连接listen

这里利用UDP建立一个时间服务器。

代码如下:

服务器端;serverudp.py

# -*- coding: cp936 -*-

##UDP服务器端,客户端连接后,向其发送当前时间

##@小五义

import socket,traceback,time,struct

host=''

port=12345

s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)

s.bind((host,port))

while 1:

try:

message,address=s.recvfrom(8192)

secs=int(time.time())

reply=struct.pack("!I",secs)

s.sendto(reply,address)

except (KeyboardInterrupt,SystemExit):

raise

except:

traceback.print_exc()

客户端:clientudp.py

# -*- coding: cp936 -*-

##udp客户端,向服务器发送一个空字符后,得到服务器返回时间

##@小五义

import socket,sys,struct,time

host=raw_input('输入服务器地址:')

port=12345

s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

s.sendto('',(host,port))

print "等待回复……"

buf=s.recvfrom(2048)[0]

if len(buf)!=4:

print "回复错误%d:%s"%(len(buf),buf)

sys.exit(1)

secs=struct.unpack("!I",buf)[0]

print time.ctime(int(secs))

运行结果:

首先运行服务器端,然后运行客户端。

C:\>python clientudp.py  ##clientudp.py程序存放在在c盘下

输入服务器地址:127.0.0.1

等待回复……

Mon Aug 06 17:09:17 2012

python socket服务器_python网络编程学习笔记(三):socket网络服务器相关推荐

  1. 网络编程学习笔记--1.socket可读可写条件

    欢迎转载,转载请注明原文地址:http://blog.csdn.net/majianfei1023/article/details/45788591 socket可读可写条件,经常做为面试题被问,因为 ...

  2. 网络编程学习笔记(TCP回射服务器程序修订版)

    服务器端: #include <sys/socket.h> #include <stdio.h> #include <netinet/in.h> #include ...

  3. Linux 网络编程学习笔记——三、TCP 协议详解

    目录 一.TCP 服务的特点 传输层协议主要有 TCP 协议和 UDP 协议,前者相对于后者的特点是:面向连接.字节流和可靠传输. 使用 TCP 协议通信的双方必须先建立连接,然后才能开始数据的读写. ...

  4. java 网络编程学习笔记

    java 网络编程学习笔记 C/S模式:客户端和服务器 客户端创建流程 1 1.建立Socket端点 2 3 Socket s = new Socket(绑定地址, 绑定端口); 2.确认源数据方式和 ...

  5. 15Java网络编程学习笔记

    Java网络编程学习笔记 文章目录 1 网络基础 1.1 网络通信 1.2 网络 1.3 IP地址 1.5 域名 1.6 端口号 1.7 网络通信协议 1.8 TCP协议 1.9 UDP协议 2 In ...

  6. [Linux网络编程学习笔记]索引

    一.Linux基本知识 [学习笔记]Linux平台的文件I/O操作 [学习笔记]Linux平台的文件,目录及操作 [Linux学习笔记]标准输入输出 [Linux学习笔记]进程概念及控制 [Linux ...

  7. 编程开发:Linux网络编程学习笔记

    非常全面.通俗易懂.值得借鉴的Linux网络编程学习笔记.关键字:linux linux编程 网络编程 linux网络编程 下载地址:点我下载 特别说明:本资源收集于网络,版权归原作者及版权商所有,仅 ...

  8. python网络编程学习笔记(二)

    python网络编程学习(四) 多用途客户端协议 一.ftp 功能:上传下载文件,删除命名文件,建立删除目录,自动压缩,保存目录 1.代码: #coding=utf-8 '''连接远程ftp服务器,显 ...

  9. python的messagebox的用法_Python GUI编程学习笔记之tkinter中messagebox、filedialog控件用法详解...

    本文实例讲述了Python GUI编程学习笔记之tkinter中messagebox.filedialog控件用法.分享给大家供大家参考,具体如下: 相关内容: messagebox 介绍 使用 fi ...

最新文章

  1. linux停止ftp服务命令,centos没有service命令,怎么启用ftp服务
  2. Jquery-zTree的基本用法
  3. linux selenium_每天进步一点点 selenium+python
  4. hdu1.3.2 Rank
  5. 【转】后勤自动过帐(OBYC)详细配置说明
  6. 【Linux】一步一步学Linux——hostname命令(73)
  7. 【.NET架构】BIM软件架构02:Web管控平台后台架构
  8. MySQL8.0 · 优化器新特性 · Cost Model, 直方图及优化器开销优化
  9. Magicodes.IE之导入学生数据教程
  10. 关于一些html和css2的知识点
  11. 东南大学王萌 | “神经+符号”学习与多模态知识发现
  12. 改改Python代码,运行速度还能提升6万倍,Science:先别想摩尔定律了
  13. 华为Mate X2再曝光:全新向内折叠方案 有望彻底消除折痕
  14. HDU 3952 Fruit Ninja
  15. 蓝桥杯 BASIC-10 基础练习 十进制转十六进制
  16. 电能质量分析仪安装(access数据库版本 /WIN10系统) 出现
  17. 帆软Tab控件与控制组件隐藏的异同点
  18. 9102,用原生js造一个轮播组件
  19. 阿里云端安装mysql
  20. adb调试工具下载使用

热门文章

  1. java编程数据溢出问题_Java数据溢出代码详解
  2. python哨兵循环_Python中的Sentinel(哨兵)值
  3. 解决IntelliJ IDEA 2019.3.5 启动无反应
  4. Servlet HTTP Status 405 - HTTP method GET is not supported by this URL
  5. 计算机专业可以用台式机吗,Win10X电脑操作系统可以装在台式机吗?
  6. Mybatis更新和删除数据
  7. 大学阶段总结——大一
  8. Even Number Theory
  9. java的流对象和一些方法
  10. 日志 查看匹配内容的前后几行