1.服务端----Server.java
import javax.swing.*; import java.io.*; import java.net.*; import java.awt.*; import java.awt.event.*; /** * Created by JXJ on 2017/6/26. */ public class Server extends JFrame{ private JTextField userText; private JTextArea chatWindow; private ObjectOutputStream output; private ObjectInputStream input; private ServerSocket server; private Socket connection; //构造方法 public Server(){ super("即时聊天小程序"); userText=new JTextField(); userText.setEditable(false); userText.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { sendMessage(e.getActionCommand()); userText.setText(""); } }); add(userText,BorderLayout.NORTH); chatWindow=new JTextArea(); add(new JScrollPane(chatWindow)); setSize(300,150); setVisible(true); } //建立并启动服务 public void startRununing(){ try{ server=new ServerSocket(6789,100); while(true){ try{ //等待连接 waitForConnect(); //获取输入输出数据流 setupStreams(); //聊天 whileChatting(); }catch (EOFException eofException){ showMessage(" 连接已经结束!"); }finally { closeCrap(); } } }catch (IOException ioException){ ioException.printStackTrace(); } } //等待连接,然后显示连接信息 private void waitForConnect() throws IOException{ showMessage(" 等待客户端连接... "); connection=server.accept(); showMessage("客户端"+connection.getInetAddress().getHostName()+"已连接! "); } //获取输入输出流 private void setupStreams() throws IOException{ output=new ObjectOutputStream(connection.getOutputStream()); //这个重点关注一下 output.flush(); input=new ObjectInputStream(connection.getInputStream()); showMessage(" 数据流已建立! "); } //聊天信息处理 private void whileChatting() throws IOException { String message="现在你已经连接上了!"; sendMessage(message); ableToType(true); do{ try{ message=(String)input.readObject(); showMessage(message+" "); }catch (ClassNotFoundException classNotFoundException){ showMessage("用户发送信息转换异常! "); } }while(!message.equals("client-end")); } //聊天结束后关闭输入输出流和socket private void closeCrap() { showMessage("正在关闭连接... "); ableToType(false); try{ //注意关闭先后顺序 输出流 输入流 socket output.close(); input.close(); connection.close(); }catch (IOException ioException){ } } //给客户端发送信息 private void sendMessage(String message) { try{ output.writeObject("Server"+message); output.flush(); showMessage("Server"+message+" "); }catch (IOException ioException){ chatWindow.append("[错误] 我没有成功发送信息!"); } } //在窗口上实时显示聊天信息 private void showMessage(final String text) { //注意窗口更新信息的方式 SwingUtilities.invokeLater(new Runnable() { @Override public void run() { chatWindow.append(text); } }); } //让用户输入信息 private void ableToType(final boolean tof) { //注意按钮的禁用与启用的方式 SwingUtilities.invokeLater(new Runnable() { @Override public void run() { userText.setEditable(tof); } }); } }
2.服务端测试----ServerTest.java
/** * Created by JXJ on 2017/6/26. */ import javax.swing.JFrame; public class ServerTest { public static void main(String[] args){ Server server=new Server(); server.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); server.startRununing(); } }
3.客户端----Client.java
/** * Created by JXJ on 2017/6/26. */ import java.io.*; import java.net.*; import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Client extends JFrame { private JTextField userText; private JTextArea chatwindow; private ObjectInputStream input; private ObjectOutputStream output; private String message=""; private String serverIP; private Socket connection; //构造方法 public Client(String host){ super("客户端"); serverIP=host; userText=new JTextField(); userText.setEditable(false); userText.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { sendMessage(e.getActionCommand()); userText.setText(""); } }); add(userText,BorderLayout.NORTH); chatwindow=new JTextArea(); add(new JScrollPane(chatwindow),BorderLayout.CENTER); setSize(300,150); setVisible(true); } //建立连接 public void startRununing(){ try{ connectToServer(); setupStreams(); whileChatting(); }catch (EOFException eofException){ showMessage("客户端断开连接! "); }catch (IOException ioExceptiopn){ ioExceptiopn.printStackTrace(); } finally { closeCrap(); } } //连接到服务端 private void connectToServer() throws IOException { showMessage("正在尝试连接服务端... "); connection=new Socket(InetAddress.getByName(serverIP),6789); showMessage("已连接至"+connection.getInetAddress().getHostName()); } //建立输入输出流 private void setupStreams() throws IOException { output=new ObjectOutputStream(connection.getOutputStream()); output.flush(); input=new ObjectInputStream(connection.getInputStream()); showMessage("已创建输入输出流... "); } //聊天信息处理 private void whileChatting() throws IOException { ableToType(true); do{ try{ message=(String)input.readObject(); showMessage(message+" "); }catch (ClassNotFoundException classNotFoundException){ showMessage(" 未知的输入对象类型 "); } }while(!message.equals("server-end")); } //关闭输入输出流和socket private void closeCrap() { showMessage("关闭客户端连接资源 "); ableToType(false); try{ output.close(); input.close(); connection.close(); }catch (IOException ioException){ ioException.printStackTrace(); } } //给服务端发送信息 private void sendMessage(String message) { try{ output.writeObject("client-"+message); output.flush(); showMessage("client-"+message+" "); }catch (IOException ioException){ showMessage("客户端发送数据失败 "); } } //在窗口上实时显示聊天信息 private void showMessage(final String text) { //注意窗口更新信息的方式 SwingUtilities.invokeLater(new Runnable() { @Override public void run() { chatwindow.append(text); } }); } //让用户输入信息 private void ableToType(final boolean tof) { //注意按钮的禁用与启用的方式 SwingUtilities.invokeLater(new Runnable() { @Override public void run() { userText.setEditable(tof); } }); } }
4.客户端测试----ClientTest.java
import javax.swing.*; /** * Created by JXJ on 2017/6/26. */ public class ClientTest { public static void main(String[] args){ Client client=new Client("127.0.0.1"); client.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); client.startRununing(); } }