package com.xmut.myChat;


import java.awt.BorderLayout;

import java.awt.GridLayout;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.io.DataInputStream;

import java.io.DataOutputStream;

import java.io.IOException;

import java.io.PrintWriter;

import java.net.ServerSocket;

import java.net.Socket;

import java.util.ArrayList;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;


import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JPanel;

import javax.swing.JScrollPane;

import javax.swing.JTextArea;

//要想达到多人聊天,必须要使用线程池来控制


public class Server {

static JTextArea jta=new JTextArea();

static JTextArea jta2=new JTextArea();

//线程池

static ExecutorService exec;

//功能:把各个接收到的记录返回给其它客户端

static ArrayList list=new ArrayList();

static class GetMessage implements Runnable{

Socket socket;

DataInputStream fromClient;

DataOutputStream toClient;

public GetMessage(Socket socket){

this.socket=socket;

}

@Override

public void run() {

try {

fromClient=new DataInputStream(socket.getInputStream());

String s=fromClient.readUTF();

while(true){

jta.append(socket.getPort()+":"+s+"\n");

s=socket.getPort()+":"+s;

for(Socket moresocket:list){

toClient=new DataOutputStream(moresocket.getOutputStream());

toClient.writeUTF(s);

}

s=fromClient.readUTF();

}

} catch (IOException e) {

e.printStackTrace();

}

}

}


public static void main(String[] args) {

JFrame jf=new JFrame("聊天室-服务器");

jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

jf.setVisible(true);

jf.setBounds(400, 100, 300, 500);

jta.setLineWrap(true);

JScrollPane jsp=new JScrollPane(jta);

jf.add(BorderLayout.CENTER, jsp);

try {

ServerSocket serverSocket=new ServerSocket(8888);

exec=Executors.newCachedThreadPool();

jta.append("服务器已经开启");

while(true){

Socket socket=serverSocket.accept();

GetMessage gm=new GetMessage(socket);

list.add(socket);

exec.execute(gm);

}

} catch (IOException e) {

e.printStackTrace();

}

}

}




package com.xmut.myChat;


import java.awt.BorderLayout;

import java.awt.GridLayout;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.io.DataInputStream;

import java.io.DataOutputStream;

import java.io.IOException;

import java.io.PrintWriter;

import java.net.ServerSocket;

import java.net.Socket;


import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JPanel;

import javax.swing.JScrollPane;

import javax.swing.JTextArea;


import com.xmut.myChat.Server.GetMessage;

public class Client {


static JTextArea jta=new JTextArea();

static JTextArea jta2=new JTextArea();

static class GetMessage extends Thread{

Socket socket;

public GetMessage(Socket socket){

this.socket=socket;

}

@Override

public void run() {

try {

DataInputStream dis=new DataInputStream(socket.getInputStream());

String s=dis.readUTF();

System.out.println(s);

while(!s.equals("byb")){

jta.append(s+"\n");

s=dis.readUTF();

}

} catch (IOException e) {

e.printStackTrace();

}

}

}


public static void main(String[] args) {

JFrame jf=new JFrame("聊天室-客户端");

jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

jf.setVisible(true);

jf.setBounds(100, 100, 300, 500);

jta.setLineWrap(true);

JScrollPane jsp=new JScrollPane(jta);

jf.add(BorderLayout.CENTER, jsp);

//下半部文本框使用一个Panel来装载

JPanel jp=new JPanel();

jp.setLayout(new BorderLayout());

jta.setLineWrap(true);

JScrollPane jsp2=new JScrollPane(jta2);

JPanel jp2=new JPanel();

jp2.setLayout(new GridLayout(1, 2, 10, 10));

JButton button=new JButton("发送");

JButton button2=new JButton("取消");

jp2.add(button);jp2.add(button2);

jp.add(BorderLayout.CENTER,jta2);

jp.add(BorderLayout.SOUTH,jp2);

jf.add(BorderLayout.SOUTH,jp);

try {

final Socket socket=new Socket("localhost", 8888);

GetMessage gm=new GetMessage(socket);

gm.start();

button.addActionListener(new ActionListener() {

@Override

public void actionPerformed(ActionEvent e) {

try {

DataOutputStream dos=new DataOutputStream(socket.getOutputStream());

dos.writeUTF(jta2.getText());

dos.flush();

jta2.setText("");

} catch (IOException e1) {

e1.printStackTrace();

}

}

});

} catch (IOException e) {

e.printStackTrace();

}

}

}