簡體   English   中英

當 Java 作為客戶端和 Android 作為服務器時 ServerSocket 不工作

[英]ServerSocket not working when Java as Client and Android as server

我想將我的 android 作為服務器,將 PC 上的 Java 作為客戶端。這可能嗎?我試過但有些錯誤。我從教程中得到了服務器代碼。

注意:我已經在同一路由器上連接了我的電腦和手機。

服務器代碼安卓:

public class Server extends Activity {

    private ServerSocket serverSocket;

    Handler updateConversationHandler;

    Thread serverThread = null;

    private TextView text;



    public static final int SERVERPORT = 6000;

    @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        text = (TextView) findViewById(R.id.text2);

        updateConversationHandler = new Handler();

        this.serverThread = new Thread(new ServerThread());
        this.serverThread.start();

    }

    @Override
    protected void onStop() {
        super.onStop();
        try {
            serverSocket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    class ServerThread implements Runnable {

        public void run() {
            Socket socket = null;
            try {
                serverSocket = new ServerSocket(SERVERPORT);
            } catch (IOException e) {
                e.printStackTrace();
            }
            while (!Thread.currentThread().isInterrupted()) {

                try {

                    socket = serverSocket.accept();

                    CommunicationThread commThread = new CommunicationThread(socket);
                    new Thread(commThread).start();

                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    class CommunicationThread implements Runnable {

        private Socket clientSocket;

        private BufferedReader input;

        public CommunicationThread(Socket clientSocket) {

            this.clientSocket = clientSocket;

            try {

                this.input = new BufferedReader(new InputStreamReader(this.clientSocket.getInputStream()));

            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        public void run() {


            while (!Thread.currentThread().isInterrupted()) {

                try {

                    String read = input.readLine();

                    updateConversationHandler.post(new updateUIThread(read));

                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    }

    class updateUIThread implements Runnable {
        private String msg;

        public updateUIThread(String str) {
            this.msg = str;
        }

        @Override
        public void run() {
            text.setText(text.getText().toString()+"Client Says: "+ msg + "\n");
        }

    }

}

Java客戶端代碼:

public class ServerCyb {

    public static void main(String[]arg) throws Exception
    {               
        Socket server1=new Socket("192.168.1.4", 6000);
        OutputStream e=server1.getOutputStream();
        PrintStream ps=new PrintStream(e);
        ps.println("Test");
        server1.close();
    }

}

客戶端錯誤:

Exception in thread "main" java.net.ConnectException: Connection refused: connect
    at java.net.DualStackPlainSocketImpl.connect0(Native Method)
    at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source)
    at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)
    at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)
    at java.net.AbstractPlainSocketImpl.connect(Unknown Source)
    at java.net.PlainSocketImpl.connect(Unknown Source)
    at java.net.SocksSocketImpl.connect(Unknown Source)
    at java.net.Socket.connect(Unknown Source)
    at java.net.Socket.connect(Unknown Source)
    at java.net.Socket.<init>(Unknown Source)
    at java.net.Socket.<init>(Unknown Source)
    at ServerCyb.main(ServerCyb.java:20)

編輯:我已經在 AndroidManifest.xml 中包含了所有需要的權限

可能是安卓權限問題。 檢查此權限是否存在於您的 AndroidManifest.xml 文件中:

<uses-permission android:name="android.permission.INTERNET" />

我認為 AndroidManifest.xml 的權限是 -

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

嘗試更換Socket server1=new Socket("192.168.1.4", 6000);

        server1 = new Socket();
        server1.connect(new InetSocketAddress(InetAddress.getByName("192.168.1.4"),6000), 100);

我找到了答案! :)

ServerSocket server;


try{
    String hostname = "yourIpAdress";
    server = new ServerSocket();
    server.bind(new InetSocketAddress(hostname, port)); //you need this
}catch (Exception e){
    e.printStackTrace();
}

while(true){
    try{
        Socket client = server.accept();
        DataInputStream input = new DataInputStream(client.getInputStream());
        String messsage = input.readUTF();
        DataOutputStream output = new DataOutputStream(client.getOutputStream());
        output.writeUTF("Connected!");
        client.close();
    } catch (Exception e){
        e.printStackTrace();
    }
}

你需要這個:

ServerSocket server;
String hostname = "yourIpAdress";
server = new ServerSocket();
server.bind(new InetSocketAddress(hostname, port));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM