客户端
/**
 * 发送消息
 */class SendMes extends Thread {
private Socket socket;
    private String mes;
public SendMes(Socket socket,String mes) {
this.socket = socket;
this.mes=mes;
}
public void run() {
PrintWriter writer = null;
try {
writer = new PrintWriter(socket.getOutputStream());
while (true) {
// 向服务器端发送信息
writer.println(mes);
writer.flush();
}
} catch (IOException e) {
e.printStackTrace();

}
}
/*
 * 客户端
 */
public class ChatClient extends JFrame implements ActionListener{
private String ipAdress;
    JButton connection;
    JTextArea jta;
    JLabel jb;
    JTextField jtf;
    JButton send;
    Socket socket;
public ChatClient(String ipAString) {
setTitle("客户端");
connection=new JButton("连接");
connection.setEnabled(true);
connection.addActionListener(this);
add(connection,BorderLayout.NORTH);
jta=new JTextArea();
add(new JScrollPane(jta),BorderLayout.CENTER);
jb=new JLabel("发送消息内容");
jtf=new JTextField(10);
send=new JButton("发送");
send.addActionListener(this);
JPanel jp=new JPanel();
jp.add(jb);
jp.add(jtf);
jp.add(send);
add(jp,BorderLayout.SOUTH);

setBounds(100,100,300,400);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.ipAdress = ipAdress;
}
    
public void actionPerformed(ActionEvent e){
//连接事件
if(e.getSource()==connection){
try {
socket = new Socket(ipAdress, 8008);
connection.setEnabled(false);
} catch (UnknownHostException e1) {
e1.printStackTrace();
} catch (IOException e1) {
e1.printStackTrace();
}
}
//发送事件
if(e.getSource()==send){
String str=jtf.getText();
new ReadMes(socket).start();
new SendMes(socket,str).start();
}
}
/*
 * 内部类,读取消息
 */
class ReadMes extends Thread {
private Socket socket;
public ReadMes(Socket socket) {
this.socket = socket;
}
public void run() {
BufferedReader reader = null;
try {
reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String message = null;
while (true) {
message = reader.readLine();
jta.append(message+"\n");//将读到的消息添加到JTextArea上
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (reader != null) {
reader.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
} } public static void main(String[] args) throws UnknownHostException,
IOException {
InetAddress ip=InetAddress.getLocalHost();
ChatClient chatClient = new ChatClient(ip.getHostAddress());
}
}
服务端
class Chat extends Thread {
private Socket socket;
private List<Socket> socketList;
private int count; public Chat(int count, Socket socket, List<Socket> socketList) {
this.count = count;
this.socket = socket;
this.socketList = socketList;
} public void run() {
BufferedReader reader = null;
PrintWriter writer = null;
try {
reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); String message = null;
while (true) {
message = reader.readLine();
// 向所有的客户端发送接收到信息,实现群聊
for (int i = 0; i < socketList.size(); i++) {
writer = new PrintWriter(socketList.get(i).getOutputStream());
writer.println(count + " say: " + message);
writer.flush();
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}public class ChatServer {
public void startWork() throws IOException {
ServerSocket serverSocket = new ServerSocket(8008);
List<Socket> socketList = new ArrayList<Socket>();
Socket socket = null;
int count = 0;
while (true) {
socket = serverSocket.accept();
count++;
System.out.println(count + " clinet connected to the server!");
// 将每一个连接到该服务器的客户端,加到List中
socketList.add(socket);
// 每一个连接到服务器的客户端,服务器开启一个新的线程来处理
new Chat(count, socket, socketList).start();
}
} public static void main(String[] args) throws IOException {
ChatServer chatServer = new ChatServer();
chatServer.startWork();
}}
想实现群聊功能运行效果,启动服务器,打开两个客服端连接,发送一次消息,不能群聊,并且发送消息的那个客服端出现了很多次消息。

解决方案 »

  1.   

    while (true) {
     message = reader.readLine();不管有没有读到消息.都把消息转发到所有socket.
    因此发消息客户端会不断的收到消息.
      

  2.   

    谢,问题已经解决,是应为
    while (true) {
    // 向服务器端发送信息
    writer.println(mes);
    writer.flush();
    }
    这里发送消息的时候写到循环里面了,所有服务器会一直都接收到第一次发送的消息,就会一直往客服端发送导致客服端一直都是接收到的第一次的消息。