tobby48 5 лет назад
Родитель
Сommit
0d90df56e6

+ 24
- 0
src/kr/co/swh/lecture/network/chat/client/chatclient.py Просмотреть файл

@@ -0,0 +1,24 @@
1
+import socket
2
+import threading
3
+
4
+def worker(conn):
5
+    while True:
6
+        data = conn.recv(1024)
7
+        print("chat message " + data.decode())
8
+    conn.close()
9
+    
10
+def run():
11
+  with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
12
+    s.connect(('127.0.0.1', 4000))
13
+    print("클라이언트 소켓정보 : ", s)
14
+    th = threading.Thread(target=worker, name="[스레드 이름 {}]".format(s), args=(s,))
15
+    th.start()  # 생성한 스레드를 시작한다
16
+            
17
+    while True:
18
+        line = input()
19
+        s.send(line.encode())    # 서버가 빈 데이터를 받고 연결을 종료할 수 있도록
20
+        if not line: break         # 빈 데이터를 먼저 보낸 후 루프를 탈출
21
+        
22
+
23
+if __name__ == '__main__':
24
+  run()

+ 35
- 0
src/kr/co/swh/lecture/network/chat/server/chatserver.py Просмотреть файл

@@ -0,0 +1,35 @@
1
+import socket
2
+import threading
3
+import time
4
+
5
+connList=[]
6
+
7
+def worker(conn):
8
+    while True:
9
+        data = conn.recv(1024)  # 변수 msg 은 바이트형이며, 클라이언트로 부터 받은 메세지가 저장된다. recv함수의 매개변수는 바이트 크기
10
+        if not data: break
11
+        print(data.decode())
12
+        
13
+        for b in connList:
14
+            b.send(data)      # 메세지를 연결된 클라이언트에게 전달
15
+    conn.close()
16
+    
17
+def run_server(port=4000):
18
+    host = ''
19
+    # socket.AF_INET 은 IP4v 주소체계(socket.AF_INET6 은 IP6v), socket.SOCK_STREAM은 소켓의 타입
20
+    # socket.AF_INET와 socket.SOCK_STREAM은 디폴트 값이므로 socket.socket() 로 코드를 작성해도 된다.
21
+    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
22
+        s.bind((host, port))
23
+        s.listen()
24
+        
25
+        while True: 
26
+            conn, addr = s.accept()     # accept함수의 결과는 튜플형이며, conn은 서버 소켓에 대한 정보, addr은 클라이언트의 정보
27
+            print("서버 소켓정보 : ", conn)
28
+            print("연결된 클라이언트 정보 : ", addr)
29
+            
30
+            connList.append(conn)
31
+            th = threading.Thread(target=worker, name="[스레드 이름 {}]".format(conn), args=(conn,))
32
+            th.start()  # 생성한 스레드를 시작한다
33
+
34
+if __name__ == '__main__':
35
+  run_server()

+ 1
- 1
src/kr/co/swh/lecture/network/echo/echoclient.py Просмотреть файл

@@ -6,7 +6,7 @@ def run():
6 6
     print("클라이언트 소켓정보 : ", s)
7 7
     while True:
8 8
         line = input(':')
9
-        s.sendall(line.encode())    # 서버가 빈 데이터를 받고 연결을 종료할 수 있도록
9
+        s.send(line.encode())    # 서버가 빈 데이터를 받고 연결을 종료할 수 있도록
10 10
         if not line: break         # 빈 데이터를 먼저 보낸 후 루프를 탈출
11 11
         data = s.recv(1024)
12 12
         print("서버로 부터 전달받은 문자열 : ", data.decode())

+ 1
- 1
src/kr/co/swh/lecture/network/echo/echoserver.py Просмотреть файл

@@ -15,7 +15,7 @@ def run_server(port=4000):
15 15
             if not data: break
16 16
             print(type(data))
17 17
             print("클라이언트로부터 전송받은 문자열 : ", data.decode())
18
-            conn.sendall(data)      # 메세지를 연결된 클라이언트에게 전달
18
+            conn.send(data)      # 메세지를 연결된 클라이언트에게 전달
19 19
         conn.close()
20 20
 
21 21
 if __name__ == '__main__':

+ 15
- 0
src/kr/co/swh/lecture/network/multithread/multithread_client.py Просмотреть файл

@@ -0,0 +1,15 @@
1
+import socket
2
+
3
+def run():
4
+  with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
5
+    s.connect(('127.0.0.1', 4000))
6
+    print("클라이언트 소켓정보 : ", s)
7
+    while True:
8
+        line = input(':')
9
+        s.sendall(line.encode())    # 서버가 빈 데이터를 받고 연결을 종료할 수 있도록
10
+        if not line: break         # 빈 데이터를 먼저 보낸 후 루프를 탈출
11
+        data = s.recv(1024)
12
+        print("서버로 부터 전달받은 문자열 : ", data.decode())
13
+
14
+if __name__ == '__main__':
15
+  run()

+ 34
- 0
src/kr/co/swh/lecture/network/multithread/multithread_server.py Просмотреть файл

@@ -0,0 +1,34 @@
1
+import socket
2
+import threading
3
+import time
4
+
5
+def worker(conn, addr):
6
+    print("{} 실행 중 ".format(threading.currentThread().getName()))
7
+    
8
+    while True:
9
+        data = conn.recv(1024)  # 변수 msg 은 바이트형이며, 클라이언트로 부터 받은 메세지가 저장된다. recv함수의 매개변수는 바이트 크기
10
+        if not data: break
11
+        print(type(data))
12
+        print("클라이언트로부터 전송받은 문자열 : ", data.decode())
13
+        conn.sendall(data)      # 메세지를 연결된 클라이언트에게 전달
14
+    conn.close()
15
+    print("{} 종료".format(threading.currentThread().getName()))
16
+    
17
+def run_server(port=4000):
18
+    host = ''
19
+    # socket.AF_INET 은 IP4v 주소체계(socket.AF_INET6 은 IP6v), socket.SOCK_STREAM은 소켓의 타입
20
+    # socket.AF_INET와 socket.SOCK_STREAM은 디폴트 값이므로 socket.socket() 로 코드를 작성해도 된다.
21
+    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
22
+        s.bind((host, port))
23
+        s.listen()
24
+        
25
+        while True: 
26
+            conn, addr = s.accept()     # accept함수의 결과는 튜플형이며, conn은 서버 소켓에 대한 정보, addr은 클라이언트의 정보
27
+            print("서버 소켓정보 : ", conn)
28
+            print("연결된 클라이언트 정보 : ", addr)
29
+            
30
+            th = threading.Thread(target=worker, name="[스레드 이름 {}]".format(addr), args=(conn, addr))
31
+            th.start()  # 생성한 스레드를 시작한다
32
+
33
+if __name__ == '__main__':
34
+  run_server()