[英]Why my PrintWriter is not sending data to server?
我正在開發一個Android應用程序。 Android應用程序(客戶端)將與pc(服務器)連接並共享數據。 現在,我可以成功建立連接,但是無法發送數據。 這是我的Java文件,具有建立連接和發送數據的所有邏輯。
ServerConnection.java
public class ServerConnection {
private static int SERVER_PORT = 1100;
private static String SERVER_IP = "192.168.43.7";
private boolean isConnected=false,connectionDone=false;
private boolean mouseMoved=false;
Context context;
private Socket socket;
private PrintWriter out;
public void startConnection(String port , String ip){
SERVER_IP = ip.toString();
ConnectPhoneTask connectPhoneTask = new ConnectPhoneTask();
connectPhoneTask.execute(SERVER_IP);
}
public void sendDataToServer(String text){
try {
if(isConnected) {
out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true); //create output stream to send data to server
}
}catch (IOException e){
Log.e("remotedroid", "Error while creating OutWriter", e);
Toast.makeText(context, "Error: while creating OutWriter "+e, Toast.LENGTH_LONG).show();
}
if(out!=null){
out.println(text);
}
else{
Log.e("check" , "Something is wrong here");
}
}
public class ConnectPhoneTask extends AsyncTask<String,Void,Boolean> {
@Override
protected Boolean doInBackground(String... params) {
boolean result = true;
try {
InetAddress serverAddr = InetAddress.getByName(params[0]);
socket = new Socket(serverAddr, SERVER_PORT);//Open socket on server IP and port
} catch (IOException e) {
Log.e("remotedroid", "Error while connecting", e);
result = false;
}
return result;
}
@Override
protected void onPostExecute(Boolean result)
{
isConnected = result;
try {
if(isConnected) {
out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true); //create output stream to send data to server
}
}catch (IOException e){
Log.e("remotedroid", "Error while creating OutWriter", e);
}
}
}
}
並且此片段將啟動連接並發送數據(通過調用sendDataToServer(String text)
方法)。
LogIntoServer.java
public class LogIntoServer extends Fragment {
private EditText ipadr,portadr;
private Button connect,disconnect;
ServerConnection serverConnection;
String SERVER_IP ;
String SERVER_PORT;
PrintWriter out;
public LogIntoServer() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View v = inflater.inflate(R.layout.fragment_log_into_server, container, false);
ipadr = v.findViewById(R.id.ipadr);
portadr = v.findViewById(R.id.portadr);
connect = v.findViewById(R.id.connect);
disconnect = v.findViewById(R.id.disconnect);
serverConnection = new ServerConnection();
connect.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SERVER_IP = ipadr.getText().toString();
SERVER_PORT = portadr.getText().toString();
serverConnection.startConnection(SERVER_PORT , SERVER_IP);
serverConnection.sendDataToServer("Connection Successful");
}
});
disconnect.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
serverConnection.sendDataToServer("exit");
}
});
return v;
}
}
如果我雙擊連接按鈕,則它將僅發送一次“連接成功”。 請幫忙。
將這些字段添加到AsyncTask
; 可能甚至是static
:
private boolean isConnecting = false;
private boolean isConnected = false;
並在套接字狀態更改時將其設置為true
和false
。
則不再需要單擊該按鈕的頻率了。
sendDataToServer()
代碼可能應該在onPreExecute()
運行。
圍繞AsyncTask
額外類也是一團糟;
更好地直接構建它-使用IP,端口和消息。
您得到了一些OutputStreamWriter
但從未寫入流;
除此之外,那里幾乎沒有任何onPostExecute
代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.