客户端
/**
* 发送消息
*/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();
}}
想实现群聊功能运行效果,启动服务器,打开两个客服端连接,发送一次消息,不能群聊,并且发送消息的那个客服端出现了很多次消息。
message = reader.readLine();不管有没有读到消息.都把消息转发到所有socket.
因此发消息客户端会不断的收到消息.
while (true) {
// 向服务器端发送信息
writer.println(mes);
writer.flush();
}
这里发送消息的时候写到循环里面了,所有服务器会一直都接收到第一次发送的消息,就会一直往客服端发送导致客服端一直都是接收到的第一次的消息。