2014-07-24 3 views
0

문자열을 지정된 IP 주소와 포트 번호로 보내는 앱을 작성하려고합니다. 대상에는 이미 문자열을 받아들이는 서버가 있지만 어떤 이유로 응용 프로그램이 서버와 소켓을 설정할 수 없으므로 시간이 초과됩니다. 필자는 코드 만 작성 했으므로 클라이언트 나 서버 쪽에서 포트 포워드와 같은 다른 작업을해야 할 경우 알려 주시기 바랍니다.안드로이드 소켓 대 파이썬 서버 - 타임 아웃

이 응용 프로그램의 목표는 IP 주소의 문자열, 포트 번호의 문자열 및 메시지를 대상으로 보낼 문자열을 가져 오는 것입니다. 보내기 단추를 누르면 앱은 정의 된 IP 및 포트 번호로 메시지를 보내고 서버로부터 응답을 표시합니다.

이것은 또한 Android App과 Python 서버간에 한 번, Android App과 사용자 정의 하드웨어간에 다른 두 가지 응용 프로그램에서 사용됩니다. 양쪽 경우에 맞는 솔루션이 있기를 바랍니다.

클라이언트 코드 :

public static class PlaceholderFragment extends Fragment { 

     TextView recieve; 
     EditText addressText, portText, messageText; 
     Button send; 

     Socket socket = null; 

     public PlaceholderFragment() { 
     } 

     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, 
       Bundle savedInstanceState) { 
      View rootView = inflater.inflate(
        R.layout.fragment_customize_gateway, container, false); 

      recieve = (TextView) rootView.findViewById(R.id.textView1); 
      addressText = (EditText) rootView.findViewById(R.id.editText1); 
      portText = (EditText) rootView.findViewById(R.id.editText2); 
      messageText = (EditText) rootView.findViewById(R.id.editText3); 

      send = (Button) rootView.findViewById(R.id.send); 
      send.setOnClickListener(new OnClickListener() { 

       @Override 
       public void onClick(View v) { 
        // TODO Auto-generated method stub 
        AsyncSend aSend= new AsyncSend(addressText.getText().toString(),Integer.parseInt(portText.getText().toString()), messageText.getText().toString()); 
        aSend.execute(); 
       } 
      }); 
      return rootView; 
     } 

     public class AsyncSend extends AsyncTask<Void, Void, Void> { 
      String address; 
      int port; 
      String message; 
      String response; 
      AsyncSend(String addr, int p, String mes) { 
       address = addr; 
       port = p; 
       message = mes; 
      } 

      @Override 
      protected Void doInBackground(Void... params) { 
       android.os.Debug.waitForDebugger(); 
       Socket socket = null; 
       try { 
        System.out.println("Test"); 
        socket = new Socket(address, port); 
        System.out.println("Test"); 
        DataOutputStream writeOut = new DataOutputStream(socket.getOutputStream()); 
        writeOut.writeUTF(message); 
        writeOut.flush(); 


        ByteArrayOutputStream writeBuffer = new ByteArrayOutputStream(1024); 
        byte[] buffer = new byte[1024]; 

        int bytesRead; 
        InputStream writeIn = socket.getInputStream(); 

        while((bytesRead = writeIn.read(buffer)) != -1) { 
         writeBuffer.write(buffer,0,bytesRead); 
         response += writeBuffer.toString("UTF-8"); 
        } 
       } catch (UnknownHostException e){ 
        e.printStackTrace(); 
        response = "Unknown HostException: " + e.toString(); 
        System.out.println(response); 
       } catch (IOException e) { 
        response = "IOException: " + e.toString(); 
        System.out.println(response); 
       } finally { 
        if (socket != null) { 
         recieve.setText(response); 
         try { 
          socket.close(); 
         } catch (IOException e) { 
          e.printStackTrace(); 
         } 
        } 
       } 
       return null; 
      } 

      @Override 
      protected void onPostExecute(Void result) { 
       recieve.setText(response); 
       super.onPostExecute(result); 
      } 
     } 
    } 

서버 코드 :

import http.server 
import socket 
import threading 
import socketserver 

import pymongo 

import smtplib 

class ThreadedTCPRequestHandler(socketserver.BaseRequestHandler): 
    def handle(self): 
     #Connect to database 
     try: 
      from pymongo import MongoClient 
      dbclient = MongoClient() 
      db = dbclient.WDI_database 
      print("Database Connected") 
     except pymongo.errors.ConnectionFailure as e: 
      print("Database Failed: {}".format(e)) 

     col = db.users 

     data2 = str(self.request.recv(1024), 'ascii') 
     print("Server: {}".format(data2)); 
     data = data2.split("||") 
     username, password, camunits, homunits = data[0], data[1], data[2], data[3] 
     post = {"user": username, 
       "pass": password, 
       "cam": camunits, 
       "disp": homunits} 
     col.insert(post) 
     print(col.count()) 

     cur_thread = threading.current_thread() 
     response = bytes("{} Received data for: {}".format(cur_thread, username), 'ascii') 
     self.request.sendall(response) 

class ThreadedUDPRequestHandler(socketserver.BaseRequestHandler): 
    def handle(self): 
     data = self.request[0].strip() 
     socket = self.request[1] 
     print("Recieved: " + data.decode("utf-8")) 
     socket.sendto(data.upper(), self.client_address) 

class ThreadedTCPServer(socketserver.ThreadingMixIn, socketserver.TCPServer): 
    pass 

if __name__ == "__main__": 
    # Port 0 means to select an arbitrary unused port 
    HOST, PORT = "", 5000 

    tcpserver = ThreadedTCPServer((HOST, PORT-1), ThreadedTCPRequestHandler) 
    server_thread = threading.Thread(target=tcpserver.serve_forever) 
    server_thread.daemon = True 
    server_thread.start() 
    print("TCP serving at port", PORT-1) 

    while True: 
     pass 
    tcpserver.shutdown() 

답변

0

아마도 나는 앞으로 포트를 연결하지 않았기 때문에 내 라우터에 의해 연결이 차단되었습니다. 라우터와 Windows 모두에서 포트를 열었습니다.

1

Socket 클래스를 사용하여 잠재적 잡았다의 너무 당신의 목적을 위해 낮은 수준과 고민입니다. 대신 org.apache.http.client.HttpClient을 사용하는 것이 좋습니다.

+0

서버를 동일하게 유지할 수 있습니까? 아니면 서버를 다시 코딩해야합니까? – putty174

+0

아니요, 서버에서 아무 것도 변경할 필요가 없습니다. HTTP 프로토콜을 사용하는 한 HttpClient가 당신을위한 것입니다! – Nebu

+0

제안 해 주셔서 감사합니다.이를 명심하십시오. 이 프로젝트의 또 다른 부분은 언급하지 않았습니다.이 클라이언트/서버 동적 또한 미러링해야하지만 서버는 HTTP 연결을 처리 할 수없는 사용자 정의 하드웨어입니다. 그래서 제가하고 싶습니다. 그 연결을 가능한 낮거나 단순하게하십시오. – putty174