服务端
package 夏日聊天室;import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.IOException;import java.net.ServerSocket;import java.net.Socket;public class chatServer {PRivate ServerSocket server;private Socket clientSocket;private DataInputStream serverin;private DataOutputStream serverout;private Waiter[] waiters;public static final int max = 50;public static final int noroom = -1;public chatServer(){waiters=new Waiter[max];int i;for(i=0;i<max;i++){waiters[i]=null;}try {System.out.println("建立服务器中...");server=new ServerSocket(54188);} catch (IOException e) {e.printStackTrace();}}public int getFreeWaiter(){int index;for(index=0;index<waiters.length&&waiters[index]!=null;index++);if(index>=max)index=noroom;return index;}public void listenning(){boolean ok=true;String mess;while (ok){try {System.out.println("倾听中...");clientSocket=server.accept();System.out.println(clientSocket.getInetAddress()+"接入");int i;i=getFreeWaiter();if(i!=noroom){waiters[i]=new Waiter(clientSocket,i);waiters[i].start();}else{serverin=new DataInputStream(clientSocket.getInputStream());serverout=new DataOutputStream(clientSocket.getOutputStream());serverout.writeUTF("O/n");mess = serverin.readUTF();serverin.close();serverout.close();clientSocket.close();}} catch (IOException e) {e.printStackTrace();ok=false;}}}class Waiter extends Thread{private Socket socket;private DataInputStream in;private DataOutputStream out;private int index;private String nickName;boolean goon=true;public Waiter(){}public Waiter (Socket socket,int index){this.socket=socket;this.index=index;try {in=new DataInputStream(socket.getInputStream());out=new DataOutputStream(socket.getOutputStream());} catch (IOException e) {e.printStackTrace();}}private void dealMessage(String mess){String[] detailMess;String command;detailMess=mess.split("/n");command=detailMess[0];if(command.equals("hello")){nickName=detailMess[1];try {out.writeUTF("youare/n"+(index+100+"").substring(1));int i;for(i=0;i<waiters.length;i++){if(waiters[i]!=null&&i!=index){out.writeUTF("Friend/n"+(waiters[i].index+101+"").substring(1)+waiters[i].nickName);}}String newFriend=((index+101+"").substring(1)+""+nickName);for(i=0;i<waiters.length;i++){if(waiters[i]!=null&&i!=index){waiters[i].out.writeUTF("New/n"+newFriend);}}} catch (IOException e) {// TODO 异常关闭goon=false;e.printStackTrace();}}else if(command.equals("bye")){try {out.writeUTF("bye/n");int i;String offFriend=((index+101+"").substring(1)+""+nickName);for(i=0;i<waiters.length;i++){if(waiters[i]!=null&&i!=index){waiters[i].out.writeUTF("off/n"+offFriend);}}} catch (IOException e) {// TODO 自动生成的 catch 块e.printStackTrace();}goon=false;}else if(command.equals("all")){int i;for(i=0;i<waiters.length;i++){if(waiters[i]!=null&&i!=index){try {waiters[i].out.writeUTF(mess);} catch (IOException e) {// TODO 自动生成的 catch 块e.printStackTrace();}}}goon=false;}else if(command.equals("sigle")){try {int targetIndex=Integer.parseInt(detailMess[3]);String Message=detailMess[0]+"/n"+detailMess[2]+"/n"+detailMess[5];waiters[targetIndex].out.writeUTF(Message);} catch (IOException e) {// TODO 自动生成的 catch 块e.printStackTrace();}goon=false;}}public void run(){String mess;while (goon){try {mess=in.readUTF();dealMessage(mess);} catch (IOException e) {e.printStackTrace();goon=false;}}try {System.out.println(socket.getInetAddress()+"下线了");in.close();out.close();socket.close();waiters[index]=null;} catch (IOException e) {e.printStackTrace();}}}public static void main(String[] args){chatServer cs=new chatServer();cs.listenning();}}
客户端
import java.awt.Color;import java.awt.Container;import java.awt.Dimension;import java.awt.Font;import java.awt.Toolkit;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.WindowEvent;import java.awt.event.WindowFocusListener;import java.awt.event.WindowListener;import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.IOException;import java.net.Socket;import javax.swing.BorderFactory;import javax.swing.DefaultListModel;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JList;import javax.swing.JOptionPane;import javax.swing.JPassWordField;import javax.swing.JScrollPane;import javax.swing.JTextArea;import javax.swing.JTextField;import javax.swing.border.BevelBorder;import javax.swing.event.CaretEvent;import javax.swing.event.CaretListener;import javax.swing.event.ListSelectionEvent;import javax.swing.event.ListSelectionListener;public class chatClient {private JFrame jfrmMain;private Container container;private JLabel jlblTopic;private JTextArea jtxaChatContent;private JScrollPane jscpChatContent;private JLabel jlblFriendList;private DefaultListModel dimFriendList;private JList jlstFriendList;private JScrollPane jscpFriendList;private JLabel jlblSystemInformation;private DefaultListModel dimSystemInformation;private JList jlstSystemInformation;private JScrollPane jscpSystemInformation;private JLabel jlblCurrentFriendTopic;private JLabel jlblCurrentFriend;private JLabel jlblNickName;private JTextField jtxtMessage;private JPasswordField jPSD;private JButton jbtnExit;private JButton jbtnSend;private String nickName;private Socket socket;private DataInputStream in;private DataOutputStream out;private int index;public chatClient(String nickName){this.nickName=nickName;initFrame();reinitFrame();try {linkServer();new Listenner();Thread.sleep(500);out.writeUTF("hello/n"+nickName);} catch (Exception e) {showMessage(jfrmMain,e.getMessage()+"/n连接服务器失败");jfrmMain.dispose();}dealAction();}private void showMessage(JFrame jfrm,String mess){JOptionPane.showMessageDialog(jfrm, mess,"系统提示",JOptionPane.DEFAULT_OPTION);}private void linkServer() throws Exception{try{socket=new Socket("localhost",54188);}catch(IOException e){throw new Exception("Class:chatClient:/nlinkServer/nError:连接服务器失败");}try {in=new DataInputStream(socket.getInputStream());} catch (IOException e) {throw new Exception("输入通信信道失败");}try {out=new DataOutputStream(socket.getOutputStream());} catch (IOException e) {throw new Exception("输出通信信道失败");}}public void initFrame(){Dimension dim;Font normalFont=new Font("宋体",Font.PLAIN,16);//窗口实现jfrmMain=new JFrame("聊天室");container=jfrmMain.getContentPane();container.setLayout(null);jfrmMain.setFont(normalFont);jfrmMain.setSize(11200/15,9045/15); //居中工作dim=Toolkit.getDefaultToolkit().getScreenSize();jfrmMain.setLocation((dim.width-jfrmMain.getWidth())/2,(dim.height-jfrmMain.getHeight())/2);jfrmMain.setIconImage(Toolkit.getDefaultToolkit().getImage("C://Users//zhao//Desktop//java//夏日聊天室//图片//图标.jpg"));jfrmMain.setVisible(true);jfrmMain.setDefaultCloSEOperation(JFrame.EXIT_ON_CLOSE);//标题jlblTopic=new JLabel("嘻嘻哈哈聊天室");jlblTopic.setFont(new Font("宋体",Font.PLAIN,36));jlblTopic.setForeground(Color.gray);jlblTopic.setBounds(3592/15,0,3780/15,525/15);container.add(jlblTopic);//带滚动条的文本框,聊天框jtxaChatContent=new JTextArea();jscpChatContent=new JScrollPane(jtxaChatContent);jtxaChatContent.setFont(normalFont);jscpChatContent.setBounds(1575/15,670/15,7815/15,6690/15);container.add(jscpChatContent);//在线好友jlblFriendList=new JLabel("好友列表");jlblFriendList.setFont(normalFont);jlblFriendList.setBounds(315/15,525/15,960/15,240/15);container.add(jlblFriendList);dimFriendList=new DefaultListModel();jlstFriendList=new JList(dimFriendList);jscpFriendList=new JScrollPane(jlstFriendList);jlstFriendList.setFont(normalFont);jscpFriendList.setBounds(75/15,825/15,1440/15,5820/15);container.add(jscpFriendList);//系统消息jlblSystemInformation=new JLabel("系统消息");jlblSystemInformation.setFont(normalFont);jlblSystemInformation.setBounds(9690/15,525/15,960/15,240/15);container.add(jlblSystemInformation);dimSystemInformation=new DefaultListModel();jlstSystemInformation=new JList(dimSystemInformation);jscpSystemInformation=new JScrollPane(jlstSystemInformation);jlstSystemInformation.setFont(normalFont);jscpSystemInformation.setBounds(9450/15,825/15,1440/15,5820/15);container.add(jscpSystemInformation);jlblCurrentFriendTopic=new JLabel("当前好友");jlblCurrentFriendTopic.setFont(normalFont);jlblCurrentFriendTopic.setBounds(315/15,6750/15,960/15,240/15);container.add(jlblCurrentFriendTopic);jlblCurrentFriend=new JLabel("00所有人");jlblCurrentFriend.setFont(normalFont);jlblCurrentFriend.setBounds(60/15,7050/15,1470/15,240/15+8);container. add(jlblCurrentFriend);jlblNickName=new JLabel("用户昵称");jlblNickName.setFont(normalFont);jlblNickName.setBounds(90/15,7575/15,1470/15,245/15+8);container. add(jlblNickName);//输入框jtxtMessage=new JTextField();jtxtMessage.setFont(normalFont);jtxtMessage.setBounds(1575/15, 7600/15, 9240/15, 390/15);container. add(jtxtMessage);//退出jbtnExit=new JButton("退出");jbtnExit.setBounds(150/15,7950/15,990/15,465/15);jbtnExit.setFont(normalFont);container.add(jbtnExit);//发送jbtnSend=new JButton("发送");jbtnSend.setBounds(9830/15,7950/15,990/15,465/15);jbtnSend.setFont(normalFont);container.add(jbtnSend);}public void reinitFrame(){jscpChatContent.setBorder(BorderFactory.createTitledBorder("聊天记录"));jlblCurrentFriend.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));jlblNickName.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));jlblCurrentFriend.setHorizontalAlignment(JLabel.CENTER);jlblNickName.setHorizontalAlignment(JLabel.CENTER);dimFriendList.addElement("00所有人");jlblNickName.setText(nickName);dimSystemInformation.addElement("您已进入聊天室,请文明聊天");dimSystemInformation.addElement("祝你聊天愉快");}public void saygoodbye(){try {out.writeUTF("bye/n");showMessage(jfrmMain, "您已退出聊天室");jfrmMain.dispose();} catch (IOException e1) {// TODO 自动生成的 catch 块e1.printStackTrace();}}public void dealAction(){jbtnSend.addActionListener(new ActionListener(){@Overridepublic void actionPerformed(ActionEvent e) {String currentFriend=jlblCurrentFriend.getText();String commandServer;String speaker;String speakerIndex;String receiver;String receiverIndex;String messageToServer;speakerIndex=index+"/n";speaker=(index+101+"").substring(1)+" "+nickName+"/n";if(currentFriend.equals("00所有人")){commandServer="all/n";messageToServer=commandServer+speaker+jtxtMessage.getText();jtxaChatContent.append("你向所有人喊道:"+jtxtMessage.getText()+"/n");}else{commandServer="sigle/n";receiver=jlblCurrentFriend.getText()+"/n";receiverIndex=receiver.substring(0, 2);receiverIndex=(Integer.parseInt(receiverIndex)-1)+"/n";messageToServer=commandServer+speakerIndex+speaker+receiverIndex+receiver+jtxtMessage.getText();jtxaChatContent.append("你对"+currentFriend+"说:"+jtxtMessage.getText()+"/n");}try {out.writeUTF(messageToServer);jtxtMessage.setText("");} catch (IOException e1) {// TODO 自动生成的 catch 块e1.printStackTrace();}}});jtxtMessage.addCaretListener(new CaretListener(){@Overridepublic void caretUpdate(CaretEvent e){if(jtxtMessage.getText().trim().length()<=0)jbtnSend.setEnabled(false);else jbtnSend.setEnabled(true);}});jlstFriendList.addListSelectionListener(new ListSelectionListener(){@Overridepublic void valueChanged(ListSelectionEvent e) {String selectedFriend;selectedFriend=jlstFriendList.getSelectedValue().toString();jlblCurrentFriend.setText(selectedFriend);}});jfrmMain.addWindowListener(new WindowListener(){public void windowClosing(WindowEvent e) {saygoodbye();}@Overridepublic void windowClosed(WindowEvent e){}public void windowIconified(WindowEvent e) {}public void windowDeiconified(WindowEvent e) {}public void windowActivated(WindowEvent e) {}public void windowOpened(WindowEvent e){}public void windowDeactivated(WindowEvent e){}});//退出jbtnExit.addActionListener(new ActionListener(){@Overridepublic void actionPerformed(ActionEvent e) {//进行下线操作saygoodbye();}});}class Listenner extends Thread{private boolean goon=true;public Listenner(){goon=true;this.start();}private void dealMessageFromServer(String mess) {String[] splitMess;String command;splitMess=mess.split("/n");command=splitMess[0];System.out.print(command);if(command.equals("youare")){index = Integer.parseInt(splitMess[1]);}else if(command.equals("Friend")){String friendInformation=splitMess[1];dimFriendList.addElement(friendInformation);}else if(command.equals("New")){String newFriend=splitMess[1];dimFriendList.addElement(newFriend);dimSystemInformation.addElement(newFriend+"上线了");} else if(command.equals("off")){String offFriend=splitMess[1];dimFriendList.removeElement(offFriend);dimSystemInformation.addElement(offFriend+"下线了");} else if(command.equals("all")){jtxaChatContent.append(splitMess[1]+"对所有人说:"+splitMess[2]+"/n");}else if(command.equals("sigle")){jtxaChatContent.append(splitMess[1]+"对你说:"+splitMess[2]+"/n");}else if(command.equals("bye")){goon=false;try {in.close();out.close();socket.close();//这里是否还需要处理jfrmMain.dispose();} catch (IOException e) {e.printStackTrace();}}}public void run(){String mess=null;while(goon){try {mess=in.readUTF();dealMessageFromServer(mess);} catch (IOException e) {// 服务端异常关闭goon=false;}}}}public static void main(String[] args){chatClient chat;chat=new chatClient("22");}}
新闻热点
疑难解答