建立两个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. poj 3903 最长上升子序列 Stock Exchange

    题目链接:http://poj.org/problem?id=3903 #include <cstdio> #include <cmath> #include <algo ...

  2. sqlserver授予用户查看执行计划的权限

    sqlserver查看语句的执行计划是非常重要的,可以提高开发人员代码的质量.所以有必要授予开发人员对数据库查看执行计划的权限.   查看执行计划的权限属于数据库一级别的权限,具体例子如下   use ...

  3. kafka入门教程

    1.Kafka独特设计在什么地方?2.Kafka如何搭建及创建topic.发送消息.消费消息?3.如何书写Kafka程序?4.数据传输的事务定义有哪三种?5.Kafka判断一个节点是否活着有哪两个条件 ...

  4. Tips--8080端口被占用了怎么办

    下面以win7为例: 打开任务管理器   ctrl+alt+. 找到8080端口对应的PID 停止相应PID的进程即可:

  5. python urllib2详解及实例

    urllib2是Python的一个获取URLs(Uniform Resource Locators)的组件.他以urlopen函数的形式提供了一个非常简单的接口, 这是具有利用不同协议获取URLs的能 ...

  6. Python Logging 模块研究

    背景在一个新的项目里面加入了日志功能,想自己写一个,但是一个偶然的机会,通过google发现Python内建了一个非常强大的日志(log)模块:l... 背景 在一个新的项目里面加入了日志功能,想自己 ...

  7. SVN server的搭建

    当做大的项目是,svn是代码管理的好工具,假设是用自己的server,那么须要搭建SVNserver. Subversion是一款很优秀的svnserver工具,笔者採用VisualSVN serve ...

  8. Lucene中string docvalues使用utf-16的优化

    原来的string docvalues使用utf-8编码,载入时转码花费大量时间,我们把转码实现从new String(bytes, "UTF-8")改用lucene的bytesR ...

  9. 网络接口 使用NSURLConnection完成Get和Post方法

    网络接口 使用NSURLConnection完成Get和Post方法 什么是URL: URL就是统一资源定位器(UniformResourceLocator:URL).通俗地说,它是用来指出某一项信息 ...

  10. [转] Linux文件系统之hard link&symbol link

    这个图很清楚的表示出硬链接和软链接的方式. 1.硬链接: 基本定义:硬链接是有着相同inode号的仅文件名不同的文件(该文件名包含路径信息). 理解:如图,hard link和原始file通过同一个i ...