簡體   English   中英

線程和網絡問題

[英]Threads & networking issue

給出以下代碼:

 Client c1 = new Client();
 c1.connect("127.0.0.1",1300);

連接功能:

public void connect(String serverName, int port)
{
    try {

        Socket socket = new Socket(serverName,port);
        connection = new ConnectionProxy(socket);
        connection.start();
    }
    catch(IOException e)
    {
        e.printStackTrace();
    }
}

ConnectionProxy類擴展了Thread ):

public class ConnectionProxy extends Thread {
private Socket socket;
private InputStream is;
private OutputStream os;
private StringConsumer client;

public ConnectionProxy(Socket socket)
{
    this.socket = socket;

    try {
        is = socket.getInputStream();
        os = socket.getOutputStream();
    }
    catch(IOException e)
    {
        e.printStackTrace();
    }
}
public void run () {

    DataInputStream dis = new DataInputStream(is);
    DataOutputStream dos = new DataOutputStream(os);

    while (socket != null)
    {
        try {
            String msg = dis.readUTF();
            System.out.println(msg);
        }
        catch(IOException e)
        {
            e.printStackTrace();
        }

    }
}

我正在嘗試進行聊天,發現很難將客戶端編寫的消息發送給所有當前連接的客戶端。

我該怎么辦? 我應該在服務器端保存每個對象(例如c1)的引用,還是應該在服務器端保存該ConnectionProxy線程? 如果沒有,我該如何正確而有效地實施呢?

希望得到一些幫助! 謝謝!

在沒有太多代碼的情況下,我將概述您要實現目標所需要做的事情。

在您的server

  • 保留所有連接的client對象的array或類似內容
  • client類中實現send()函數
  • 實現broadcast()函數,該函數遍歷客戶端列表並向每個客戶端發送消息(使用上述send()函數)
  • 確保從列表中跟蹤(並刪除)所有已死/斷開連接的clients ,否則嘗試發送給它們時會遇到麻煩。

在您的client

  • 確保在關閉/斷開連接時發送“連接終止”消息,以告知要離開的server (使服務器更容易將您卸下)

服務器應為每個傳入的連接創建一個新的客戶端處理程序線程。

例如,在服務器端嘗試以下操作:

ServerSocket server = new ServerSocket(port);

    while (true) {
        Socket client = server.accept();
        //add incoming client to connected clients vector.
        HandleClient c = new HandleClient(client);
        clients.add(c);
    }

在將客戶創建並存儲到客戶向量中之后,可以在HandleClient類run()方法上實現bufferReader(同樣不是必須的)以獲取客戶文本

暫無
暫無

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

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