How do you open a network connection?
Sockets are the basis of any network communication in your computer.
If you open a website, a socket is created in the background. The same thing applies to chat applications or any other network application.
Packets are delivered to another computer using a layered model: the TCP/IP model.
Every layer of the TCP/IP model has a certain purpose.
The application layers responsibility is solely the communication language between two applications.
Sockets work on the application protocol layer. Applications often have their own protocols, which in turn use sockets in the background.
If you want to make your own application protocol (chat system or other purposes) you can use sockets.
Make a socket application?
We will create a simple socket client, that mimics a webbrowser. The web uses port 80. The steps a webbrowser does to get a webpage are:
- create socket
- get server ip address from domain name
- connect to server using ip address
- send request to server
- receive data (webpage)
In code that will look like:Of course all data returned will be shown as the raw html (no images, css etc).
# Socket client example in python
host = 'www.pythonprogramminglanguage.com'
port = 80 # web
# create socket
print('# Creating socket')
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print('Failed to create socket')
print('# Getting remote IP address')
remote_ip = socket.gethostbyname( host )
print('Hostname could not be resolved. Exiting')
# Connect to remote server
print('# Connecting to server, ' + host + ' (' + remote_ip + ')')
s.connect((remote_ip , port))
# Send data to remote server
print('# Sending data to server')
request = "GET / HTTP/1.0\r\n\r\n"
print 'Send failed'
# Receive data
print('# Receive data from server')
reply = s.recv(4096)
Do you want to make a socket server app?
A server can be created using the module socket.
If you make a socket server, you can define your own application protocol. You can also use it to work with existing apps.
Sockets work on the application layer, it does not specify any protocol and on this level you’d define an application protocol yourself.
bind socket to port start listening
wait for client receive data
The example below starts a socket server on port 7000. You can use telnet or a socket client to connect to this port.
Once run, a server will be running on localhost port 7000.
# Socket created
Once running it will wait for messages. To connect with it, use telnet or modify the socket client from the previous section.
The module telnetlib implements the telnet protocol. Telnet is a protocol used on the Internet or local area networks, its used for bidirectional interactive text-oriented communication.
Telnet is a low level protocol, in the sense that we can implement application level protocols on top of it like HTTP or FTP.
We use the telnetlib module to do the network logic. All we have to do is connect to the server on the right network port, send the message as bytes (default is unicode in Python3) and wait for reply.
In this small example we implement a message of the HTTP protocol, then request the page index.html. we encode the message to ascii using the line:
Telnet essentially is a byte-level connection, we can implement many application level protocols on top of it, HTTP is just one of them.
We can download data using the urllib2 module.. These examples work with both http, https and for any type of files including text and image.
Data will be saved in the same directory as your program resides. This means if you run your program from C:\apps\, images will be saved there too unless you explicitly specify another directory.
Download data to variable
To download data to a variable, you can use this code:
The first line, ‘import urllib2’, loads the module. The second line opens the connection to the url. The method response.read() downloads data from the url and stores it into the variable data.
Download text file
To download a file you can use this code:
Download image file
Downloading an image from the web works in the same way:
Read gmail with Python?
The poplib module can be used to download mails from an email server such as gmail.
The protocol used between your computer and the email server is called POP (Post Office Protocol). This protocol can not send mail.
First enable POP support in gmail. .
We can conect with gmail using:
Read gmail messages using this code:
We login with the first block. We get all items on the server using server.list(). We go on downloading the first message in the list and finally output it. If you want to output the message data simply uncomment the line message.fp.read()
[sociallocker id=”2511”] Download read-gmail.zip [/sociallocker]