Python和TCL之间的套接字连接

审判与错误

我刚刚开始进行套接字编程。我想将客户端作为TCL,将服务器作为Python。我尝试了以下几个脚本,但无法取得任何进展。

这是我的脚本:

server.py

import socket
s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((socket.gethostname(), 45000))
s.listen(5)
while True:
    clt, adr=s.accept()
    print(adr)
    clt.send(bytes("Socket programming in Python"))

client.tcl

set host "127.0.0.1"
set port 45000 
set mysock [socket -myaddr $host -myport $port $host $port]
fconfigure $mysock -buffering none
gets $mysock line
close $mysock
puts "Message is $line"

但是,上面的TCL脚本只是挂起,并没有超出gets命令的范围。

这是等效的Python客户端脚本,可以运行:

client.py

import socket 
s=socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
print(s) 
s.connect((socket.gethostname(), 45000)) 
msg=s.recv(1024) 
print(msg.decode("utf-8")) 

现在基于一些建议,为了模仿TCL中的上述python客户端脚本,我尝试了以下操作:

client_modified.tcl

set s [socket [info hostname] 45000]
puts $s
fconfigure $s -translation binary
puts [encoding convertfrom utf-8 [read $s 28]]

我仍然无法继续:“ socket localhost 45000”。

它给了我错误:

> tclsh client.tcl 
couldn't open socket: connection refused
    while executing
"socket [info hostname] 45000"
    invoked from within
"set s [socket [info hostname] 45000]"

任何人都可以在这里指导。

多纳研究员

鉴于:

import socket 
s=socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
print(s) 
s.connect((socket.gethostname(), 45000)) 
msg=s.recv(1024) 
print(msg.decode("utf-8")) 

是一个正常工作的Python客户端,在Tcl中的等效项是:

set s [socket [info hostname] 45000]
puts $s
fconfigure $s -translation binary
puts [encoding convertfrom utf-8 [read $s 28]]; # You're writing 28 bytes, not 1024

但是我更倾向于写:

set s [socket localhost 45000]; # For complex reasons, [info hostname] takes a long time on macOS
fconfigure $s -encoding utf-8
puts [read $s 28]

请注意,如果通过套接字你写的文字数据,你真的应该还写换行符作为一个边界。在Tcl方面,这将使您使用gets而不是read;。如果没有换行符,gets则在默认阻止模式下,Tcl将无限期地等待它启动。(对于面向二进制的协议,如果这是变量,则可能首先发送数据长度。)

更复杂的版本使用非阻塞模式。除非您真的确定自己在做什么,否则非阻塞模式应专门用于fileevent回调:

set s [socket localhost 45000]
fconfigure $s -encoding utf-8 -blocking 0
fileevent $s readable {apply {{} {
    global s done
    puts [read $s 1024]
    # Remember to close that socket at EOF
    if {[eof $s]} {
        close $s
        set done "ok"; # Terminates the event loop running this
    }
}}}
vwait done; # Launch an event loop for processing the socket

如果您将消息写回到服务器,则可能需要进行设置,-buffering none以使您不必大惊小怪flush而且,如果您要进行复杂的对话,则可能需要使用协程进行管理;它们具有用于复杂编程的功能(并且存在一些支持库来提供帮助),这些功能使执行复杂协议变得非常简单。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Windows 和 Linux 之间的 Python 套接字连接

来自分类Dev

PHP和C ++之间的套接字连接

来自分类Dev

Raspberry Pi 之间的 Python 套接字连接

来自分类Dev

Java和Python之间的套接字连接-struct.unpack错误

来自分类Dev

python 多线程和套接字连接问题

来自分类Dev

Python套接字在主机和VM之间不起作用

来自分类Dev

Python套接字在主机和VM之间不起作用

来自分类Dev

Python,Windows 和 Raspberry pi 3 之间的套接字

来自分类Dev

Python套接字连接异常

来自分类Dev

Python套接字无法连接

来自分类Dev

python套接字拒绝连接

来自分类Dev

Python套接字重新连接

来自分类Dev

套接字未连接 Python

来自分类Dev

通过UNIX套接字在Node.JS和PHP之间进行连接-EPIPE写入错误

来自分类Dev

如何正确设置C#和Java之间的SSL套接字连接?

来自分类Dev

通过UNIX套接字在Node.JS和PHP之间进行连接-EPIPE写入错误

来自分类Dev

v9_client 和 v6_server 之间的 WMQ 连接套接字不断关闭

来自分类Dev

在Android中连接和断开套接字

来自分类Dev

在Android中连接和断开套接字

来自分类Dev

python套接字和epoll

来自分类Dev

套接字和线程python

来自分类Dev

套接字和线程python

来自分类Dev

python套接字和epoll

来自分类Dev

NetBIOS和套接字API之间的关系

来自分类Dev

NetBIOS和套接字API之间的关系

来自分类Dev

fcntl 和套接字之间的链接

来自分类Dev

在Python中打开SSL套接字连接

来自分类Dev

Python SimpleXMLRPCServer:套接字错误,连接被拒绝

来自分类Dev

如何关闭python中的套接字连接?