如何在 AsyncTask 中启动客户端并连接到服务器?
Posted
技术标签:
【中文标题】如何在 AsyncTask 中启动客户端并连接到服务器?【英文标题】:How to start the client and connect to the server in AsyncTask? 【发布时间】:2018-01-14 02:43:34 【问题描述】:我通过命令行服务器在计算机上运行,端口为 6666。告诉我如何通过单击模拟器中的按钮连接到它?我出现在广泛的海鸥“正在连接......”然后出现错误:W / System.err: java.net.ConnectException: Connection refused
。同时,当我运行服务器和客户端只是分离文件时,一切正常,无论是命令行还是在 android studio 中。我究竟做错了什么?
这是 MainActivity:
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity implements View.OnClickListener
Button but;
MyTask mt;
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
but = (Button) findViewById(R.id.btnOk);
but.setOnClickListener(this);
public void onClick(View v)
mt = new MyTask();
mt.execute();
class MyTask extends AsyncTask<Void, Void, Void>
int port = 6666;
@Override
protected void onPreExecute()
super.onPreExecute();
@Override
protected Void doInBackground(Void... params)
int serverPort = 6666;
String address = "127.0.0.1";
try
InetAddress ipAddress = InetAddress.getByName(address);
System.out.println("Connecting...");
Socket socket = new Socket(ipAddress, serverPort);
System.out.println("Connected");
catch (Exception x)
x.printStackTrace();
return null;
@Override
protected void onPostExecute(Void result)
super.onPostExecute(result);
我收到以下错误:
java.net.ConnectException: Connection refused
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:334)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:196)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:178)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:356)
at java.net.Socket.connect(Socket.java:605)
at java.net.Socket.connect(Socket.java:554)
at java.net.Socket.<init>(Socket.java:431)
at java.net.Socket.<init>(Socket.java:241)
at com.tenday.myapplication.MainActivity$MyTask.doInBackground(MainActivity.java:56)
at com.tenday.myapplication.MainActivity$MyTask.doInBackground(MainActivity.java:41)
at android.os.AsyncTask$2.call(AsyncTask.java:305)
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)
at java.lang.Thread.run(Thread.java:761)
【问题讨论】:
Android HTTP Connection refused的可能重复 【参考方案1】:如果您使用的是模拟器,您使用的 IP 地址可能是错误的,您应该使用 10.0.0.2。 see the android docs
【讨论】:
【参考方案2】:更改您要连接的 IP 地址
String address = "127.0.0.1";
使用运行服务器的机器的 IP 地址,因为127.0.0.1
将指向移动设备而不是托管模拟器的计算机。
你应该使用类似的东西
String address = "192.168.100.10";
或计算机拥有的任何 IP 地址
【讨论】:
以上是关于如何在 AsyncTask 中启动客户端并连接到服务器?的主要内容,如果未能解决你的问题,请参考以下文章
Derby 在 Java 应用程序中自动启动服务器并连接到数据库
如何以编程方式在 android 中创建 *** 配置文件并连接到它?
docker app 在 https 上服务并连接到外部 rethinkdb