簡體   English   中英

Android中如何將多個客戶端連接到服務器?

[英]how connect multiple client to a server in Android?

我想創建一個聊天室,其中有 3 個(或更多設備)通過熱點和服務器上的 Tcp 協議連接到服務器,並且客戶端和客戶端無法相互通信,這是我的代碼,當應用程序啟動時,它嘗試連接到服務器(如果存在)如果它沒有找到服務器然后它運行服務器套接字等待客戶端只有一個客戶端可以連接到服務器並發送和接收消息我知道我必須使用多線程但我無法處理這個請幫助我:(

 package com.app.wifi_chat;
    import java.io.BufferedReader;
    import java.io.DataOutputStream;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.net.InetSocketAddress;
    import java.net.ServerSocket;
    import java.net.Socket;
    import com.uncocoder.app.wifi_chat.R;
    import android.app.Activity;
    import android.os.Bundle;
    import android.os.Handler;
    import android.view.KeyEvent;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.TextView;


    public class WifiChatActivity extends Activity {

    private Handler          handler = new Handler();
    private TextView         text;
    private EditText         input;
    private Button           btnSend;
    private Socket           socket;
    private DataOutputStream outputStream;
    private BufferedReader   inputStream;

//try to connect to server if find it return true 
    private boolean searchNetwork() {
        log("Connecting...");

        String range = "192.168.1.";
        for (int i = 1; i <= 255; i++) {
            String ip = range + i;
            try {
                //log("Try IP: " + ip);
                socket = new Socket();
                socket.connect(new InetSocketAddress(ip, 9000), 10);

                log("Connected!");
                return true;
            }
            catch (Exception e) {}
        }

        return false;
    }

//run server and wait for new client
    private void runChatServer() {
        try {
            log("Waiting for client...");

            ServerSocket serverSocket = new ServerSocket(9000);
            socket = serverSocket.accept();

            log("A new client Connected!");
        }
        catch (IOException e) {}
    }


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

        text = (TextView) findViewById(R.id.text);
        input = (EditText) findViewById(R.id.input);
        btnSend = (Button) findViewById(R.id.btnSend);

        //server
        Thread thread = new Thread(new Runnable() {

            @Override
            public void run() {
//first time check for connect to server if not to find it then run server and wait for client
                if ( !searchNetwork()) {
                    runChatServer();
                }

                try {
                    outputStream = new DataOutputStream(socket.getOutputStream());
                    inputStream = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                }
                catch (IOException e1) {
                    log("Error: Connection is not stable, exit");
                    shutdown();
                }
//listen to client for get messeage
                while (true) {
                    try {
                        String message = inputStream.readLine();
                        if (message != null) {
                            log(message);
                        }
                    }
                    catch (IOException e) {}
                }
            }
        });
//send message to client or server
        btnSend.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                if (outputStream == null) {
                    return;
                }

                try {
                    String message = input.getText().toString() + "\n";
                    outputStream.write(message.getBytes());
                }
                catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });

        thread.start();
    }

//log  messeage form client or server
    private void log(final String message) {
        long timestamp = System.currentTimeMillis();
        final long time = timestamp % 1000000;

        handler.post(new Runnable() {

            @Override
            public void run() {
                text.setText(text.getText() + "\n @" + time + ": " + message);
            }
        });
    }

//when app is kill close socket 
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            shutdown();
            return true;
        }

        return super.onKeyDown(keyCode, event);
    }


    private void shutdown() {
        try {
            if (socket != null) {
                socket.close();
            }
        }
        catch (IOException e) {
            e.printStackTrace();
        }
        System.exit(0);
    }
    }

你的代碼一團糟。

通常你需要做這樣的事情

class ClientClass 實現 Runnable //用於管理客戶端 { Socket socket;

public ClientClass(Socket s)
{
    socket = s;
}

void run()
{
    //Get InputStreams
    //Manage client
}

}

ServerClass

while(true)
{
    new Thread(new ClientClass(server.accept()));//Maybe you want to store it for future comunication
}

希望這可以幫助。

暫無
暫無

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

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