import java.io.IOException;import java.net.ServerSocket;import java.net.Socket;import com.jero.jframe.ChatSocketJFrame;//创建服务端public class ChatServerSocket{ //构造初始化方法 public ChatServerSocket(String name,int port) throws IOException{ //创建Socket服务连接对象 ServerSocket serverSocket = new ServerSocket(port); //等待客户端连接 Socket client = serverSocket.accept(); //初始化聊天界面 try { new ChatSocketJFrame(name,client); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } //关闭流 serverSocket.close(); } public static void main(String[] args) throws Exception{ new ChatServerSocket("服务端",8001);//启动服务端,指定网名和端口 }}
package com.jero.jframe;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintWriter;import java.net.InetAddress;import java.net.Socket;import java.net.UnknownHostException;import javax.swing.JFrame;import javax.swing.JPanel;import javax.swing.JScrollPane;import javax.swing.border.EmptyBorder;import com.jero.socket.ChatServerSocket;import javax.swing.JTextPane;import javax.swing.JTextField;import javax.swing.JButton;import javax.swing.JTextArea;public class ChatSocketJFrame extends JFrame implements ActionListener { private Socket socket; private String name; private JButton BT_SEND,BT_LEAVE,BT_LOGIN; private JTextArea textArea; private JPanel contentPane; private JTextField textField; private PrintWriter cout; /** * Launch the application. * @throws Exception * @throws IOException * @throws UnknownHostException */ public static void main(String[] args) throws UnknownHostException, IOException, Exception { //实例化界面以及客户端 new ChatSocketJFrame("客户端","127.0.0.1",8001); } /** * Create the frame. */ public ChatSocketJFrame(String name, Socket socket)throws Exception, IOException { //聊天室界面 super("聊天室"+name+" "+InetAddress.getLocalHost()+" "+socket.getPort()); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(100, 100, 733, 519); this.textArea = new JTextArea(); this.textArea.setEditable(false); this.getContentPane().add(new JScrollPane(this.textArea)); JPanel panel = new JPanel(); this.getContentPane().add(panel, "South"); this.textField = new JTextField(16); panel.add(this.textField); BT_SEND = new JButton("发送"); panel.add(BT_SEND); BT_SEND.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub System.out.println("按钮已点击"); cout.println(name+"说: "+textField.getText()+"/n"); textArea.append("我说: "+textField.getText()+"/n"); textField.setText(""); } }); BT_LEAVE = new JButton("离线"); panel.add(BT_LEAVE); BT_LEAVE.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub textArea.append("我离线"); cout.println(name+"离线/n"+"bye"); BT_LEAVE.setEnabled(false); BT_SEND.setEnabled(false); } }); this.setVisible(true); //开始创建通信 this.socket = socket; this.name = name; //获得Socket的输出流并立即刷新 this.cout = new PrintWriter(socket.getOutputStream(),true); //把网名传给对方 this.cout.println(name); //获得Socket对象的输入流,创建字符输入流 BufferedReader buff = new BufferedReader(new InputStreamReader(socket.getInputStream())); //接受对方的网名 String aline = buff.readLine(); //显示对方发送的内容 textArea.append("连接"+aline+"成功!!/n"); aline = buff.readLine(); //如果内容不为空并且对方不离线,则相互传送消息 while(aline!=null&&!aline.equals("bye")){ textArea.append(aline+"/r/n"); aline = buff.readLine(); } //当对方离线时,关闭所有的流 buff.close(); cout.close(); socket.close(); //把按钮设置为不可操作 BT_SEND.setEnabled(false); BT_LEAVE.setEnabled(false); } /** * @wbp.parser.constructor */ public ChatSocketJFrame(String name,String host,int port) throws UnknownHostException, IOException, Exception{ //创建客户端 this(name,new Socket(host,port)); } @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub //可以把动作监听写进此函数,这个就不演示了 }}