Java 使用套接字在android设备中创建连接
我正在尝试使用android在两个应用程序之间创建连接。我试着用插座连接。我创建了两个应用程序 当客户端想要连接时接受连接的一种 以及另一个请求连接的应用程序 我已经在pc网络中用java在pc上以同样的方式成功地运行了这段代码。连接android的方式也一样吗 我的服务器类实现Java 使用套接字在android设备中创建连接,java,android,sockets,serversocket,Java,Android,Sockets,Serversocket,我正在尝试使用android在两个应用程序之间创建连接。我试着用插座连接。我创建了两个应用程序 当客户端想要连接时接受连接的一种 以及另一个请求连接的应用程序 我已经在pc网络中用java在pc上以同样的方式成功地运行了这段代码。连接android的方式也一样吗 我的服务器类实现 public class MainActivity extends AppCompatActivity { private Button startButton; private ServerSock
public class MainActivity extends AppCompatActivity {
private Button startButton;
private ServerSocket server;
private Socket connection;
private TextView statusText;
private ObjectOutputStream output;
private ObjectInputStream input;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
statusText=(TextView)findViewById(R.id.statusText);
startButton=(Button)findViewById(R.id.startButton);
startButton.setOnClickListener(
new View.OnClickListener() {
@Override
public void onClick(View v) {
startRunning();
}
}
);
}
private void startRunning() {
try{
server=new ServerSocket(8080);
while(true)
{
try{
waitForConnection();
setUpStreams();
whileChatting();
}catch(Exception e){}
}
} catch(Exception e){}
}
public void waitForConnection()
{
setMyStatus("Waiting for client to connect...");
try {
connection= server.accept();
setMyStatus("Now connected to "+ connection.getInetAddress().getHostName());
} catch (IOException e) {
e.printStackTrace();
}
}
public void setUpStreams()
{
try {
output= new ObjectOutputStream(connection.getOutputStream());
output.flush();
input= new ObjectInputStream(connection.getInputStream());
setMyStatus("Streams are now setup. Ready to go...");
} catch (IOException e) {
e.printStackTrace();
}
}
public void whileChatting()
{
setMyStatus("You can now start chatting...");
}
public void setMyStatus(String msg) {
statusText.setText(msg);
}
}
稍后我将使用异步任务之类的任务。但我只是想在这些应用程序中建立连接。
我的客户端实现是这样的
public class MainActivity extends AppCompatActivity {
private Button startButton;
private Socket connection;
private TextView statusText;
public ObjectOutputStream output;
public ObjectInputStream input;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
statusText=(TextView)findViewById(R.id.statusText);
startButton=(Button)findViewById(R.id.startButton);
startButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startRunning();
}
});
}
private void startRunning() {
connectToServer();
setUpStreams();
whileChatting();
}
public void connectToServer()
{
setMyStatus("Connecting to server. Please wait...");
try {
connection= new Socket(InetAddress.getByName("127.0.0.1"),8080);
setMyStatus("Connected to Server."+ connection.getInetAddress().getHostName());
} catch (IOException e) {
e.printStackTrace();
}
}
public void setUpStreams()
{
try {
output= new ObjectOutputStream(connection.getOutputStream());
output.flush();
input= new ObjectInputStream(connection.getInputStream());
setMyStatus("Streams are now setup. Ready to go...");
} catch (IOException e) {
e.printStackTrace();
}
}
public void whileChatting()
{
setMyStatus("You can now start chatting...");
}
public void setMyStatus(String msg) {
statusText.setText(msg);
}
}
我遇到的错误是客户端试图连接到服务器
java.lang.NullPointerException: Attempt to invoke virtual method 'java.io.OutputStream java.net.Socket.getOutputStream()' on a null object reference
at com.myapp.client.clientdemo.MainActivity.setUpStreams(MainActivity.java:71)
at com.myapp.client.clientdemo.MainActivity.startRunning(MainActivity.java:46)
at com.myapp.client.clientdemo.MainActivity.access$000(MainActivity.java:16)
at com.myapp.client.clientdemo.MainActivity$1.onClick(MainActivity.java:33)
这是因为“连接”从未创建过。可能是因为它无法连接,或者它超时并转到下一个代码。如果它超时或未连接,则需要捕获该异常并重试连接,然后再继续后续代码
如果您不能捕获套接字可能进入的所有错误状态,那么套接字可能会很棘手
只需使用while循环结束try-and-catch,直到满足以下条件:
while(!connected & !closed){
try {
connection= new Socket(InetAddress.getByName("127.0.0.1"),8080);
connected = true;
//now it is connected and will exit the loop and continue with other code
} catch (SocketTimeoutException socketTimeoutException) {
//add this for safety
} catch (IOException e) {
e.printStackTrace();
}
}
这是因为“连接”从未创建过。可能是因为它无法连接,或者它超时并转到下一个代码。如果它超时或未连接,则需要捕获该异常并重试连接,然后再继续后续代码
如果您不能捕获套接字可能进入的所有错误状态,那么套接字可能会很棘手
只需使用while循环结束try-and-catch,直到满足以下条件:
while(!connected & !closed){
try {
connection= new Socket(InetAddress.getByName("127.0.0.1"),8080);
connected = true;
//now it is connected and will exit the loop and continue with other code
} catch (SocketTimeoutException socketTimeoutException) {
//add this for safety
} catch (IOException e) {
e.printStackTrace();
}
}
这不起作用,我想可能是android手机的地址不同。这不起作用,我想可能是android手机的地址不同