建立两个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 服务器+客户端(二)的更多相关文章

  1. socket本地模拟UDP 服务器+客户端(三)

    UDP: TCP是建立可靠连接,并且通信双方都可以以流的形式发送数据.相对TCP,UDP则是面向无连接的协议. 使用UDP协议时,不需要建立连接,只需要知道对方的IP地址和端口号,就可以直接发数据包. ...

  2. 运用socket实现简单的服务器客户端交互

    Socket解释: 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket. Socket的英文原义是“孔”或“插座”.作为BSD UNIX的进程通信机制,取后一种意 ...

  3. socket编程实现tcp服务器_C/C++

    1. 需求分析 实现一个回声服务器的C/S(客户端client/服务器server)程序,功能为客户端连接到服务器后,发送一串字符串,服务器接受信息后,返回对应字符串的大写形式给客户端显示. 例如: ...

  4. TCP服务器/客户端代码示例

    TCP服务器代码: #include <errno.h> #include <string.h> #include <stdlib.h> #include < ...

  5. Linux系统编程(32)—— socket编程之TCP服务器与客户端

    TCP协议的客户端/服务器程序的一般流程 服务器调用socket().bind().listen()完成初始化后,调用accept()阻塞等待,处于监听端口的状态,客户端调用socket()初始化后, ...

  6. Linux系统编程(34)—— socket编程之TCP服务器与客户端的交互

    前面几篇中实现的client每次运行只能从命令行读取一个字符串发给服务器,再从服务器收回来,现在我们把它改成交互式的,不断从终端接受用户输入并和server交互. /* client.c */ #in ...

  7. socket编程 ------ 建立 TCP 服务器和客户端流程(阻塞方式)

    服务器端: 服务器端先创建一个socket,然后把这个socket绑定到端口上,接着让它向tcp/ip协议栈请求一个监听服务并创建一个accept队列来接受客户端请求. void creat_tcpS ...

  8. Linux系统编程(35)—— socket编程之TCP服务器的并发处理

    我们知道,服务器通常是要同时服务多个客户端的,如果我们运行上一篇实现的server和client之后,再开一个终端运行client试试,新的client就不能能得到服务了.因为服务器之支持一个连接. ...

  9. 【Echo】实验 -- 实现 C/C++下TCP, 服务器/客户端 通讯

    本次实验利用TCP/IP, 语言环境为 C/C++ 利用套接字Socket编程,实现Server/CLient 之间简单的通讯. 结果应为类似所示: 下面贴上代码(参考参考...) Server 部分 ...

随机推荐

  1. varnish esi出现no esi processing, first char not ‘<’的错误处理方式

    大致意思是varnish的ESI使用mod_deflate来处理可以接受含有请求头Accept-Encoding的请求,这样转发到后端服务器后,后端服务器返回的响应内容就不是一个格式良好的XML或ht ...

  2. [Sequence Alignment Methods] Smith–Waterman algorithm

    Smith–Waterman algorithm 首先需要澄清一个事实,Smith–Waterman algorithm是求两个序列的最佳subsequence匹配,与之对应的算法但是求两个序列整体匹 ...

  3. SRM 506(2-1000pt)

    DIV2 1000pt 题意:一个由n*m的网格组成的棋盘,有四种点,'.'表示空点,'#'表示是墙不能走,'$'表示起点(同样是空点),'1'~'9'表示该点有复活时间为t的怪兽.每次,可以从一个点 ...

  4. mysql备份数据库

    需求: 1,每天4点备份mysql数据: 2,为节省空间,删除超过3个月的所有备份数据: 3,删除超过7天的备份数据,保留3个月里的 10号 20号 30号的备份数据: #创建shell文件 vim  ...

  5. angularJS $watch $digest $apply

    一 简介AngularJS提供了一个非常酷的特性叫做双向数据绑定(Two-way Data Binding),这个特性大大简化了我们的代码编写方式.数据绑定意味着当View中有任何数据发生了变化,那么 ...

  6. Android下 scrollview的滚动停止事件的监听方法

    使用递归调用的方法,每隔5毫秒检查一下是否已经停止,如果已经停止,就拿到事件啦! 不扯蛋,直接上代码. scrollContent就是我的scrollview. [代码]java代码: ? 1 2 3 ...

  7. Swoole源代码学习记录(十五)——Timer模块分析

    swoole版本号:1.7.7-stable Github地址:点此查看 1.Timer 1.1.swTimer_interval_node 声明: // swoole.h 1045-1050h ty ...

  8. 【转】仿Android 联系人SideBar排序,根据拼音A-Z字母快速导航,以及输入搜索条件过滤,显示姓名的文字图片

    1.首先我们把这几个工具类拷贝到自己的项目中,这些都是很常见的类: CharacterParser       –这是用来把中文转成拼音的工具类 PinyinComparator   –拼音首字母的比 ...

  9. 重新启动linux上的tomcat

    1.进入tomcat安装文件夹 2.cd bin 3../shutdown.sh 4../startup.sh

  10. 把安卓源代码中的system app独立出来,像开发普通app那样开发

          个人建议首先依照android源码的ide/eclipse中的格式化xml和import导入到你编译的eclipse中,假设你编译的android源码是2.3以上的版本号的,建议用JDK6 ...