socket本地模拟TCP 服务器+客户端(二)
建立两个py文件,分别打开两个cmd界面,即可进行通信。服务器端运用多进程,连续不断的处理从客户端接收到的数据;客户端通过一个list不断给客户端发送数据。
(每个连接都必须创建新线程(或进程)来处理,否则,单线程在处理连接的过程中,无法接受其他客户端的连接。)本例中,多进程其实没有起到作用。
代码以及解释如下:
# 服务器端
# 1 创建套接字,绑定套接字到当地地址,然后开始监听连接。就是socket,bind,listen。
# 2 进入循环,不断接受客户端的连接请求,然后接收传来的数据,当然也可以发送给对方数据。就是accept一个连接,然后recv数据。
# 3 接收完毕可以关闭套接字,close。
# 这个过程的伪代码如下:
ss=socket() #创建服务器套接字
ss.bind() #把本地地址绑到套接字上
ss.listen() #监听连接
inf_loop: #服务器无限循环
cs=ss.accept() #接受客户端的连接
comm._loop: #通信循环
cs.recv()/cs.send() #对话
cs.close() #关闭客户套接字
ss.close() #关闭服务器套接字
#客户端
# 1 创建套接字,然后连接远端地址,socket ,connect。
# 2 建立连接之后开始发送数据。Send(data),当然可以从缓冲区读取服务器发来的数据。Recv(BUFF)
# 3 完毕后,关闭套接字。Close
# 伪代码如下:
cs=socket() #创建客户套接字
cs.connect() #尝试连接服务器
comm._loop: #通信循环
cs.send()/cs.recv() #对话
cs.close() #关闭套接字
#socket服务器端程序
import socket
import time
from multiprocessing import Process #多进程和多线程一样的用法 def tcplink(sock1,addr1): #新建一个函数,用来接收客户端发来的信息
print('Accept new connection......')
sock1.send(b'welcom') #若连接建立成果,服务器给客户端发送一个welcome
while 1: #服务器持续接收客户端发送过来的数据,直到服务器收到exit时,退出不在接收数据
data = sock1.recv(1024) #接收数据
time.sleep(1) #延时1s '''data为客户端发送给服务器的数据,服务器给客户端发送hello,%data ,全部转为utf-8编码'''
sock1.send(('hello,%s'%data.decode('utf-8')).encode('utf-8')) if not data or data.decode('utf-8') == 'exit':
break sock1.close() #连接关闭
print('connection form %s is close....'%addr1) if __name__ == "__main__":
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #建立一个套接字
'''监听端口127.0.0.1表示客户端和服务器必须都为本机才能运行。
我们要绑定监听的地址和端口。服务器可能有多块网卡,可以绑定到
某一块网卡的IP地址上,也可以用0.0.0.0绑定到所有的网络地址,还
可以用127.0.0.1绑定到本机地址。127.0.0.1是一个特殊的IP地址,表
示本机地址,如果绑定到这个地址,客户端必须同时在本机运行才能连接
,也就是说,外部的计算机无法连接进来。端口号需要预先指定。因为我
们写的这个服务不是标准服务,所以用9999这个端口号。请注意,小于1024
的端口号必须要有管理员权限才能绑定:'''
s.bind(('127.0.0.1', 9999)) #绑定端口 s.listen(1) #同时接收连接的最大数量
print('Waiting for connecting......') while 1: #服务器通过一个循环来一直接收来之客户端发送的信息
sock,addr = s.accept() #s.accept返回两个数据
t = Process(target=tcplink,args=(sock,addr)) #多线程
t.start() #开启多线程
#socket客户端程序
#同chenhang001.py
import socket s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) #新建一个套接字
s.connect(('127.0.0.1',9999)) #建立连接,为什么是双括号 print(s.recv(1024).decode('utf-8')) #打印接收到的数据 #发送数据,定义一个list,
for data111 in [b'chenhang',b'wangyadan',b'wuhankejidaxue',b'wuchangfenxiao']:
s.send(data111)
print(s.recv(1024).decode('utf-8'))
# for a in range(100):
# s.send(b(a)) s.send(b'exit') #发送exit字符,服务器退出接收数据
socket本地模拟TCP 服务器+客户端(二)的更多相关文章
- socket本地模拟UDP 服务器+客户端(三)
UDP: TCP是建立可靠连接,并且通信双方都可以以流的形式发送数据.相对TCP,UDP则是面向无连接的协议. 使用UDP协议时,不需要建立连接,只需要知道对方的IP地址和端口号,就可以直接发数据包. ...
- 运用socket实现简单的服务器客户端交互
Socket解释: 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket. Socket的英文原义是“孔”或“插座”.作为BSD UNIX的进程通信机制,取后一种意 ...
- socket编程实现tcp服务器_C/C++
1. 需求分析 实现一个回声服务器的C/S(客户端client/服务器server)程序,功能为客户端连接到服务器后,发送一串字符串,服务器接受信息后,返回对应字符串的大写形式给客户端显示. 例如: ...
- TCP服务器/客户端代码示例
TCP服务器代码: #include <errno.h> #include <string.h> #include <stdlib.h> #include < ...
- Linux系统编程(32)—— socket编程之TCP服务器与客户端
TCP协议的客户端/服务器程序的一般流程 服务器调用socket().bind().listen()完成初始化后,调用accept()阻塞等待,处于监听端口的状态,客户端调用socket()初始化后, ...
- Linux系统编程(34)—— socket编程之TCP服务器与客户端的交互
前面几篇中实现的client每次运行只能从命令行读取一个字符串发给服务器,再从服务器收回来,现在我们把它改成交互式的,不断从终端接受用户输入并和server交互. /* client.c */ #in ...
- socket编程 ------ 建立 TCP 服务器和客户端流程(阻塞方式)
服务器端: 服务器端先创建一个socket,然后把这个socket绑定到端口上,接着让它向tcp/ip协议栈请求一个监听服务并创建一个accept队列来接受客户端请求. void creat_tcpS ...
- Linux系统编程(35)—— socket编程之TCP服务器的并发处理
我们知道,服务器通常是要同时服务多个客户端的,如果我们运行上一篇实现的server和client之后,再开一个终端运行client试试,新的client就不能能得到服务了.因为服务器之支持一个连接. ...
- 【Echo】实验 -- 实现 C/C++下TCP, 服务器/客户端 通讯
本次实验利用TCP/IP, 语言环境为 C/C++ 利用套接字Socket编程,实现Server/CLient 之间简单的通讯. 结果应为类似所示: 下面贴上代码(参考参考...) Server 部分 ...
随机推荐
- C++使用模版技术将任意类型的数据转为某个类型的数据
将任意类型(int, float, 自定义的数据类型等等)的数据转换的某个类型C中储存,可以通过 将类型C的构造函数写成模版函数的形式,在C中将可以接收任意类型数据.如: class C{ templ ...
- POJ 3208 Apocalypse Someday
题意: 将含有连续的三个6的数称为不吉利数,比如666,1666,6662,但是6266吉利.则666为第一个不吉利数,输入整数n,求第n个不吉利数.(n <= 5*10^7) 解法: 如果是给 ...
- ACM编程网站
ACM:ACM国际大学生程序设计竞赛(英文全称:ACM International Collegiate ProgrammingContest(ACM-ICPC或ICPC)是由美国计算机协会(ACM) ...
- selenium python presence_of_element_located vs visibility_of_element_located
背景: 用WebDriverWait时,一开始用的是presence_of_element_located,我对它的想法就是他就是用来等待元素出现.结果屡屡出问题.元素默认是隐藏的,导致等待过早的就结 ...
- Best Reward HDU 3613(回文子串Manacher)
题目大意:有一个串(全部由小写字母组成),现在要把它分成两部分,如果分开后的部分是回文串就计算出来它的价值总和,如果不是回文的那么价值就是0,最多能得到的最大价值. 分析:首先的明白这个最大价值有 ...
- FC和SCSI
IDE(Integrated Drive Electronics)即"电子集成驱动器",它的本意是指把"硬盘控制器"与"盘体"集成在一起的硬 ...
- Intellij 快捷键大全
Intellij IDEA的快捷键非常好用,能大大提高我们的开发速度.这里列举了一些常用的快捷键. 快速查找: Ctrl+N 查找类 Ctrl+R 替换当前窗口的文本 Ctrl+F 当前代码中查 ...
- 学习AngularJs:Directive指令用法
跟我学AngularJs:Directive指令用法解读(上) http://blog.csdn.net/evankaka/article/details/51232895 跟我学AngularJs: ...
- 如何看懂Code128条形码
条形码就是我们看到的商品上有的那些竖条条. 要不是项目上用到这个或许我一辈子也不会对那个感兴趣. 条形码其实是分成很多类的,虽然他们看起来都差不多…… 常见的条形码的码制被称为39码.128码.417 ...
- DFU工作过程中USB机制
在一级bootloader执行进入USB启动方式之后,设备进行枚举.枚举过程中会通过PC端发送命令对连接的USB设备进行枚举.当枚举成功之后,在PC端可以看到设备的盘符. 当设备能够被PC正确识别之后 ...