博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Code a simple telnet client using sockets in python
阅读量:5963 次
发布时间:2019-06-19

本文共 4652 字,大约阅读时间需要 15 分钟。

 

 测试端口是否开放的python脚本

原文: 

配置: 120.79.14.81:81/test.php 下面会返回数据。

telnet 80 不能获取到81端口下的web服务的数据。

telnet 81 就可以发送数据了,

nginx 的access.log的日志:

 

--------------------------------------------------------------------

The telnet client is a simple commandline utility that is used to connect to socket servers and exchange text messages. Here is an example of how to use telnet to connect to google.com and fetch the homepage.

 
$ telnet google.com 80

The above command will connect to google.com on port 80.

$ telnet google.com 80Trying 74.125.236.69...Connected to google.com.Escape character is '^]'.

Now that it is connected, the telnet command can take user input and send to the server, and whatever the server replies with, will be displayed on the terminal. For example send the http GET command and hit enter twice.

GET / HTTP/1.1

Sending the above will generate some response from the server. Now we are going to make a similar telnet program in python. The program is short and simple. To implement a program that takes user input and fetches results from the remote server at the same, requires somekind of parallel processing. Now the obvious solution to this is to use threads. One thread to keep receiving message from server and another to keep taking in user input. But there is another way to do this apart from threads. And that is select function. Select function allows to monitor multiple sockets/streams for readability and will generate an even if any of the sockets is ready.

Lets take a look at the full code. Its less than 50 lines including comments.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# telnet program example
import
socket, select, string, sys
 
#main function
if
__name__
=
=
"__main__"
:
     
    
if
(
len
(sys.argv) <
3
) :
        
print
'Usage : python telnet.py hostname port'
        
sys.exit()
     
    
host
=
sys.argv[
1
]
    
port
=
int
(sys.argv[
2
])
     
    
s
=
socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    
s.settimeout(
2
)
     
    
# connect to remote host
    
try
:
        
s.connect((host, port))
    
except
:
        
print
'Unable to connect'
        
sys.exit()
     
    
print
'Connected to remote host'
     
    
while
1
:
        
socket_list
=
[sys.stdin, s]
         
        
# Get the list sockets which are readable
        
read_sockets, write_sockets, error_sockets
=
select.select(socket_list , [], [])
         
        
for
sock
in
read_sockets:
            
#incoming message from remote server
            
if
sock
=
=
s:
                
data
=
sock.recv(
4096
)
                
if
not
data :
                    
print
'Connection closed'
                    
sys.exit()
                
else
:
                    
#print data
                    
sys.stdout.write(data)
             
            
#user entered a message
            
else
:
                
msg
=
sys.stdin.readline()
                
s.send(msg)
 

Small program! Just run it in a terminal like this

$ python telnet.py google.com 80Connected to remote host

Once connected it shows the connected message. Once the message pops up, its time to type in some message to send to the remote server. Type the same GET message and send by hitting enter twice. Some response should be generated.

The above program does the task of listening for message from remote server and listening for user input at the same time, and without threads.

1
2
3
4
socket_list
=
[sys.stdin, s]
         
# Get the list sockets which are readable
read_sockets, write_sockets, error_sockets
=
select.select(socket_list , [], [])

The socket list contains 2 sockets. First is the sys.stdin which is stream for standard input or the user input at the command line. The other one is the socket that is connected to remote server. The select function keeps listening on both of them. It is a blocking function and returns if either of the 2 things happens

1. Server sends a message2. User hits enter after typing in a message

If the server socket is ready to be read, then just call recv function on it. If the user input is ready to be read then call sys.stdin.readline() function get the user message. Thats all about it.

The telnet client shown above is a minimal one. The actual telnet client has lots of other features which you can try to implement. The above telnet client can be used as a terminal chat client as well with little modifications. Just have to write a chat server. Will come up with a post on that soon.

Note

The above shown program will work only on linux and not on windows. The program uses the select function read the command line input (stdin). On windows the select function cannot read file descriptors. It can only read sockets created inside winsock. The python documentation on function mentions this

File objects on Windows are not acceptable, but sockets are. On Windows, the underlying select() function is provided by the WinSock library, and does not handle file descriptors that don’t originate from WinSock.
Last Updated On : 15th May 2013

转载地址:http://gvjax.baihongyu.com/

你可能感兴趣的文章
Python高效编程技巧
查看>>
js中var self=this的解释
查看>>
Facebook 接入之获取各个配置参数
查看>>
linux的日志服务器关于屏蔽一些关键字的方法
查看>>
事情的两面性
查看>>
只要会营销,shi都能卖出去?
查看>>
sed单行处理命令奇偶行输出
查看>>
VC++深入详解学习笔记1
查看>>
安装配置discuz
查看>>
线程互互斥锁
查看>>
KVM虚拟机&openVSwitch杂记(1)
查看>>
win7下ActiveX注册错误0x80040200解决参考
查看>>
《.NET应用架构设计:原则、模式与实践》新书博客--试读-1.1-正确认识软件架构...
查看>>
2013 Linux领域年终盘点
查看>>
linux学习之查看程序端口占用情况
查看>>
相逢在栀枝花开的季节
查看>>
linux下git自动补全命令
查看>>
Ubuntu14.04LTS更新源
查看>>
Linux报“Unknown HZ value! (288) Assume 100”错误
查看>>
mysql多实例实例化数据库
查看>>