C8+Socket+Programming
C8+Socket+Programming
C8 Socket Programming
C8 Socket Programming 2
What is a Socket?
A socket connection is like a bi-directional communication pipe
between two running programs.
Computer X Computer Y
Program A Program B
bytes
bytes
Internet
Socket
C8 Socket Programming 4
Computer X Computer Y
Program A Program B
device
bytes bytes bytes
bytes
device bytes bytes
C8 Socket Programming 5
my_socket = socket()
my_socket.bind(('127.0.0.1', 12345))
my_socket.listen()
server.py
Computer X
Listening …
These 4 lines of code
Program A are essential to
initialise my_socket()
my_socket
Server
127.0.0.1:12345
C8 Socket Programming 6
Program B
Server Port Port
127.0.0.1 12345 5000
Socket
my_socket Client
192.0.0.1:5000
C8 Socket Programming 7
Computer X Computer Y
server.py
Listening …
Program A Program B
Port Port
Accepted !
12345 5000
Socket
Server Client
127.0.0.1:12345 192.0.0.1:5000
The socket.accept() method will block the program until a new client
connects; then it will create a new_socket with the client's address.
C8 Socket Programming 8
Listening …
Program A Program B
Server Client
127.0.0.1:12345 192.0.0.1:5000
server.py
client.py
Msg = my_socket.recv(1024)
Print(Msg.decode())
C8 Socket Programming 9
Listening …
Program A Program B
Socket
Server Client
127.0.0.1:12345 192.0.0.1:5000
server.py
new_socket.close()
my_socket.close()
client.py
my_socket.close()
C8 Socket Programming 10
msg = 'string'.encode()
type(msg) → <class 'bytes'>
msg → b'string'
len(msg) → 6 which is same as len('string')
print(msg.decode()) → 'string'
msg3 = msg2.decode()
type(msg3) → <class 'str'>
Decode
len(msg3) → 1
print(msg3) → 中 after receiving
C8 Socket Programming 13
Project 1
Single direction Server-Client communication
C8 Socket Programming 14
my_socket = socket()
my_socket.bind(('127.0.0.1', 12345))
my_socket.listen()
server.py
new_socket.close()
my_socket.close()
C8 Socket Programming 15
my_socket = socket()
my_socket.connect((addr, port))
Msg = my_socket.recv(1024)
print(Msg.decode())
my_socket.close()
16
Assignment 1
Single direction communication from 1 Server to 2 Clients
C8 Socket Programming 17
my_socket = socket()
my_socket.bind(('127.0.0.1', 12345))
my_socket.listen()
server.py
new_socket.close()
my_socket.close()
C8 Socket Programming 18
my_socket = socket()
my_socket.connect((addr, port))
Msg = my_socket.recv(1024)
print(Msg.decode())
my_socket.close()
C8 Socket Programming 19
my_socket = socket()
my_socket.connect((addr, port))
Msg = my_socket.recv(1024)
print(Msg.decode())
my_socket.close()
C8 Socket Programming 20
Project 2
Designing a Protocol
C8 Socket Programming 21
my_socket = socket()
my_socket.bind(('127.0.0.1', 12345))
my_socket.listen()
server.py
new_socket.sendall(b'Hello fr')
sleep(0.1)
new_socket.sendall(b'om server\n')
new_socket.close()
my_socket.close()
C8 Socket Programming 23
my_socket = socket()
my_socket.connect(('127.0.0.1', 12345))
print(my_socket.recv(1024).decode())
[Project 1]
my_socket.close()
In this example, the client receives only the first part of the data
and closes the socket. This will produce an error when the server
tries to send the second piece of data.
In general, we should never assume that socket.recv()
has received all the bytes that were sent.
C8 Socket Programming 24
data = b''
while b'\n' not in data:
data += my_socket.recv(1024)
print(data.decode())
We will use this method whenever
my_socket.close()
we need to receive any data.
C8 Socket Programming 25
Assignment 2
Bi-direction Server-Client communication
C8 Socket Programming 26
Assignment 2 :
my_socket = socket()
my_socket.bind(('127.0.0.1', 12345))
my_socket.listen()
server.py
new_socket.close()
my_socket.close()
C8 Socket Programming 28
my_socket = socket()
my_socket.connect(('127.0.0.1', 12345))
client.py (with protocol)
data = b''
while b'\n' not in data:
data += my_socket.recv(1024)
print(data.decode())
my_socket.close()
C8 Socket Programming 29
Project 3
Iterative Server
C8 Socket Programming 30
my_socket = socket()
client.py (with protocol)
my_socket.connect(('127.0.0.1', 12345))
data = b''
while b'\n' not in data:
data += my_socket.recv(1024)
print(data.decode())
my_socket.close()
Since the server is still running, you may execute the client
program again, a few more times, after it closes my_socket.
C8 Socket Programming 32
Project 4
A Chat Program
C8 Socket Programming 33
chat_socket.close() Sending
C8 Socket Programming 35
Assignment 3
A Chat Program with Quit
C8 Socket Programming 36
Project 5
A Turn-Based Game – "Guess Head or Tail"
C8 Socket Programming 38
def main():
while True:
guess = input('\n\nI will toss a coin, \
head_tail.py
print(game(guess))
if guess == 'Q':
break
Copy the codes for game() and main() and save them in the
head_tail.py program. Run the program and play the game.
Observe how the game is being implemented.
C8 Socket Programming 40
new_socket.close()
my_socket.close()
C8 Socket Programming 41
client_guess = b''
server.py
new_socket.sendall(game(client_guess)\
.encode() + b'\n')
if client_guess == 'Q':
break
C8 Socket Programming 42
while True:
data = my_socket.recv(1024)
guess = input(data.decode()).upper()
my_socket.sendall(guess.encode() + b'\n')
client.py
data = b''
Send user's input to the server
while b'\n' not in data:
data += my_socket.recv(1024)
print(data.decode())
if guess == 'Q':
Display message from the server
break
my_socket.close()
C8 Socket Programming 43
Assignment 4
A Turn-Based Game – "Guess Head or Tail" with Counters
C8 Socket Programming 44
Modify the server and client program to display the following when
the user ended the game:
Assignment 5
A Turn-Based Game – "Guess High or Low"
C8 Socket Programming 46
num = randint(1,100)
def game(guess):
if guess.isdigit():
high_low.py
if int(guess) == num:
return 'You win!'
elif int(guess) > num:
return 'HIGH'
else:
return 'LOW'
else:
return 'Please enter number 1 to 100'
C8 Socket Programming 48
def main():
counter = 5
while counter > 0:
guess = input('Guess a number 1 to 100: ')
if game(guess) == 'You win!':
high_low.py
print(game(guess))
break
else:
print(game(guess))
counter -= 1
if counter == 0:
print('You ran out of tries! Game over.')
Copy the codes for game() and main() and save them in
the high_low.py program. Run the program and play the
game. Observe how the game is being implemented.
C8 Socket Programming 49
s.close()
C8 Socket Programming 50
new_socket.close()
my_socket.close()
C8 Socket Programming 51
Assignment 6
Symmetrical Game – "Scissor, Paper, Stone"
C8 Socket Programming 52
Assignment 6 :
def game(opponent):
player2 = choice(['Scissor', 'Paper', 'Stone'])
print('Player2: ', player2)
if player2 == opponent:
return 'Draw'
elif (player2 == 'Scissor' and opponent == \
'Paper') or (player2 == 'Paper' and opponent == \
'Stone') or (player2 == 'Stone' and opponent == \
'Scissor'):
return 'Player2 wins!'
else:
return 'Player1 wins!'
C8 Socket Programming 54
def main():
print('You are Player1 playing against Player2')
counter = 3
d = {'1':'Scissor', '2':'Paper', '3':'Stone'}
scissor-paper-stone.py
The End
Socket Programming