【问题标题】:socket is not connected Android to pc tcp [duplicate]套接字未将Android连接到pc tcp [重复]
【发布时间】:2018-07-06 08:28:35
【问题描述】:

我在这里不知所措。我有一个 Android 客户端试图在我的电脑上连接服务器。它是未模拟的实际设备。在发送数据时,我收到了 SocketExceptions。我连接到与 pc 相同的网络并且端口被转发。我不确定现在问题出在哪里。这是堆栈跟踪

07-05 11:20:06.876 21128-21587/com.apklegion.pcnotetest W/System.err: 
java.net.SocketException: Socket is not connected
07-05 11:20:06.877 21128-21587/com.apklegion.pcnotetest W/System.err:     at 
java.net.Socket.getOutputStream(Socket.java:921)
07-05 11:20:06.878 21128-21587/com.apklegion.pcnotetest W/System.err:     at 
com.apklegion.pcnotetest.MainActivity$sendData.doInBackground(MainActivity.
java:80)        at  com.apklegion.pcnotetest.MainActivity$sendData.doInBackground
(MainActivity.java:61)
    at android.os.AsyncTask$2.call(AsyncTask.java:304)
    at java.util.concurrent.FutureTask.run(FutureTask.java:237)
    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:243)
    at     java.util.concurrent.ThreadPoolExecutor.runWorker
 (ThreadPoolExecutor.java:1133)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run
(ThreadPoolExecutor.java:607)
07-05 11:20:06.879 21128-21587/com.apklegion.pcnotetest W/System.err:     at 
java.lang.Thread.run(Thread.java:761)

这是应用程序的代码

  private static String ip = "10.0.0.3";
private static int port = 5555;



@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
         el = (EditText)findViewById(R.id.text);
         button = (Button)findViewById(R.id.button);
         button.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View v) {




                 message = el.getText().toString();
              SendData sd = new sendData();
             sd.execute(message);

                 Toast.makeText(getApplicationContext(),"Data 
Sent",Toast.LENGTH_LONG).show();

Toast.makeText(getApplicationContext(),message,Toast.LENGTH_LONG).show();
             }
         });

}

class SendData extends AsyncTask<String, Void, Void> {


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

     String message = voids[0];
    try {
        Log.i(TAG, "Attempting to send...");
        s = new Socket();
        s.connect(new InetSocketAddress(ip,port));
        Log.i(TAG,"Socket connected...");
    }
    catch (IOException e) {
  e.printStackTrace();

    }


     try {
     pr = new PrintWriter(s.getOutputStream());
         Log.i(TAG,"Get Outstream...");
     error here-->     pr.write(message);
         Log.i(TAG,"writing message...");
         pr.flush();

         Log.i(TAG,"flushing...");
         pr.close();

     } catch (IOException e) {

         e.printStackTrace();
     }




         Log.i(TAG,"closing...");
     try {
         s.close();
         Log.i(TAG,"socket closed...");
     } catch (IOException e) {

         e.printStackTrace();
     }

     return null;
 }



 }
 }

最后但并非最不重要的是PC端的服务器代码

public class Testtcp2 {

   private static  ServerSocket ss;
private static Socket s;
private  static BufferedReader bufferedreader;
private static InputStreamReader isr;
private static String message;



public static void main(String[] args) {
    try{
        ss = new ServerSocket(5555);

          while(true){
              s = ss.accept();
              isr = new InputStreamReader(s.getInputStream());
              bufferedreader = new BufferedReader(isr);
              message = bufferedreader.readLine();

              System.out.println(message);


       }






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

}
}

【问题讨论】:

  • 在您的代码中,如果 s 在创建或连接期间抛出异常,它将断开连接,但您仍会在其上调用 getOutputStream。这可能是正在发生的事情。您应该将 ex.printStackTrace() 添加到 catch 块中,以便查看何时发生。
  • 唯一显示的错误是我发布的错误
  • 因为你默默地忽略了另一个。这就是空的 catch 块的作用。
  • 我不知何故错过了让我们看看发生了什么
  • 啊哈哈 printwriter.write 行上的空指针

标签: java android tcpclient tcpserver


【解决方案1】:

提供的代码 sn-p 忽略连接失败。请从记录当前被忽略的异常开始:

try {
    // ...
    s = new Socket();
    s.connect(new InetSocketAddress(ip,port));
    // ...
}
catch (IOException e) {
    // Here lays an answer for your issue, just log it and see the cause.
    e.printStackTrace();   // As suggested by @gabe-sechan.
}

【讨论】:

  • 这不是一个重复的问题....它是空的,因为 PrintWriter 的其他部分不在我为测试相同的套接字连接而添加的 try catch 块之外,仍然存在错误
  • @apklegion 如果根本问题是一个 NPE, 上面提到过,它是重复的。这一切都源于您结构不良的代码。取决于先前try 块中代码成功的代码应该在该try 块内。
  • @apklegion 有一件事可以在将来帮助您 - 当您使用抛出异常的方法时,不要立即捕获它,只需根据需要编写代码:首先连接,然后阅读,然后在远端,当您对整个操作是否成功感兴趣时 - 然后捕获累积的异常,只是为了知道向用户显示什么或者您是否应该采取一些措施。如果您捕获异常只是为了将其记录到控制台并且不执行任何进一步的操作 - 这主要是一个信号,您可以尽早捕获它。
  • 对于未来的读者,我发现这是java程序中的防火墙阻止运行简单修复。代码很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-01
  • 2011-08-31
  • 2023-03-21
  • 2021-10-28
  • 1970-01-01
  • 2012-01-03
相关资源
最近更新 更多