Я создаю простое приложение на Java для выполнения TCP-соединения между моим P C и Android устройством. Передача данных двусторонняя (ie: и мой P C, и устройство Android действуют как клиенты и серверы).
Для стороны android - P c Я вписываю в текстовое поле и нажимаю отправить, и текст появляется в jTextArea P C. Это соединение работает отлично.
Для стороны от P C до android я печатаю в jTextField и нажимаю Send, и этот текст должен появиться на устройстве Android. Однако вместо этого P C (который в настоящее время является клиентом) ждет в течение 5 секунд, а затем завершается с ошибкой ConnectException, сообщающей, что время сокета истекло. Я знаю, что строка, вызывающая ошибку, - это строка:
Socket s = new Socket ("10.0.2.15", 9999);
, так как клиент не может подключиться к серверу , (10.0.2.15 - это IP-адрес, используемый эмулятором Android, а 192.168.0.53 - это IP-адрес моего P C).
Код P C выполняется внутри NetBeans IDE, и код Android выполняется внутри Android Studio.
Вот мой код P C:
import java.net.*;
import java.io.*;
public class AndroidToPCGUI extends javax.swing.JFrame {
/**
* Creates new form AndroidToPCGUI
*/
public AndroidToPCGUI() {
initComponents();
}
/**
* This method is called from within the constructor to initialize the form.
* WARNING: Do NOT modify this code. The content of this method is always
* regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
jScrollPane1 = new javax.swing.JScrollPane();
textRecievedFromServer = new javax.swing.JTextArea();
textToSendTextField = new javax.swing.JTextField();
sendDataToAndroid = new javax.swing.JButton();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
textRecievedFromServer.setColumns(20);
textRecievedFromServer.setRows(5);
jScrollPane1.setViewportView(textRecievedFromServer);
textToSendTextField.setText("jTextField2");
sendDataToAndroid.setText("SEND TO ANDROID");
sendDataToAndroid.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
sendDataToAndroidActionPerformed(evt);
}
});
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(24, 24, 24)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(sendDataToAndroid)
.addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 290, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(textToSendTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 223, javax.swing.GroupLayout.PREFERRED_SIZE))
.addContainerGap(86, Short.MAX_VALUE))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 185, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(18, 18, 18)
.addComponent(textToSendTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 24, Short.MAX_VALUE)
.addComponent(sendDataToAndroid)
.addContainerGap())
);
pack();
}// </editor-fold>
private void sendDataToAndroidActionPerformed(java.awt.event.ActionEvent evt) {
//PC Client Code
try
{
Socket s = new Socket("10.0.2.15", 9999);
PrintWriter pw = new PrintWriter(s.getOutputStream());
pw.write(textToSendTextField.getText());
pw.flush();
pw.close();
s.close();
}
catch(IOException e)
{
e.printStackTrace();
}
}
/**
* @param args the command line arguments
*/
public static void main(String args[]) {
/* Set the Nimbus look and feel */
//<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
/* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
* For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
*/
try {
for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
javax.swing.UIManager.setLookAndFeel(info.getClassName());
break;
}
}
} catch (ClassNotFoundException ex) {
java.util.logging.Logger.getLogger(AndroidToPCGUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (InstantiationException ex) {
java.util.logging.Logger.getLogger(AndroidToPCGUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (IllegalAccessException ex) {
java.util.logging.Logger.getLogger(AndroidToPCGUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (javax.swing.UnsupportedLookAndFeelException ex) {
java.util.logging.Logger.getLogger(AndroidToPCGUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
}
//</editor-fold>
AndroidToPCGUI and = new AndroidToPCGUI();
/* Create and display the form */
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
and.setVisible(true);
}
});
try //PC Server code
{
Socket s;
InputStreamReader isr;
BufferedReader buffReader;
String message;
ServerSocket serverSock = new ServerSocket(12000);
while(true)
{
s = serverSock.accept();
isr = new InputStreamReader(s.getInputStream());
buffReader = new BufferedReader(isr);
message = buffReader.readLine();
and.textRecievedFromServer.setText(message);//Overriding the text
}
}
catch(IOException e)
{
e.printStackTrace();
}
}
// Variables declaration - do not modify
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JButton sendDataToAndroid;
private javax.swing.JTextArea textRecievedFromServer;
private javax.swing.JTextField textToSendTextField;
// End of variables declaration
}
Android Код:
package com.example.testandroidserver;
import androidx.appcompat.app.AppCompatActivity;
import java.io.*;
import java.net.*;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
EditText editText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
editText = (EditText) findViewById(R.id.editText);
Thread myThread = new Thread(new MyServerThread()) ;
myThread.start();
}
class SendToPC extends AsyncTask<String, Void, Void>
{
private Socket sock; //For sending the email address to the server
private PrintWriter writer;
@Override
protected Void doInBackground(String... voids)
{
try {
String email = voids[0];
sock = new Socket("192.168.0.53", 12000); // Initiating a socket
writer = new PrintWriter(sock.getOutputStream());
writer.write(email);
writer.flush();
writer.close();
}
catch (IOException e)
{
e.printStackTrace();
}
return null;
}
}
public void send(View v)
{
SendToPC msgSender = new SendToPC();
msgSender.execute(editText.getText().toString());
}
private class MyServerThread implements Runnable {
Socket s;
ServerSocket ss ;
InputStreamReader isr;
BufferedReader buffReader;
String message;
Handler hand = new Handler();
public void run()
{
try {
ss = new ServerSocket(9999);
while (true) {
s = ss.accept();
isr = new InputStreamReader(s.getInputStream());
buffReader = new BufferedReader(isr);
message = buffReader.readLine();
hand.post(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(), message, Toast.LENGTH_SHORT).show();
}
});
}
}
catch( IOException e)
{
e.printStackTrace();
}
}
}
}
Пожалуйста, не стесняйтесь, дайте мне знать, если вам нужна дополнительная информация или у вас есть еще вопросы.
Большое спасибо!