套接字线程客户端无法互相聊天

时间:2018-04-23 14:04:21

标签: java sockets

我想用套接字编写聊天服务器。我想,至少有两个但理论上甚至更多可以连接并在一个大的“房间”聊天。 我有2个类,一个服务器和一个客户端类。但不知何故,他们只能与自己聊天。

服务器:

package Threads.tcp;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;


public class ChatServer {

private static int PORT = 10023;

public static List<Socket> verbindungen = new ArrayList<>();
public static List<Thread> threads = new ArrayList<>();

public static void main(String[] args) {

    // Server auf Port 10023 horchen lassen
    try (ServerSocket server = new ServerSocket(PORT)) {
        System.out.println("Echo-Server bereit am Port " + PORT);

        while (true) {
            // Auf ankommende Verbindung warten, accept() blockiert so  
lange
            Socket verbindung = server.accept();
            verbindungen.add(verbindung);
            Thread t = new Thread(new Client(verbindung));
            threads.add(t);
            t.start();
        }
    } catch (IOException ex) {
        ex.printStackTrace();
    }
 }
}

客户:

package Threads.tcp;

import java.io.*;
import java.net.Socket;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;

public class Client implements Runnable {

protected List<String> clientList = new ArrayList();

protected int ID;

protected Socket verbindung;

public Client( Socket verbindung) throws IOException {
    this.verbindung = verbindung;
}

@Override
public void run() {

    //       Client-Thread (z.B. EchoHandler.java) ausgelagert werden.
    Writer w = null;
    try {
        w = new OutputStreamWriter(verbindung.getOutputStream(), 
Charset.forName("utf-8"));
    } catch (IOException e) {
        e.printStackTrace();
    }
    BufferedWriter bw = new BufferedWriter(w);

    Reader r = null;
    try {
        r = new InputStreamReader(verbindung.getInputStream());
    } catch (IOException e) {
        e.printStackTrace();
    }
    BufferedReader br = new BufferedReader(r);

    try {

        System.out.println("Verbindung angenommen von " + 
verbindung.getRemoteSocketAddress());
        w.write("Hallo dies ist der Chat Server der 3ci" + "\r\n");
        w.flush();
        w.write("Bitte /quit zum beenden):\r\n");
        w.flush();
        w.write("Welchen Spitznamen moechtest du haben: ");
        w.flush();

        BufferedReader name = new BufferedReader(new 
InputStreamReader(verbindung.getInputStream()));
        String clientName;
        do {
            clientName = name.readLine();
            if (clientList.contains(clientName)) {
                w.write("Der Spitzname ist schon vergeben waehle einen
 anderen: ");
                w.flush();
            }
        } while (clientList.contains(clientName));

        // Add name to list
        clientList.add(clientName);
        ID = clientList.size() - 1;

        w.write(clientList.get(ID) + " hat den Raum betreten." + "\r\n");
        w.flush();

        while (true) {
            // Eingabeaufforderung senden und Zeile einlesen
            bw.write(clientList.get(ID) + ">");
            bw.flush();

            String zeile = br.readLine();
            if (zeile.equals("/quit")) {
                clientList.remove(ID);
                break;
            }

            if (zeile.trim().isEmpty()) {
                bw.write("\r\n");
                bw.flush();
            } else {
                zeile += "\r\n";
                bw.write(zeile);

            }

        }

        System.out.println("Verbindung beendet mit " + 
verbindung.getRemoteSocketAddress());
        verbindung.close();

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

}

我用PUTTY连接了我的客户端并使用了RAW,因为我在windows上编程。

我希望你们能提供帮助。 关心卢卡斯。

0 个答案:

没有答案