문자열을 지정된 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()
서버를 동일하게 유지할 수 있습니까? 아니면 서버를 다시 코딩해야합니까? – putty174
아니요, 서버에서 아무 것도 변경할 필요가 없습니다. HTTP 프로토콜을 사용하는 한 HttpClient가 당신을위한 것입니다! – Nebu
제안 해 주셔서 감사합니다.이를 명심하십시오. 이 프로젝트의 또 다른 부분은 언급하지 않았습니다.이 클라이언트/서버 동적 또한 미러링해야하지만 서버는 HTTP 연결을 처리 할 수없는 사용자 정의 하드웨어입니다. 그래서 제가하고 싶습니다. 그 연결을 가능한 낮거나 단순하게하십시오. – putty174