我正在开发一个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;
}
}
如果我双击连接按钮,则它将仅发送一次“连接成功”。请帮忙。
答案 0 :(得分:0)
将这些字段添加到AsyncTask
;甚至可能是static
:
private boolean isConnecting = false;
private boolean isConnected = false;
每当套接字状态更改时,将它们设置为true
和false
然后,不再需要单击按钮的频率了。
来自sendDataToServer()
的代码可能应该运行onPreExecute()
。
AsyncTask
周围的多余类也很混乱;
更好地直接构建-使用IP,端口和消息。
您有一些OutputStreamWriter
,但从未写入流;
此外,这里几乎没有onPostExecute
代码。