Android客户端和Java服务器TCP通信

时间:2022-08-26 20:02:48

I'm developing an Android application (client) and want it to connect with my Java server using TCP communication.

我正在开发一个Android应用程序(客户端),并希望它使用TCP通信与我的Java服务器连接。

I've done the code - simple program, client send a message and server echos it back - as below:

我已经完成了代码 - 简单的程序,客户端发送消息,服务器回复它 - 如下所示:

Server code:

服务器代码:

    import java.net.*;


public class Server {

    public static void main(String[] args) {

        int nreq = 1;
        try
        {
            ServerSocket sock = new ServerSocket (8080);
            for (;;)
            {
                Socket newsock = sock.accept();
                System.out.println("Creating thread ...");
                Thread t = new ThreadHandler(newsock,nreq);
                t.start();
            }
        }
        catch (Exception e)
        {
            System.out.println("IO error " + e);
        }
        System.out.println("End!");
    }
}

a Thread Handler code in the same project file of the server:

服务器的同一项目文件中的线程处理程序代码:

    import java.io.*;
import java.net.*;

class ThreadHandler extends Thread {
    Socket newsock;
    int n;

    ThreadHandler(Socket s, int v) {
        newsock = s;
        n = v;
    }


    public void run() {
        try {

            PrintWriter outp = new PrintWriter(newsock.getOutputStream(), true);
            BufferedReader inp = new BufferedReader(new InputStreamReader(
                    newsock.getInputStream()));

            outp.println("Hello :: enter QUIT to exit \n");
            boolean more_data = true;
            String line;

            while (more_data) {
                line = inp.readLine();
                System.out.println("Message '" + line + "' echoed back to client.");
                if (line == null) {
                    System.out.println("line = null");
                    more_data = false;
                } else {
                    outp.println("From server: " + line + ". \n");
                    if (line.trim().equals("QUIT"))
                        more_data = false;
                }
            }
            newsock.close();
            System.out.println("Disconnected from client number: " + n);
        } catch (Exception e) {
            System.out.println("IO error " + e);
        }

    }
}

And this is the Client side (Android):

这是客户端(Android):

package com.android.client;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class Client extends Activity {
    /** Called when the activity is first created. */
    Scanner scanner = new Scanner(System.in);

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        final EditText msg = (EditText) findViewById(R.id.etMsg);
        Button send = (Button) findViewById(R.id.bSend);
        final TextView convo = (TextView) findViewById(R.id.tvConvo);
        final TextView status = (TextView) findViewById(R.id.tvStatus);

        try {
            send.setOnClickListener(new View.OnClickListener() {

                Socket s = new Socket("localhost", 8080);
                String message = msg.getText().toString();

                @Override
                public void onClick(View v) {
                    status.setText("...");
                    PrintWriter outp = null;
                    BufferedReader inp = null;
                    status.setText("Established connection..");
                    String serverMsg = null;

                    try {
                        outp = new PrintWriter(s.getOutputStream(), true);
                        inp = new BufferedReader(new InputStreamReader(s.getInputStream()));
                        serverMsg = inp.readLine();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    convo.append(serverMsg + "\n");

                    if (message != null) {
                        if (msg.getText().toString().trim() == "QUIT") {
                            try {
                                s.close();
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                            status.setText("Disconnected from server.");

                        } else {
                                try {

                                    convo.append(message + "\n");
                                    outp.println(message); 
                                    serverMsg = inp.readLine();
                                    convo.append(serverMsg + "\n");
                                } catch (IOException e) {
                                    e.printStackTrace();
                                }
                        }

                    }
                    else
                        status.setText("Problem in connection..!");
                }
            });
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

And this is the XML file:

这是XML文件:

<?xml version="1.0" encoding="utf-8" ?> 
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical">
  <TextView android:id="@+id/tvText" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Your message here:" /> 
- <EditText android:id="@+id/etMsg" android:layout_width="match_parent" android:layout_height="wrap_content" android:ems="10">
  <requestFocus /> 
  </EditText>
  <TextView android:id="@+id/tvStatus" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Status..." android:textAppearance="?android:attr/textAppearanceSmall" /> 
  <Button android:id="@+id/bSend" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Send" /> 
  <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Conversation:" android:textAppearance="?android:attr/textAppearanceLarge" /> 
  <TextView android:id="@+id/tvConvo" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="" /> 
  </LinearLayout>

I tried running it, but nothing happens. When I click the button the TextView doesn't view the "Hello" message from the server.

我试过运行它,但没有任何反应。当我单击按钮时,TextView不会从服务器查看“Hello”消息。

2 个解决方案

#1


8  

You connect with your Android client to localhost.

您将Android客户端连接到localhost。

Socket s = new Socket("localhost", 8080);

This would only work when your server is running on the Android device. But I think it is running on your PC. So, when you run your app on Android emulator, you can connect to 10.0.2.2 in order to contact the host. On a real device, you have to find out your servers IP address which can be reached by the Android device, e.g. via Wi-Fi.

这仅适用于您的服务器在Android设备上运行的情况。但我认为它在你的电脑上运行。因此,当您在Android模拟器上运行应用程序时,可以连接到10.0.2.2以联系主机。在真实设备上,您必须找到Android设备可以访问的服务器IP地址,例如:通过Wi-Fi。

#2


0  

If your server is on Windows, type cmd in the Start menu search box and then type ipconfig at the command prompt. You will see something like IVP4 Address----- 192.168.0.101. you need to use this address and port number on your client.

如果您的服务器在Windows上,请在“开始”菜单搜索框中键入cmd,然后在命令提示符下键入ipconfig。您将看到类似IVP4地址----- 192.168.0.101的内容。您需要在客户端上使用此地址和端口号。

#1


8  

You connect with your Android client to localhost.

您将Android客户端连接到localhost。

Socket s = new Socket("localhost", 8080);

This would only work when your server is running on the Android device. But I think it is running on your PC. So, when you run your app on Android emulator, you can connect to 10.0.2.2 in order to contact the host. On a real device, you have to find out your servers IP address which can be reached by the Android device, e.g. via Wi-Fi.

这仅适用于您的服务器在Android设备上运行的情况。但我认为它在你的电脑上运行。因此,当您在Android模拟器上运行应用程序时,可以连接到10.0.2.2以联系主机。在真实设备上,您必须找到Android设备可以访问的服务器IP地址,例如:通过Wi-Fi。

#2


0  

If your server is on Windows, type cmd in the Start menu search box and then type ipconfig at the command prompt. You will see something like IVP4 Address----- 192.168.0.101. you need to use this address and port number on your client.

如果您的服务器在Windows上,请在“开始”菜单搜索框中键入cmd,然后在命令提示符下键入ipconfig。您将看到类似IVP4地址----- 192.168.0.101的内容。您需要在客户端上使用此地址和端口号。