Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
D
ds-project
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Requirements
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Locked files
Build
Pipelines
Jobs
Pipeline schedules
Test cases
Artifacts
Deploy
Package registry
Container Registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Code review analytics
Issue analytics
Insights
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Alexander Schulz
ds-project
Commits
c7a7b62a
Commit
c7a7b62a
authored
1 year ago
by
Alexander Schulz
Browse files
Options
Downloads
Patches
Plain Diff
chat base function
parent
b37134e2
No related branches found
No related tags found
No related merge requests found
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
chat_server.py
+5
-0
5 additions, 0 deletions
chat_server.py
client.py
+45
-11
45 additions, 11 deletions
client.py
client_register.py
+1
-1
1 addition, 1 deletion
client_register.py
main_server.py
+1
-1
1 addition, 1 deletion
main_server.py
server.py
+62
-8
62 additions, 8 deletions
server.py
with
114 additions
and
21 deletions
chat_server.py
0 → 100644
+
5
−
0
View file @
c7a7b62a
import
socket
host
=
socket
.
gethostname
()
server_address
=
socket
.
gethostbyname
(
host
)
print
(
server_address
)
\ No newline at end of file
This diff is collapsed.
Click to expand it.
client.py
+
45
−
11
View file @
c7a7b62a
...
@@ -2,10 +2,18 @@ import multiprocessing
...
@@ -2,10 +2,18 @@ import multiprocessing
import
socket
import
socket
import
threading
import
threading
import
re
import
re
import
struct
client_broadcast_listener_port
=
49153
client_receive_message_multicast_port
=
51001
multicast_group_ip
=
'
224.0.1.1
'
class
Client
(
multiprocessing
.
Process
):
class
Client
(
multiprocessing
.
Process
):
registered_server
=
None
registered_server
=
None
host
=
socket
.
gethostname
()
client_address
=
socket
.
gethostbyname
(
host
)
def
__init__
(
self
):
def
__init__
(
self
):
self
.
run
()
self
.
run
()
...
@@ -15,31 +23,31 @@ class Client(multiprocessing.Process):
...
@@ -15,31 +23,31 @@ class Client(multiprocessing.Process):
action
=
input
(
"
Enter type of action (
'
r
'
to register):
"
)
action
=
input
(
"
Enter type of action (
'
r
'
to register):
"
)
if
(
action
==
"
r
"
):
if
(
action
==
"
r
"
):
group
=
input
(
"
Which group dou you want to join?
"
)
group
=
input
(
"
Which group dou you want to join?
"
)
self
.
register
(
5970
,
"
register
"
,
group
)
self
.
register
(
"
register
"
,
group
)
send_thread
=
threading
.
Thread
(
target
=
self
.
send_message
)
send_thread
=
threading
.
Thread
(
target
=
self
.
send_message
)
#
receive_thread = threading.Thread(target=receive_messages)
receive_thread
=
threading
.
Thread
(
target
=
self
.
receive_messages
)
send_thread
.
start
()
send_thread
.
start
()
#
receive_thread.start()
receive_thread
.
start
()
# waiting for thread to stop = prevent the programm from shutdown before thread is stopped
# waiting for thread to stop = prevent the programm from shutdown before thread is stopped
send_thread
.
join
()
send_thread
.
join
()
#
receive_thread.join()
receive_thread
.
join
()
else
:
else
:
message
=
input
(
"
Enter message:
"
)
message
=
input
(
"
Enter message:
"
)
print
(
message
)
print
(
message
)
def
register
(
self
,
port
,
message_type
,
message_group
):
def
register
(
self
,
message_type
,
message_group
):
PORT
=
port
MSG
=
bytes
(
message_type
+
'
_
'
+
message_group
,
'
utf-8
'
)
MSG
=
bytes
(
message_type
+
'
_
'
+
message_group
,
'
utf-8
'
)
broadcast_socket
=
socket
.
socket
(
socket
.
AF_INET
,
socket
.
SOCK_DGRAM
)
broadcast_socket
=
socket
.
socket
(
socket
.
AF_INET
,
socket
.
SOCK_DGRAM
)
broadcast_socket
.
setsockopt
(
socket
.
SOL_SOCKET
,
socket
.
SO_BROADCAST
,
1
)
broadcast_socket
.
setsockopt
(
socket
.
SOL_SOCKET
,
socket
.
SO_BROADCAST
,
1
)
broadcast_socket
.
sendto
(
MSG
,
(
'
<broadcast>
'
,
PORT
))
broadcast_socket
.
sendto
(
MSG
,
(
'
<broadcast>
'
,
client_broadcast_listener_port
))
data
,
server
=
broadcast_socket
.
recvfrom
(
1024
)
data
,
server
=
broadcast_socket
.
recvfrom
(
1024
)
print
(
'
Received message from server:
'
,
data
.
decode
(
'
utf-8
'
))
print
(
'
Received message from server:
'
,
data
.
decode
(
'
utf-8
'
))
...
@@ -73,7 +81,33 @@ class Client(multiprocessing.Process):
...
@@ -73,7 +81,33 @@ class Client(multiprocessing.Process):
client_socket
.
close
()
client_socket
.
close
()
#client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
def
receive_messages
(
self
):
#client_socket.connect((self.server_address, self.server_port))
print
(
"
Listening for groupchat multicast messages
"
)
#client_socket.sendto(str.encode(message), self.registered_server)
#client_socket.close()
client_receive_message_multicast_port
#multicast_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
#multicast_socket.bind(('0.0.0.0', client_receive_message_multicast_port))
# Füge die Multicast-Gruppe dem lokalen Interface hinzu
#group = socket.inet_aton(self.client_address)
# mreq = struct.pack('4sL', group, socket.INADDR_ANY)
#multicast_socket.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)
multicast_get_message_socket
=
socket
.
socket
(
socket
.
AF_INET
,
socket
.
SOCK_DGRAM
,
socket
.
IPPROTO_UDP
)
multicast_get_message_socket
.
setsockopt
(
socket
.
SOL_SOCKET
,
socket
.
SO_REUSEADDR
,
1
)
multicast_get_message_socket
.
bind
((
''
,
client_receive_message_multicast_port
))
mreq
=
struct
.
pack
(
'
4sl
'
,
socket
.
inet_aton
(
multicast_group_ip
),
socket
.
INADDR_ANY
)
print
(
mreq
)
multicast_get_message_socket
.
setsockopt
(
socket
.
IPPROTO_IP
,
socket
.
IP_ADD_MEMBERSHIP
,
mreq
)
# Empfange die Nachricht
while
True
:
print
(
'
I am there
'
)
data
,
addr
=
multicast_get_message_socket
.
recv
(
1024
)
print
(
data
)
print
(
f
"
Empfangene Nachricht von
{
addr
}
:
{
data
.
decode
()
}
"
)
This diff is collapsed.
Click to expand it.
client_register.py
+
1
−
1
View file @
c7a7b62a
...
@@ -4,4 +4,4 @@ import time
...
@@ -4,4 +4,4 @@ import time
if
__name__
==
'
__main__
'
:
if
__name__
==
'
__main__
'
:
client
=
Client
()
client
=
Client
()
time
.
sleep
(
1
0
)
time
.
sleep
(
2
0
)
This diff is collapsed.
Click to expand it.
main.py
→
main
_server
.py
+
1
−
1
View file @
c7a7b62a
...
@@ -10,6 +10,6 @@ if __name__ == '__main__':
...
@@ -10,6 +10,6 @@ if __name__ == '__main__':
server_cache
=
dict
()
server_cache
=
dict
()
clients_cache
=
dict
()
clients_cache
=
dict
()
server
=
Server
(
client_address
,
server_id
,
server_port
,
server_cache
,
clients_cache
)
server
=
Server
(
client_address
,
server_id
,
server_port
,
server_cache
,
clients_cache
)
time
.
sleep
(
1
0
)
time
.
sleep
(
2
0
)
This diff is collapsed.
Click to expand it.
server.py
+
62
−
8
View file @
c7a7b62a
...
@@ -3,8 +3,21 @@ import socket
...
@@ -3,8 +3,21 @@ import socket
import
threading
import
threading
import
json
import
json
client_broadcast_listener_port
=
49153
server_broadcast_listener_port
=
49154
client_receive_chat_tcp_port
=
50001
client_forward_message_multicast_port
=
51000
multicast_group_ip
=
'
224.0.1.1
'
class
Server
(
multiprocessing
.
Process
):
class
Server
(
multiprocessing
.
Process
):
server_address
=
'
127.0.0.1
'
#server_address = '127.0.0.1'
host
=
socket
.
gethostname
()
server_address
=
socket
.
gethostbyname
(
host
)
client_cache_key_offset
=
0
client_cache_key_offset
=
0
local_servers_cache
=
dict
()
local_servers_cache
=
dict
()
local_clients_cache
=
dict
()
local_clients_cache
=
dict
()
...
@@ -56,7 +69,7 @@ class Server(multiprocessing.Process):
...
@@ -56,7 +69,7 @@ class Server(multiprocessing.Process):
listen_socket
.
setsockopt
(
socket
.
SOL_SOCKET
,
socket
.
SO_BROADCAST
,
1
)
listen_socket
.
setsockopt
(
socket
.
SOL_SOCKET
,
socket
.
SO_BROADCAST
,
1
)
listen_socket
.
setsockopt
(
socket
.
SOL_SOCKET
,
socket
.
SO_REUSEADDR
,
1
)
listen_socket
.
setsockopt
(
socket
.
SOL_SOCKET
,
socket
.
SO_REUSEADDR
,
1
)
# Bind socket to address and port
# Bind socket to address and port
listen_socket
.
bind
((
MY_IP
,
BROADCAST_PORT
))
listen_socket
.
bind
((
self
.
server_address
,
client_broadcast_listener_port
))
print
(
self
.
server_id
+
"
:
"
+
"
Listening to client register broadcast messages
"
)
print
(
self
.
server_id
+
"
:
"
+
"
Listening to client register broadcast messages
"
)
...
@@ -112,6 +125,13 @@ class Server(multiprocessing.Process):
...
@@ -112,6 +125,13 @@ class Server(multiprocessing.Process):
client_count
=
client_count
+
1
client_count
=
client_count
+
1
return
client_count
return
client_count
def
find_group_of_client
(
self
,
addr
):
for
key
in
self
.
local_clients_cache
:
value
=
self
.
local_clients_cache
[
key
][
0
]
if
value
==
addr
[
0
]:
group
=
key
[
0
]
return
group
# Create and run new server
# Create and run new server
def
create_server
(
self
,
server_id
,
client_address
):
def
create_server
(
self
,
server_id
,
client_address
):
...
@@ -178,14 +198,48 @@ class Server(multiprocessing.Process):
...
@@ -178,14 +198,48 @@ class Server(multiprocessing.Process):
print
(
self
.
server_id
+
"
:
"
+
"
Group-chat server is listening for client messages at port:
"
,
self
.
server_port
)
print
(
self
.
server_id
+
"
:
"
+
"
Group-chat server is listening for client messages at port:
"
,
self
.
server_port
)
while
True
:
while
True
:
conn
,
addr
=
server_socket
.
accept
()
connection
,
addr
=
server_socket
.
accept
()
print
(
addr
)
print
(
f
"
Connection established with
{
addr
}
"
)
print
(
f
"
Connection established with
{
addr
}
"
)
data
=
con
n
.
recv
(
1024
)
message
=
connectio
n
.
recv
(
1024
)
print
(
f
"
Received message from client:
{
data
.
decode
(
'
utf-8
'
)
}
"
)
print
(
f
"
Received message from client:
{
message
.
decode
(
'
utf-8
'
)
}
"
)
response
=
"
Hello, client! I received your message.
"
response
=
"
Hello, client! I received your message.
"
conn
.
sendall
(
bytes
(
response
,
'
utf-8
'
))
connection
.
sendall
(
bytes
(
response
,
'
utf-8
'
))
connection
.
close
()
conn
.
close
()
if
message
:
self
.
distribute_chat_message
(
message
,
addr
)
#print(addr[0])
def
distribute_chat_message
(
self
,
message
,
addr
):
group
=
self
.
find_group_of_client
(
addr
)
receiver_list
=
[]
for
key
in
self
.
local_clients_cache
:
if
group
in
key
:
receiver_list
.
append
(
self
.
local_clients_cache
[
key
][
0
])
print
(
"
Receiver list
"
,
receiver_list
)
distribute_chat_thread
=
threading
.
Thread
(
target
=
self
.
multicast_chat_message
(
message
,
receiver_list
))
distribute_chat_thread
.
start
()
#print(group)
#print(message.decode('utf-8'))
def
multicast_chat_message
(
self
,
message
,
receiver_list
):
for
client
in
receiver_list
:
multicast_address
=
(
client
,
client_forward_message_multicast_port
)
multicast_socket
=
socket
.
socket
(
socket
.
AF_INET
,
socket
.
SOCK_DGRAM
,
socket
.
IPPROTO_UDP
)
multicast_socket
.
setsockopt
(
socket
.
IPPROTO_IP
,
socket
.
IP_MULTICAST_TTL
,
2
)
multicast_socket
.
sendto
(
message
,
multicast_address
)
print
(
"
multicast message sent
"
)
multicast_socket
.
close
()
\ No newline at end of file
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment