我正在开发一个涉及通过TCP发送数据的项目.使用ThreadedTCPServer我已经能够做到这一点.服务器线程只需要读取传入的数据字符串并设置变量的值.同时我需要主线程来查看那些变量值的变量.到目前为止,这是我的代码,只是从ThreadedTCPServer示例修改:
import socket
import threading
import SocketServer
x =0
class ThreadedTCPRequestHandler(SocketServer.BaseRequestHandler):
def handle(self):
data = self.request.recv(1024)
# a few lines of code in order to decipher the string of data incoming
x = 0, 1, 2, etc.. #depending on the data string it just received
class ThreadedTCPServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer):
pass
if __name__ == "__main__":
# Port 0 means to select an arbitrary unused port
HOST, PORT = 192.168.1.50, 5000
server = ThreadedTCPServer((HOST, PORT), ThreadedTCPRequestHandler)
# Start a thread with the server …
Run Code Online (Sandbox Code Playgroud) 我使用python的threding模块创建了一个简单的多线程tcp服务器.每次连接新客户端时,此服务器都会创建一个新线程.
#!/usr/bin/env python
import socket, threading
class ClientThread(threading.Thread):
def __init__(self,ip,port):
threading.Thread.__init__(self)
self.ip = ip
self.port = port
print "[+] New thread started for "+ip+":"+str(port)
def run(self):
print "Connection from : "+ip+":"+str(port)
clientsock.send("\nWelcome to the server\n\n")
data = "dummydata"
while len(data):
data = clientsock.recv(2048)
print "Client sent : "+data
clientsock.send("You sent me : "+data)
print "Client disconnected..."
host = "0.0.0.0"
port = 9999
tcpsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tcpsock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
tcpsock.bind((host,port))
threads = []
while True:
tcpsock.listen(4)
print "\nListening for incoming …
Run Code Online (Sandbox Code Playgroud) 作为无法绑定到地址后套接字程序崩溃的后续操作,我在重新启动程序后收到此错误:
socket.error:[Errno 98]地址已被使用
在这种特殊情况下,程序不是直接使用套接字,而是启动自己的线程TCP服务器:
httpd = SocketServer.ThreadingTCPServer(('localhost', port), CustomHandler)
httpd.serve_forever()
Run Code Online (Sandbox Code Playgroud)
我该如何修复此错误消息?
我正在用C#编写客户端/服务器应用程序,而且它很棒.现在,一切正常,而且非常强大.我的问题是,当通过连接发送数据包时,我遇到了一些延迟.
在客户端我这样做:
NetworkStream ns = tcpClient.GetStream();
// Send packet
byte[] sizePacket = BitConverter.GetBytes(request.Length);
byte[] requestWithHeader = new byte[sizePacket.Length + request.Length];
sizePacket.CopyTo(requestWithHeader, 0);
request.CopyTo(requestWithHeader, sizePacket.Length);
ns.Write(requestWithHeader, 0, requestWithHeader.Length);
// Receive response
ns.Read(sizePacket, 0, sizePacket.Length);
int responseLength = BitConverter.ToInt32(sizePacket, 0);
byte[] response = new byte[responseLength];
int bytesReceived = 0;
while (bytesReceived < responseLength)
{
int bytesRead = ns.Read(response, bytesReceived, responseLength - bytesReceived);
bytesReceived += bytesRead;
}
Run Code Online (Sandbox Code Playgroud)
(遗漏了一些异常捕获等)服务器执行相反的操作,即它在NetworkStream.Read()上阻塞,直到它有一个完整的请求,然后处理它并使用Write()发送响应.
Write()/ Read()的原始速度不是问题(即发送大数据包很快),但是在不关闭连接的情况下一个接一个地发送几个小数据包可能非常慢(延迟50-100)女士).奇怪的是,这些延迟出现在LAN连接上,典型的ping时间<1 ms,但如果服务器在localhost上运行则不会发生,即使ping时间实际上是相同的(至少差异不应该是大约100毫秒).如果我在每个数据包上重新打开连接,导致大量握手,那对我来说是有意义的,但我不是.这就好像服务器进入等待状态会使它与客户端失去同步,然后在重新建立本质上是丢失的连接时发现它有点绊倒.
那么,我做错了吗?有没有办法保持TcpServer和TcpClient之间的连接同步,以便服务器随时准备接收数据?(反之亦然:有时处理来自客户端的请求需要几毫秒,然后客户端似乎没有准备好接收来自服务器的响应,直到它在Read()上阻塞之后有一些时刻被唤醒.)
对于学校作业,我试图使用Ruby和套接字库创建一个简单的HTTP服务器.
现在,我可以通过一个简单的问候来响应任何连接:
require 'socket'
server = TCPServer.open 2000
puts "Listening on port 2000"
loop {
client = server.accept()
resp = "Hello?"
headers = ["HTTP/1.1 200 OK",
"Date: Tue, 14 Dec 2010 10:48:45 GMT",
"Server: Ruby",
"Content-Type: text/html; charset=iso-8859-1",
"Content-Length: #{resp.length}\r\n\r\n"].join("\r\n")
client.puts headers
client.puts resp
client.close
}
Run Code Online (Sandbox Code Playgroud)
这按预期工作.但是,当我让服务器告诉我谁刚刚连接
puts "Client: #{client.addr[2]}"
Run Code Online (Sandbox Code Playgroud)
并使用Chromium(浏览器)连接localhost:2000/
(只需一次),我得到:
Client: 127.0.0.1
Client: 127.0.0.1
Client: 127.0.0.1
Client: 127.0.0.1
Run Code Online (Sandbox Code Playgroud)
我假设这是Chromium请求辅助文件,favicon.ico
而不是我的脚本做一些奇怪的事情,所以我想调查传入的请求.我换了resp = "Hello?"
一行
resp = client.read()
Run Code Online (Sandbox Code Playgroud)
并重新启动服务器.我对Chromium的请求表示不满,而不是立即回来,它只是挂了.同时,我Client: 127.0.0.1
在服务器输出中得到了输出.我点击了Chromium中的"停止"按钮,然后服务器崩溃了
server.rb:16:in `write': Broken pipe (Errno::EPIPE) …
Run Code Online (Sandbox Code Playgroud) 我有点被困在我的项目中,我迫切需要帮助.我需要一个简单的TCP服务器python代码,它具有日志和时间戳等功能,我可以用于我的Raspberry Pi.它是我的最后一年项目.
我看了一些例子,但由于我在编写自己的脚本/代码方面没有太多经验,所以我不太清楚如何去做.如果有人可以通过解释和一些例子(如果可能的话)指导我正确的方向,我将不胜感激.
我正在使用HERCULES SETUP UTILITY,它充当我的TCP客户端,而我的visual studio python代码充当SERVER.我的SERVER可以接收客户端发送的数据,我现在似乎无法添加一个日志文件,可以将发送的数据保存到文本文件中.有人请给我一些例子或者说明一下吗?你的帮助意味着很多.到目前为止这是我的代码:
from socket import *
import thread
BUFF = 1024 # buffer size
HOST = '172.16.166.206'# IP address of host
PORT = 1234 # Port number for client & server to recieve data
def response(key):
return 'Sent by client'
def handler(clientsock,addr):
while 1:
data = clientsock.recv(BUFF) # receive data(buffer).
print 'data:' + repr(data) #Server to recieve data sent by client.
if not data: break #If connection is closed by client, server will break …
Run Code Online (Sandbox Code Playgroud) 我正在尝试学习如何使用epoll()
TCP 服务器应用程序,因为我期望有很多连接。
我尝试检查示例和教程,他们总是建议使用/设置添加epoll()
为非阻塞套接字的套接字。
为什么?
我已经编写了一个基本的tcp服务器工厂,服务器客户端和使用twisted的服务.tcp服务器充当django服务器和另一个程序之间的中间件(让我们称之为客户端程序).
我想要实现的目标 -
1. 客户端请求中间件 tcp服务器;
2.it发送一个字符串作为请求体;
3. 中间件 tcp服务器反序列化请求中的信息.
4. 中间件将序列化信息进一步发送到django服务器.
5.然后,django服务器响应中间件服务器,该服务器在序列化响应后进一步响应客户端.
我能够到达第3步,但无法向django服务器发出任何http请求.
以下是我的middleware.py
from twisted.internet.protocol import ServerFactory
from twisted.internet.protocol import Protocol
from test_service import MyService
class TCPServerProtocol(Protocol):
data = ''
def connectionMade(self):
self.deferred = self.factory.service.deferred
self.deferred.addCallback(self.factory.service.s)
self.deferred.addCallback(self.transport.write)
self.deferred.addBoth(lambda r: self.transport.loseConnection)
def dataReceived(self, data):
self.data += data
def connectionLost(self, reason):
self.forward(self.data)
def forward(self, data):
if self.deferred is not None:
d, self.deferred = self.deferred, None
d.callback(data) …
Run Code Online (Sandbox Code Playgroud) 我想问你,如何处理多个连接线程。
我已经通过以下方式实现了 TCP 服务器:
$endpoint = New-Object System.Net.IPEndPoint ([System.Net.IPAddress]::Any, 8989)
$listener = New-Object System.Net.Sockets.TcpListener $endpoint
$listener.Start()
do {
$client = $listener.AcceptTcpClient() # will block here until connection
$stream = $client.GetStream();
$reader = New-Object System.IO.StreamReader $stream
do {
$line = $reader.ReadLine()
Write-Host $line -fore cyan
} while ($line -and $line -ne ([char]4))
$reader.Dispose()
$stream.Dispose()
$client.Dispose()
} while ($line -ne ([char]4))
$listener.Stop()
Run Code Online (Sandbox Code Playgroud)
这段代码只能及时处理一个线程。你能给我一个关于如何在 PowerShell 中创建一个可以处理多个客户端的 TCP 服务器的建议吗?
我使用Node.js创建了一个TCP服务器,它监听客户端连接.我需要在Node.js中再次通过Websocket(socket.io)将数据从TCP服务器传输到HTTP服务器.
但是,我不知道如何创建这样的连接,以便TCP服务器能够通过Websocket将数据推送到HTTP服务器.
非常感谢.
tcpserver ×10
sockets ×4
python ×3
linux ×2
.net ×1
c# ×1
c++ ×1
epoll ×1
http ×1
httpserver ×1
logging ×1
node.js ×1
powershell ×1
python-2.6 ×1
python-2.7 ×1
raspberry-pi ×1
ruby ×1
socket.io ×1
tcp ×1
tcpclient ×1
twisted ×1
twisted.web ×1
websocket ×1