以下程序是先运行服务器端程序,再运行客户端程序,否则会抛出异常。
(1)服务器端程序
public class Server {
static ArrayList<Socket> clients=new ArrayList<Socket>(); //Socket集合
public static void main(String[] args) {
try{
ServerSocket server=new ServerSocket(8889);
System.out.println("服务器已经启动......");
while(true){
Socket socket=server.accept(); //接受客户端连接
clients.add(socket); //把客户端保存到集合中
transmitMessage(socket);
}
}catch(IOException e){
e.printStackTrace();
}
}
//接收客户端输入的方法
private static void transmitMessage(Socket socket) {
new Thread(){
private Scanner scan;
public void run(){
try{
InputStream is=socket.getInputStream(); //获取客户端Socket输入流
scan=new Scanner(is); //创建输入流扫描器
//发送连接成功信息
socket.getOutputStream().write("连接成功...\n".getBytes());
}catch(IOException e1){
e1.printStackTrace();
}
while(true){
String text=scan.nextLine()+"\n"; //接受客户发送的信息
for(Socket client:clients){
try{
OutputStream out=client.getOutputStream();//获取每个客户端的输出流
out.write(text.getBytes()); //向每个客户端转发信息
out.flush();
}catch(IOException e){
e.printStackTrace();
}
}
}
}
}.start();
}
}
(2)客户端程序
public class Client extends JFrame {
private JPanel contentPane;
private Socket socket;
private JTextArea textArea;
private JTextField textField;
private JTextField textField1;
private OutputStream out;
private InputStream is;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
Client frame = new Client();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the frame.
* @throws IOException
* @throws UnknownHostException
*/
public Client() throws UnknownHostException, IOException {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);
JPanel panel = new JPanel();
panel.setBounds(10, 10, 398, 39);
contentPane.add(panel);
JLabel lblNewLabel = new JLabel("\u6635\u79F0\uFF1A");
panel.add(lblNewLabel);
textField = new JTextField();
textField.setText("\u6E38\u5BA2");
panel.add(textField);
textField.setColumns(20);
JScrollPane scrollPane = new JScrollPane();
scrollPane.setBounds(10, 59, 398, 143);
contentPane.add(scrollPane);
textArea = new JTextArea();
scrollPane.setViewportView(textArea);
JPanel panel1 = new JPanel();
panel1.setBounds(10, 212, 398, 39);
contentPane.add(panel1);
JLabel lblNewLabel_1 = new JLabel("\u8F93\u5165\u804A\u5929\u5185\u5BB9");
panel1.add(lblNewLabel_1);
textField1 = new JTextField();
panel1.add(textField1);
textField1.setColumns(20);
JButton btnNewButton = new JButton("\u53D1\u9001");
btnNewButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
try{
out=socket.getOutputStream(); //获取Socket输出流
String name=textField.getText()+":"; //获取昵称
String text=name+textField1.getText()+"\n";//为信息添加结束符
out.write(text.getBytes()); //发送信息到服务器端
out.flush();
textField1.setText(""); //清空文本框内容
}catch(IOException e1){
e1.printStackTrace();
}
}
});
btnNewButton.setHorizontalAlignment(SwingConstants.RIGHT);
panel1.add(btnNewButton);
socket=new Socket("127.0.0.1",8889); //创建连接服务器的Socket
receiveMessage(); //启动接收信息的线程
}
private void receiveMessage() { //接收信息的方法
new Thread(){ //创建线程
public void run(){
try{
is=socket.getInputStream();
Scanner scan=new Scanner(is); //创建输入流扫描器
while(socket.isConnected()){
String text=scan.nextLine()+"\n";//读取一行信息
textArea.append(text); //将读取的信息显示到文本域控件
sleep(100); //线程休眠
}
}catch(Exception e){
e.printStackTrace();
}
}
}.start(); //线程启动
}
}