import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Iterator;
public class ChatServer {
ArrayList<PrintWriter> inputStramList=new ArrayList<PrintWriter>();
public static void main(String[] args) {
ChatServer server=new ChatServer();
server.go();
}
public void go(){
try {
ServerSocket serverSocket=new ServerSocket(5000);
while(true){
Socket clientSocket=serverSocket.accept();
System.out.println("server connected it");
PrintWriter writer=new PrintWriter(clientSocket.getOutputStream());
inputStramList.add(writer);
Thread t=new Thread(new ReceiveRunnable(clientSocket));
t.start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
public class ReceiveRunnable implements Runnable {
BufferedReader reader;
public ReceiveRunnable(Socket socket){
try {
reader=new BufferedReader(new InputStreamReader(socket.getInputStream()));
} catch (IOException e) {
}
}
public void run() {
String message;
while(true){
try {
// 同客户端
if((message=reader.readLine())!=null){
telleverbody(message);
System.out.println("server send it "+message);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
private void telleverbody(String message) {
Iterator<PrintWriter> it=inputStramList.iterator();
while(it.hasNext()){
// 本来Iterator就有泛型,不需要强制类型转换
PrintWriter writer= it.next();
writer.println(message);
writer.flush();
}
}
}
}
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.ScrollPaneConstants;
public class chat {
JFrame frame;
JTextArea outputText;
JTextField inputText;
JButton sendButton;
JPanel mainPanel;
JPanel inputPanel;
BufferedReader reader;
Socket socket;
PrintWriter writer;
//定义一个昵称用于表示消息的发送者
private String nickName;
public static void main(String[] args) {
chat chat = new chat();
chat.setUpNetWorking();
chat.buildGUI();
}
public void setUpNetWorking() {
try {
socket = new Socket("127.0.0.1", 5000);
reader = new BufferedReader(new InputStreamReader(socket
.getInputStream()));
writer = new PrintWriter(socket.getOutputStream());
//线程应该在此处开启
// 用于监听服务器消息
ReceiveRunnable run = new ReceiveRunnable();
Thread t = new Thread(run);
t.start();
} catch (IOException e) {
e.printStackTrace();
}
}
public void buildGUI() {
//初始化昵称
while(nickName==null || "".equals(nickName.trim()))
{
nickName = JOptionPane.showInputDialog(frame, "请输入昵称");
}
frame.setTitle(nickName + "的聊天室");
outputText = new JTextArea("", 8, 20);
outputText.setLineWrap(true);
outputText.setEditable(false);
JScrollPane scroller = new JScrollPane(outputText);
scroller
.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
scroller
.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
inputText = new JTextField(15);
// inputText.addActionListener(new SendListener());
// 发送事件应该加在button上 而不是JTextField上
sendButton = new JButton("send");
sendButton.addActionListener(new SendListener());
inputPanel = new JPanel();
inputPanel.setLayout(new BorderLayout());
inputPanel.add(inputText, BorderLayout.CENTER);
inputPanel.add(sendButton, BorderLayout.EAST);
frame = new JFrame("Chat Windows");
frame.getContentPane().add(scroller, BorderLayout.CENTER);
frame.getContentPane().add(inputPanel, BorderLayout.SOUTH);
frame.setVisible(true);
frame.pack();
inputText.requestFocus();
}
public class SendListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
//服务器是将数据写回到所有客户端,所以不需要在自己的消息区拼接消息
// outputText.setText(outputText.getText() + "me :"
// + inputText.getText() + "\n");
String msg = nickName + ":" + inputText.getText();
writer.println(msg);
writer.flush();
System.out.println("client send it " + inputText.getText());
inputText.setText("");
inputText.requestFocus();
}
}
public class ReceiveRunnable implements Runnable {
@Override
public void run() {
while (true) {
String message = null;
try {
//不应该是while循环,外面已经有while了 if就够了
//其实if都不需要,因为reader.readLine()会阻塞线程
if ((message = reader.readLine()) != null) {
System.out.println("cilent Revive it " + message);
// 发送时已经加过昵称,所以不需要someone
outputText.setText(outputText.getText()
+ message + "\n");
}
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
}
}
}