
正文
python中client,python中clientservice返回值
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
Python网络编程9-实现TCP三次握手与四次挥手
见TCP流量分析篇
TCP 流量分析 - (jianshu.com)
使用一台windows主机作为TCP Server,使用一台Linux作为TCP Client,发起TCP连接,发送数据,结束连接。
以下Python脚本通过Socket实现TCP Server端,接收TCP连接。
以下Python脚本通过Scapy实现TCP Client端,向Server端发起TCP连接。
首先在Windows主机上运行TCP Server脚本。
在linux主机上运行TCP Client脚本后,会将TCP交互过程打印出来。
通过科来的csna抓包,并追踪TCP流,如下为交互的数据包
相关问答
Q1: python怎么连接websocket
不知道是不是要server和client。
给一个例子,基于py27的聊天室,有server,同时client是用python模拟的,如果你想用js写,可以自己写一个
使用前先:
pip install websocket-client
然后运行server、client就可以了
websocket_server.py(服务端)
#-*- encoding:utf-8 -*-
import sys
sys.path.append("..")
from socket import *
import json, time, threading
reload(sys)
sys.setdefaultencoding("utf8")
config = {
'HOST': '127.0.0.1',
'PORT': 10010,
'LISTEN_CLIENT': 50,
'KEY': '391f10fadc339e9ec5fa15af60030ac1',
'SIZE': 2048,
'TIME_OUT': 10000,
'HEART_TIME': 5,
'MAGIC_STRING': '258EAFA5-E914-47DA-95CA-C5AB0DC85B11',
'HANDSHAKE_STRING': "HTTP/1.1 101 Switching Protocols\r\n" \
"Upgrade:websocket\r\n" \
"Connection: Upgrade\r\n" \
"Sec-WebSocket-Accept: {1}\r\n" \
"WebSocket-Location: ws://{2}/chat\r\n" \
"WebSocket-Protocol:chat\r\n\r\n"
}
class Server():
"""
服务端基类
"""
def __init__(self):
self.sock = socket(AF_INET, SOCK_STREAM)
self.sock.bind((config['HOST'], config['PORT'])) # 监听端口
self.sock.listen(config['LISTEN_CLIENT']) # 监听客户端数量
# 所有监听的客户端
self.clients = {}
self.thrs = {}
self.users = {}
self.stops = []
self.onlineusers=[]
# 监听客户端连接
def listen_client(self):
while 1:
# 循环监听
tcpClientSock, addr = self.sock.accept()
address = addr[0] + ':' + str(addr[1]) # ip:port
# 握手
topInfo = tcpClientSock.recv(1024)
headers = {}
if not topInfo:
self.onlineusers.remove(self.users[address])
tcpClientSock.close()
continue
header, data = topInfo.split('\r\n\r\n', 1)
try:
getInfo = header.split('\r\n')[0].split(' ')[1].split('/')[1:]
if getInfo[0] == 'name':
self.users[address] = str(getInfo[1])
self.onlineusers.append(self.users[address])
else:
self.users[address] = u'匿名用户'
except:
self.users[address] = u'匿名用户'
print "this is self.users[address]:"
print self.users[address]
for line in header.split('\r\n')[1:]:
key, val = line.split(': ', 1)
headers[key] = val
if 'Sec-WebSocket-Key' not in headers:
self.onlineusers.remove(self.users[address])
tcpClientSock.close()
continue
import hashlib, base64
sec_key = headers['Sec-WebSocket-Key']
res_key = base64.b64encode(hashlib.sha1(sec_key + config['MAGIC_STRING']).digest())
str_handshake = config['HANDSHAKE_STRING'].replace('{1}', res_key).replace('{2}', config['HOST'] + ':' + str(config['PORT']))
tcpClientSock.send(str_handshake)
# 握手成功 分配线程进行监听
print(address+u'进来了')
self.clients[address] = tcpClientSock
self.thrs[address] = threading.Thread(target=self.readMsg, args=[address])
self.thrs[address].start()
time.sleep(0.5)
def readMsg(self, address):
if address not in self.clients:
return False
client = self.clients[address]
import select
time_out = 0
while 1:
if address in self.stops:
self.close_client(address)
print(address + u'已经离开了系统!')
break
# 检测超时
if time_out = config['TIME_OUT']:
self.close_client(address)
break
time_out += 5
infds, outfds, errfds = select.select([client, ], [], [], 5)
if len(infds) == 0:
continue
time_out = 0
try:
info = client.recv(1024)
except:
self.close_client(address)
break
if not info:
continue
if info == 'quit':
self.close_client(address)
break
code_len = ord(info[1]) 127
if code_len == 126:
masks = info[4:8]
data = info[8:]
elif code_len == 127:
masks = info[10:14]
data = info[14:]
else:
masks = info[2:6]
data = info[6:]
i = 0
raw_str = ""
for d in data:
# print(masks, masks[i % 4])
raw_str += chr(ord(d) ^ ord(masks[i % 4]))
i += 1
print "this is raw_stryesthis is raw_str"
print repr(raw_str)
# 获取到输入的数据 向所有的客户端发送
# 开启线程记录
if raw_str:
t1 = threading.Thread(target=self.send_data, args=[raw_str, address])
t1.start()
time.sleep(0.5)
def onlineuser(self):
from urllib import unquote
username=[]
for i in self.onlineusers:
i=unquote(i).encode('utf8')
username.append(str(i))
return username
def send_data(self, data, address):
import struct
from urllib import unquote
try:
username =unquote(self.users[address])
except:
username = u'匿名用户'
'''封装数据'''
reply={}
if data:
data=data.split("}")[0]+"}"
data=json.loads(data);
'''如果有人加入的话,消息封装如下:'''
if data["type"]=="JOIN":
reply["type"]="JOIN"
reply["data"]=data["username"]
reply["user_from"]=data["username"]
reply["user"]=self.onlineuser()
'''如果有人发消息,判断是发送给全部还是个人'''
elif data["type"]=="POST":
reply["type"]="POST"
if data["sendto"]=="ALL":
reply["data"]="["+data['username']+"] : "+data["content"]
else:
reply["data"]=u"["+data['username']+"]悄悄对["+data["sendto"]+"]说:"+data["content"]
reply["user_from"]=data["username"]
reply["user"]=self.onlineuser()
reply["sendto"]=data["sendto"]
'''如果是退出的消息,封装如下'''
elif data["type"]=="QUIT":
self.close_client(address)
reply["type"]="QUIT"
reply["user_from"]=data["username"]
reply["user"]=self.onlineuser()
reply=json.dumps(reply)
else:
return False
token = "\x81"
length = len(reply)
if length 126:
token += struct.pack("B", length)
elif length = 0xFFFF:
token += struct.pack("!BH", 126, length)
else:
token += struct.pack("!BQ", 127, length)
# struct为Python中处理二进制数的模块,二进制流为C,或网络流的形式。
alldata = '%s%s' % (token, reply)
try:
#判断消息如果是私聊的,找出sendto和sendfrom进行单发
if data["type"]=="POST":
if data["sendto"]!="ALL":
for key,val in self.users.iteritems():
print key,unquote(val)
val=unquote(val)
if val==data["sendto"] or val==data["username"]:
print key
self.clients[key].send(alldata)
else:
for key,val in self.clients.iteritems():
client=val
try:
client.send(alldata)
except:
self.close_client(key)
else:
for key, val in self.clients.iteritems():
client = val
try:
client.send(alldata)
except:
self.close_client(key)
except:
pass
def close_client(self, address):
try:
client = self.clients.pop(address)
self.stops.append(address)
self.onlineusers.remove(self.users[address])
client.close()
del self.users[address]
except:
pass
print(address+u'已经退出')
if __name__ == '__main__':
s = Server()
s.listen_client()
websocket_client.py(客户端)
#-*- encoding:utf-8 -*-
import sys
sys.path.append("..")
from socket import *
import json, time, threading
from websocket import create_connection
reload(sys)
sys.setdefaultencoding("utf8")
# config = {
# 'HOST': '127.0.0.1',
# 'PORT': 10010
# }
#pip install websocket-client
class Client():
def __init__(self):
#调用create_connection方法,建立一个websocket链接
self.ws = create_connection("ws://127.0.0.1:10010/name/johanna")
#建一个线程,监听服务器发送给客户端的数据
self.trecv = threading.Thread(target=self.recv)
self.trecv.start()
#建立链接后,给聊天室大家群发一个加入消息
msg = {
"type":"JOIN",
"username":"johanna",
"content":"Hello Every,a new guy come in"
}
msg = json.dumps(msg)
self.ws.send(msg)
#发送方法,聊天输入语句时调用,此处默认为群聊ALL
def send(self,content):
msg={
"type":"POST",
"username":"johanna",
"sendto":"ALL",
"content":content
}
msg = json.dumps(msg)
self.ws.send(msg)
#接收服务端发送给客户的数据,只要ws处于连接状态,则一直接收数据
def recv(self):
try:
while self.ws.connected:
result = self.ws.recv()
print "received msg:"+str(result)
except Exception,e:
pass
#关闭时,发送QUIT方法,并告诉大家,我要走了
def close(self):
msg={
"type":"QUIT",
"username":"johanna",
"content":"byebye,everyone"
}
msg = json.dumps(msg)
self.ws.send(msg)
if __name__ == '__main__':
c= Client()
#当输入聊天语句非exit时,则持续聊天状态,如果exit,则关闭链接
while True:
content = raw_input("please input(input exit to exit):")
if content == "exit":
c.close()
break
else:
c.send(content)
time.sleep(1)
Q2: python中 tcpServer写的服务器端如何多线程连接多个client,并返回相应的连接后的socket以供事件驱动?
serve_forever本来不就有事件处理嘛,可以给每个socket开一个线程啊
Q3: Python,socket如何实现通过Server将client1的数据传给client2。
普通情况下是不行的。但是通过线程或者进程间的数据共享,还是可以的。
提供一个思路,使用多线程socketserver,针对每一个用户创建一个服务线程,然后在线程之间通过消息队列,共享数据。
参考:刘江的Python教程中关于多线程和多进程的章节
Q4: (python socket伪造client的ip地址) 有一python写的socket服务端只接受来自ip为169.
改不了。IP地址是来自路由器的。通常是欺骗路由器,或者是攻陷路由器才可以改IP地址。理论上讲,修改低层IP包可以改。实际上行不通。
关于python中client和python中clientservice返回值的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。








