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 部分 ...
随机推荐
- 《algorithm puzzles》——谜题
这篇文章开始正式<algorithm puzzles>一书中的解谜之旅了! 狼羊菜过河: 谜题:一个人在河边,带着一匹狼.一只羊.一颗卷心菜.他需要用船将这三样东西运至对岸,然而,这艘船空 ...
- Struts2中OGNL
什么是OGNL OGNL:Object Graph Navigation Language 对象导航图语言 开源项目,取代页面中Java脚本,简化数据访问 和EL同属于表达式语言,但功能更为强大 让 ...
- .NET常用的扩展方法整理
using System; using System.Collections; using System.Collections.Generic; using System.Data; using S ...
- HDU 4287 Intelligent IME
Intelligent IME Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- 1031. Hello World for U (20)
题目链接:http://www.patest.cn/contests/pat-a-practise/1031 题目: 分析: 排版题.注意先计算好最后一排的字符数,然后计算前面几排的空格数.难度不大 ...
- 用PHP迭代器来实现一个斐波纳契数列(转)
斐波纳契数列通常做法是用递归实现,当然还有其它的方法.这里现学现卖,用PHP的迭代器来实现一个斐波纳契数列,几乎没有什么难度,只是把类里的next()方法重写了一次.注释已经写到代码中,也是相当好理解 ...
- java内存不足
-Xmx1024m -Xms1024m -XX:PermSize=128m -XX:MaxPermSize=512m ------------------------- 亲测可用
- java 良好开发规范
使用继承时,不要为了部分功能而去继承,老子就是这么傲娇! 2. 在类中,无参构造函数尽量写出来,可以减少很多不必要的错误. 因为一旦类中你 写出了带参的构造函数,那么系统就不会自动给出无参的构造函数 ...
- Oracle 安装中遇到的问题
第一次用甲骨文,这期待!虽然mySQL也是甲骨文的. 去官网下了Oracle G11 R2 X64,本人的电脑是64位的win7,没开防火墙. 按照网上众多的教程,做完安装,可是安装过程不是那么的顺利 ...
- windows服务状态自动启动
很多人制作成Windows服务安装包时发现明明在属性里面设置了自动启动,可在服务安装完成以后,还需要手动启动服务,我这里有一种完全实现自动启动的方法 在ProjectInstaller.cs 文件做文 ...