파이썬 소켓통신 및 mysql 통신질문이요

조회수 1100회
import socket
import json
import pymysql

HOST = ''
PORT = 
i = 0
list_data =[]

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(1)

while True : 
    try :
        conn,addr = s.accept()
        data = conn.recv(1024)
        dic_data = json.loads(dta)
        list_data.insert(i, dic_data)
        i += 1

        if len(list_data) == 4 :
            conn.close()
            pymysqlcon(list_data)
            i = 0
            list_data = []
    except  : continue

def pymysqlcon(final_list):
    conn = pymysql.connect(host="", user="admin", password="", db = "gpsdb")
    curs = conn.cursor()
    for i in range(0, len(final_list)):
        final_data = final_list[i]
        sql = ("INSERT INTO gpsdata (cname, date, gtime, address) VALUES (%(cname)s, %(date)s, %(gtime)s, %(address)s)")
        curs.execute(sql, final_data)
    conn.commit()
    conn.close()

다음과 같은 코드입니다. 파이썬 2.7사용중이고 vmware ubuntu환경입니다. 루프속에서 실행되는 문장 중에 오류인데요.

try 이후 클라이언트에서 데이터를 받고 받은 데이터를 json에서 dict 로 변경하고 list에 저장한 다음에 list의 크기를 len()을 사용해 계산하여 4가 되면 pymysql모듈로 db에 넣는 코드인데 if문이 작동이 안되는거 같아요.

if문이 작동되면 리스트가 초기화되서 리스트 크기가 0이 되서 다시 진행되는데 0이 되지 않고 db에도 데이터 값이 들어가지 않네요.

그리고 socket 통신과 pymysql 둘다 같은 conn 이 사용되는데 사용후 close()를 하면 별다른 문제가 없는건지 알고싶어요

  • (•́ ✖ •̀)
    알 수 없는 사용자

1 답변

  • conn,addr = s.accept()
    

    accept는 client에서 connect 요청이 오면 한번만 호출해야 합니다. while loop 진입 하기 전에 accep 하고, while loop 내부에서는 recv만 수행하셔야 되요.

    dic_data = json.loads(dta)
    

    dta => data

    이 부분은 오타겠지요?

    socket을 accept 할 때 사용된 conn 이 전역변수이기 때문에 pymysqlcon 함수에서는 conn을 다른 이름으로 변경하는 것을 권장드립니다.

    • (•́ ✖ •̀)
      알 수 없는 사용자
    • 말씀하신대로 accept 를 밖으로 빼냇는데도 if문이 작동을 안하네요... 계속 리스트에 추가만 되고 if 조건문을 수행을 안하네요.. 서버쪽에서 accept를 한번해서 클라이언트쪽도 연결은 한번만 걸고 send()함수를 반복으로 돌리고 있어요 알 수 없는 사용자 2019.1.25 16:35
    • 전달은 다되는데 서버쪽 if문만 작동을 안하네요... 알 수 없는 사용자 2019.1.25 16:35
    • try 블럭 내부에서 exception이 발생되고 있을 수도 있습니다. except: 에서 continue만 하지 마시고 로그를 찍어보세요. 알 수 없는 사용자 2019.1.25 17:31
    • aws에서 프로젝트 중이라 aws ec2를 만들어서 같은 코드를 테스트 해보니 if 문이 실행이 되네요... 아무튼 답변 감사합니다 알 수 없는 사용자 2019.1.25 18:09

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)