我正在开发一个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
,那里几乎没有任何代码。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句