gpt4 book ai didi

java - socket - Android 客户端 - Java 服务器 PC 卡住

转载 作者:太空狗 更新时间:2023-10-29 13:13:42 28 4
gpt4 key购买 nike

好吧,这是我的第二篇文章,我正在经历 Android 客户端和运行在 PC 上的 Java 服务器应用程序之间的套接字通信 TCP/IP 的一个大问题。

我尝试做的是当我从客户端应用程序按下一个按钮到服务器时发送一个字符串,然后根据需要多次向我的客户端应用程序返回一个答案,这个结果显示在 我客户的 TextView

当我尝试使用我的客户端应用程序连接到服务器时出现问题,连接成功执行,但是当我按下按钮并发送数据时,客户端应用程序卡住了,显示结果的唯一方法是停止服务器应用程序。拜托,我需要帮助!我是安卓新手。谢谢。

这是简单的服务器代码:

import java.io.*;
import java.net.*;
import java.util.logging.Level;
import java.util.logging.Logger;

public class ServerSocks {

private static ServerSocket myServer;
private static Socket myClient;
private static String msj_ToServer;

public static void main (String args[] ){

try {

System.out.println("Bienvenido:\n");

System.out.println("Por favor ingresar el nº de puerto de comunicación: ");
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
String portNumber_str = in.readLine();
int portNumber = Integer.parseInt(portNumber_str);
myServer = new ServerSocket(portNumber);

if(myServer.isBound() == true){

System.out.println("Iniciando servidor en el puerto: "+portNumber);

}

else{

System.err.println("[E R R O R] : No se pudo crear 'LISTEN SOCKET'");
System.exit(0);

}

while(true){

System.out.println("Esperando algún cliente TCP en el puerto ["+portNumber+"]...");
myClient = myServer.accept();

if (myClient.isConnected()) { // if2

System.out.println("[D A T A] : El cliente ha sido aceptado IP-CLIENT\n"+""+ "IP Client address: "+myClient.getInetAddress());

DataOutputStream outClient = new DataOutputStream(myClient.getOutputStream());

DataInputStream inClient = new DataInputStream(myClient.getInputStream());
msj_ToServer = inClient.readLine();
System.out.println("Ha1 "+msj_ToServer);

try{


if(msj_ToServer.equalsIgnoreCase("D")) {
System.out.println("HO "+msj_ToServer);
outClient.writeBytes("ON");
outClient.flush();
break;

}

}catch(IOException e){
e.printStackTrace();
}

if(msj_ToServer == "B" || msj_ToServer == "b"){

System.out.println(msj_ToServer);
outClient.writeUTF("OFF");
outClient.flush();
break;
}

if(msj_ToServer == "C" || msj_ToServer == "c"){
System.out.println(msj_ToServer);
outClient.writeUTF("xd");
outClient.flush();
break;
}

} // fin while inicio de lectura */

} // fin msj1

} // fin while prueba 3
}// fin if2


} // fin while (true) superior

} catch (IOException ex) {
Logger.getLogger(ServerSocket.class.getName()).log(Level.SEVERE, null, ex);
ex.printStackTrace();
}

}// fin main

} // fin clase ServerSocks

这是我的 Android 客户端应用程序的 Main.java 的一部分(我正在使用向服务器发送“D”字符串并且服务器发回“ON”的按钮(“状态”按钮)进行探测作为答案)。

public class MainActivity extends Activity implements OnClickListener {

private Button ledOnButton;
private Button ledOffButton;
static ToggleButton toggleButton;
static EditText statusEditText;
private Button status;
static TextView prueba;

static Socket clientSocket;
static String data;

static String dato;

static PrintStream os;
static DataInputStream is;
static DataInputStream inputLine;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (android.os.Build.VERSION.SDK_INT > 9) {
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
}

ledOnButton = (Button) findViewById(R.id.ledOnButton);
ledOnButton.setOnClickListener(this);

ledOffButton = (Button) findViewById(R.id.ledOffButton);
ledOffButton.setOnClickListener(this);

toggleButton = (ToggleButton) findViewById(R.id.toggleButton);
toggleButton.setOnClickListener(this);

status = (Button) findViewById(R.id.statusButton);
status.setOnClickListener(this);

statusEditText = (EditText) findViewById(R.id.statusEditText);

// prueba con textView

prueba = (TextView) findViewById(R.id.textView_Prueba);

} // fin OnCreate

@Override

public void onClick(View arg0) {

AsyncAction object = new AsyncAction();
final String salida_dato;


switch (arg0.getId()) {

case R.id.toggleButton:


if (toggleButton.isChecked()) {

object.conexion_socket();


}

if (!toggleButton.isChecked()) {

object.desconexion_socket();

}


break;

case R.id.ledOnButton:


if ((MainActivity.toggleButton.isChecked())) {

object.ledOnButton();
}

break;

case R.id.ledOffButton:

if ((toggleButton.isChecked())) {

object.ledOffButton();
}

break;

case R.id.statusButton:

这里我尝试向服务器发送一个“D”字符串

        if ((toggleButton.isChecked())) {


if (clientSocket != null && os != null && is != null) {

try {

final String responseLine;
// String data = "D";
//os.write(data.getBytes());
os.println("D");


while ((responseLine = is.readLine()) != null) {
System.out.println(responseLine);


runOnUiThread(new Runnable() {
public void run() {
MainActivity.prueba.setText(responseLine);
os.flush();

}
});

break;


}

os.close();
is.close();
clientSocket.close();

} //fin try

catch (UnknownHostException e) {
System.err.println("Trying to connect to unknown host: " + e);
} catch (IOException e) {
System.err.println("IOException: " + e);
}

这里的连接是在后台运行的 asynchTasks(我认为是这样)

    @Override
protected String doInBackground(Void... args) {

conexion_socket();

...


}//fin doInBackground

这是我用来创建套接字连接的连接方法

public void conexion_socket(){

try {

MainActivity.clientSocket = new Socket("192.168.2.80", 30000);

try {

MainActivity.os = new PrintStream(MainActivity.clientSocket.getOutputStream());
MainActivity.is = new DataInputStream(MainActivity.clientSocket.getInputStream());
MainActivity.inputLine = new DataInputStream(new BufferedInputStream(System.in));

} // fin try

catch (IOException e){

System.err.println("algo anda al con los i/o ...");

} // fin catch




} catch (IOException e) {
e.printStackTrace();
}
if (MainActivity.clientSocket.isConnected()) {
MainActivity.statusEditText.setText("OK connection");
}
}

如果有人能提供一种进行这种交流的方法,我将不胜感激!

最佳答案

if(myServer.isBound() == true){

在这一点上这不可能是错误的。删除测试和 else block 。您使用端口号构造了 ServerSocket => 它已绑定(bind)。

        else{
System.err.println("[E R R O R] : No se pudo crear 'LISTEN SOCKET'");
System.exit(0);
}

无法访问。删除。

        while(true){
System.out.println("Esperando algún cliente TCP en el puerto ["+portNumber+"]...");
myClient = myServer.accept();
if (myClient.isConnected()) { // if2

这不可能是假的。您接受了套接字 => 它已连接。不要编写无用的测试。

        System.out.println("[D A T A] : El cliente ha sido aceptado IP-CLIENT\n"+""+ "IP Client address: "+myClient.getInetAddress());
DataOutputStream outClient = new DataOutputStream(myClient.getOutputStream());
DataInputStream inClient = new DataInputStream(myClient.getInputStream());
msj_ToServer = inClient.readLine();
System.out.println("Ha1 "+msj_ToServer);
try{

if(msj_ToServer.equalsIgnoreCase("D")) {
System.out.println("HO "+msj_ToServer);
outClient.writeBytes("ON");

这里你写的是字节但没有行终止符。客户端中对应的代码使用的是readLine(),所以会一直阻塞。向该字符串添加一个行终止符。

        outClient.flush();

冗余。消除。 DataOutputStream 没有缓冲,Socket.getOutputStream() 也没有缓冲,因此刷新它们中的任何一个都没有任何作用。

        }catch(IOException e){
e.printStackTrace();
}

if(msj_ToServer == "B" || msj_ToServer == "b"){

System.out.println(msj_ToServer);
outClient.writeUTF("OFF");

下定决心。您是在写入字节、行还是 writeUTF() 使用的特殊格式?客户端中相应的代码使用readLine()。我建议您通过 readLine()writeUTF()/readUTF() 对用于读取的行进行标准化。你不能混合它们。

           outClient.flush();

见上文。删除。

           if(msj_ToServer == "C" || msj_ToServer == "c"){
System.out.println(msj_ToServer);
outClient.writeUTF("xd");

见上文。

           outClient.flush();

见上文。

        MainActivity.clientSocket = new Socket("192.168.2.80", 30000);

try {

MainActivity.os = new PrintStream(MainActivity.clientSocket.getOutputStream());
MainActivity.is = new DataInputStream(MainActivity.clientSocket.getInputStream());
MainActivity.inputLine = new DataInputStream(new BufferedInputStream(System.in));

} // fin try
catch (IOException e){
System.err.println("algo anda al con los i/o ...");
} // fin catch

没有理由将这些代码行放在 try block 中。你已经在里面了。

    if (MainActivity.clientSocket.isConnected()) {

再一次,这个测试在这一点上不可能是错误的。如果构造了套接字,则它已连接。

但是,由于您的异常处理结构不正确,它可以是null。这之后的 block 应该在前面封闭的 try block 内。

一般来说,你应该去掉所有内部的 try/catch block 。依赖于先前 try block 中代码成功的代码应该在该 try block 中。

关于java - socket - Android 客户端 - Java 服务器 PC 卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37176655/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com