⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 client.java

📁 基于socket的聊天室程序java源码
💻 JAVA
字号:
package homework.h20090412.IM03;

//客户端:

import javax.swing.JFrame;
import java.awt.Dimension;
import javax.swing.JButton;
import javax.swing.JPanel;
import java.awt.Rectangle;
import java.awt.event.KeyEvent;

import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
import javax.swing.JTextArea;
import javax.swing.JScrollPane;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket; 
import java.util.Date;
import java.text.DateFormat;
import java.text.SimpleDateFormat;

public class Client extends JFrame implements Runnable{
	private JPanel jPanel = null;
	private JLabel jSetServerLabel = null;
	private JTextField jServerAddressTextField = null;
	private JLabel jSetPortLabel = null;
	private JTextField jServerPortTextField = null;
	private JButton jConnectButton = null;
	private JButton jDisConnectButton = null;
	private JLabel jSendLabel = null;
	private JTextArea jSendTextArea = null;
	private JScrollPane jSendScrollPane = null;
	private JTextArea jReceivedTextArea=null;
	private JLabel jReceiveLabel = null;
	private JScrollPane jReceiveScrollPane = null;
	private JButton jSendButton = null;
	private JButton jClearButton = null;
	private JLabel jStateLabel = null;
	private JTextField jStateTextField = null;
	private Socket clientSock;
	private boolean conState=false;
	private PrintWriter out;
	private BufferedReader in=null;
	private Thread readThread;
	private boolean runState;
	/**
	 * @param args
	 */
	
	public Client(){
		super("通信系统客户端");
		initialize();
		//Container con=getContentPane();   
	}

	/**
	 * This method initializes this
	 * 
	 */
	private void initialize() {
		this.setSize(new Dimension(451, 409));
        this.setContentPane(getJPanel());
        this.setTitle("通信系统客户端");  
        this.setLocation(200, 100);
        this.setVisible(true); 
	}

	/**
	 * This method initializes jPanel 
	 *  
	 * @return javax.swing.JPanel 
	 */
	private JPanel getJPanel() {
		if (jPanel == null) {
			jStateLabel = new JLabel();
			jStateLabel.setBounds(new Rectangle(25, 106, 78, 32));
			jStateLabel.setText("系统状态:");
			jReceiveLabel = new JLabel();
			jReceiveLabel.setBounds(new Rectangle(25, 236, 78, 24));
			jReceiveLabel.setText("信息记录:");
			jSendLabel = new JLabel();
			jSendLabel.setBounds(new Rectangle(24, 146, 77, 23));
			jSendLabel.setText("发送信息:");
			jSetPortLabel = new JLabel();
			jSetPortLabel.setBounds(new Rectangle(22, 57, 126, 34));
			jSetPortLabel.setText("服务器端口号:");
			jSetServerLabel = new JLabel();
			jSetServerLabel.setBounds(new Rectangle(22, 14, 126, 34));
			jSetServerLabel.setText("服务器端IP地址:");
			jPanel = new JPanel();
			jPanel.setLayout(null);
			jPanel.add(jSetServerLabel, null);
			jPanel.add(getJServerAddressTextField(), null);
			jPanel.add(jSetPortLabel, null);
			jPanel.add(getJServerPortTextField(), null);
			jPanel.add(getJConnectButton(), null);
			jPanel.add(getJDisConnectButton(), null);
			jPanel.add(jSendLabel, null);
			jPanel.add(getJSendTextArea(), null);
			jPanel.add(getJSendScrollPane(), null);
			jPanel.add(jReceiveLabel, null);
			jPanel.add(getJReceivedTextArea(), null);
			jPanel.add(getJReceiveScrollPane(), null);
			jPanel.add(getJSendButton(), null);
			jPanel.add(getJClearButton(), null);
			jPanel.add(jStateLabel, null);
			jPanel.add(getJStateTextField(), null);
		}
		return jPanel;
	}


	/**
	 * This method initializes jServerAddressTextField 
	 *  
	 * @return javax.swing.JTextField 
	 */
	private JTextField getJServerAddressTextField() {
		if (jServerAddressTextField == null) {
			jServerAddressTextField = new JTextField();
			jServerAddressTextField.setBounds(new Rectangle(148, 14, 137, 37));
			jServerAddressTextField.setText("127.0.0.1");
		}
		return jServerAddressTextField;
	}

 

	/**
	 * This method initializes jServerPortTextField 
	 *  
	 * @return javax.swing.JTextField 
	 */
	private JTextField getJServerPortTextField() {
		if (jServerPortTextField == null) {
			jServerPortTextField = new JTextField();
			jServerPortTextField.setBounds(new Rectangle(148, 56, 137, 37));
			jServerPortTextField.setText("30000");
		}
		return jServerPortTextField;
	}

 

	/**
	 * This method initializes jConnectButton 
	 *  
	 * @return javax.swing.JButton 
	 */
	private JButton getJConnectButton() {
		if (jConnectButton == null) {
			jConnectButton = new JButton();
			jConnectButton.setBounds(new Rectangle(315, 14, 100, 33));
			jConnectButton.setText("连接服务器");
			jConnectButton.addActionListener(new java.awt.event.ActionListener() {
				public void actionPerformed(java.awt.event.ActionEvent e) {
					if(conState==true){ 
						JOptionPane.showMessageDialog(jPanel,"清先断开连接",
								"清先断开连接",JOptionPane.ERROR_MESSAGE); 
					}
					else{
     
						startConnect();
					}
				}
			});
		}
		return jConnectButton;
	}

 

	/**
	 * This method initializes jDisConnectButton 
	 *  
	 * @return javax.swing.JButton 
	 */
	private JButton getJDisConnectButton() {
		if (jDisConnectButton == null) {
			jDisConnectButton = new JButton();
			jDisConnectButton.setBounds(new Rectangle(315, 56, 100, 33));
			jDisConnectButton.setText("断开连接");
			jDisConnectButton.addActionListener(new java.awt.event.ActionListener() {
				public void actionPerformed(java.awt.event.ActionEvent e) {
					if(conState==false){ 
						JOptionPane.showMessageDialog(jPanel,"还没有建立连接",
								"还没有建立连接",JOptionPane.ERROR_MESSAGE); 
					}
					else{
						try{
							out.println("Client exit!");
							out.flush();
							jReceivedTextArea.insert("\n", 0);
							jReceivedTextArea.insert("Client exit!", 0);
							//Thread.sleep(1000);   
							//disConnect();
							stopRun();
      
						}catch (Exception exception){
							jStateTextField.setText("无法断开连接");
						}
     
					}
				}
			});
		}
		return jDisConnectButton;
	}

 

	/**
	 * This method initializes jSendTextArea 
	 *  
	 * @return javax.swing.JTextArea 
	 */
	private JTextArea getJSendTextArea() {
		if (jSendTextArea == null) {
			jSendTextArea = new JTextArea();
			//jSendTextArea.setBounds(new Rectangle(222, 208, 73, 43));
			/*
   				jSendTextArea.addKeyListener(
        		new java.awt.event.KeyListener(){
         		public void keyPressed(KeyEvent e){
          		if(e.getKeyCode()==e.VK_ENTER){
           		if(jSendTextArea.getText().equals("")){
        	   	JOptionPane.showMessageDialog(jPanel,"输入内容为空",
              	"输入内容为空",JOptionPane.ERROR_MESSAGE);
           		}
           		else if(conState==true){
            	sendInformation();
            	jSendTextArea.setText("");
        		}
        		else{
            	JOptionPane.showMessageDialog(jPanel,"还没有连接客户端",
                "还没有连接客户端",JOptionPane.ERROR_MESSAGE);
        		}
          		}
           
         		}
         		public void keyReleased(KeyEvent e){         
         		}
         		public void keyTyped(KeyEvent e){         
         		}
         
        		}   
    			);
			 	*/
		}
		return jSendTextArea;
	}


    private JTextArea getJReceivedTextArea(){
    	if (jReceivedTextArea == null) {
    		jReceivedTextArea = new JTextArea();
    		//jSendTextArea.setBounds(new Rectangle(222, 208, 73, 43));
    	}
    	return jReceivedTextArea;
    }
 
    /**
     * This method initializes jSendScrollPane 
     *  
     * @return javax.swing.JScrollPane 
     */
    private JScrollPane getJSendScrollPane() {
    	if (jSendScrollPane == null) {
    		jSendScrollPane = new JScrollPane(jSendTextArea);
    		jSendScrollPane.setBounds(new Rectangle(23, 169, 279, 56));
    	}
    	return jSendScrollPane;
    }

 

    /**
     * This method initializes jReceiveScrollPane 
     *  
     * @return javax.swing.JScrollPane 
     */
    private JScrollPane getJReceiveScrollPane() {
    	if (jReceiveScrollPane == null) {
    		jReceiveScrollPane = new JScrollPane(jReceivedTextArea);
    		jReceiveScrollPane.setBounds(new Rectangle(24, 260, 397, 102));
    	}
    	return jReceiveScrollPane;
    }

 

    /**
     * This method initializes jSendButton 
     *  
     * @return javax.swing.JButton 
     */
    private JButton getJSendButton() {
    	if (jSendButton == null) {
    		jSendButton = new JButton();
    		jSendButton.setBounds(new Rectangle(318, 171, 75, 24));
    		jSendButton.setText("发送");
    		jSendButton.addActionListener(new java.awt.event.ActionListener() {
    			public void actionPerformed(java.awt.event.ActionEvent e) {
    				if(jSendTextArea.getText().equals("")){
    					JOptionPane.showMessageDialog(jPanel,"输入内容为空",
    							"输入内容为空",JOptionPane.ERROR_MESSAGE);
    				}
    				else if(conState==true){
    					sendInformation();
    					jSendTextArea.setText("");
    				}
    				else{
    					JOptionPane.showMessageDialog(jPanel,"还没有连接服务器端",
    							"还没有连接服务器端",JOptionPane.ERROR_MESSAGE);
    				}
      
    			}
    		});
    	}
    	return jSendButton;
    }

 

    /**
     * This method initializes jClearButton 
     *  
     * @return javax.swing.JButton 
     */
    private JButton getJClearButton() {
    	if (jClearButton == null) {
    		jClearButton = new JButton();
    		jClearButton.setBounds(new Rectangle(318, 200, 75, 24));
    		jClearButton.setText("清空");
    		jClearButton.addActionListener(new java.awt.event.ActionListener(){
    			public void actionPerformed(java.awt.event.ActionEvent e){
    				jReceivedTextArea.setText("");
    			}
    		}
    		);
    	}
    	return jClearButton;
    }

 

    /**
     * This method initializes jStateTextField 
     *  
     * @return javax.swing.JTextField 
     */
    private JTextField getJStateTextField() {
    	if (jStateTextField == null) {
    		jStateTextField = new JTextField();
    		jStateTextField.setBounds(new Rectangle(102, 107, 315, 31));
    		jStateTextField.setText("准备就绪,等待连接");
    		jStateTextField.setEditable(false);
    	}
    	return jStateTextField;
    }


    public void startConnect(){
    	try{
    		clientSock=new Socket(jServerAddressTextField.getText(),
    		Integer.parseInt(jServerPortTextField.getText()) );
    		jStateTextField.setText("连接服务器成功,服务器:"+jServerAddressTextField.getText());
    		conState=true;
    		in=new BufferedReader(new InputStreamReader(clientSock.getInputStream()));
    		out=new PrintWriter(clientSock.getOutputStream());
   
    	}catch (Exception exception){
    		// exception.printStackTrace();
    		jStateTextField.setText("连接未成功建立,请重新尝试");
    		conState=false;
    		repaint();
    	}
    	//run();
     
    	readThread=new Thread(this);
    	readThread.start(); 
    }

    public void run(){
  
    	String msg;
    	runState=true;
    
    	while(runState){
    		try{
    			msg=in.readLine();
    			// System.out.println(msg);
    			if(msg.equals("Server exit!")){//server exit
    				processMsg(msg);
    				stopRun();//终止线程
    			}else if(msg!=null ){
    				DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    				String str =(df.format(new Date()));
    				processMsg("Server:   "+str+"\n"+msg);
    			}
    			Thread.sleep(500);    
    		}
    		catch(Exception e){
    		}
    
    	}
    
    	//System.out.println("11111111111");
    	//endConnect();
    	try{//服务器退出关闭连接和相关的"流"
    		// System.out.println("11111111111");
    		jStateTextField.setText("断开连接");
    		clientSock.close();
    		clientSock=null;
    		conState=false;
    		in.close();
    		out.close();    
   
    	}
    	catch(IOException ioe){} 
    }
 
    public void processMsg(String msg){//客户端处理消息
    	//jReceivedTextArea.append(msg);
    	//jReceivedTextArea.append("\n");
    	jReceivedTextArea.insert("\n", 0);
    	jReceivedTextArea.insert(msg, 0);
    }
 
    public void sendInformation(){
    	DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    	String str =(df.format(new Date()));
    	out.println(jSendTextArea.getText());
    	processMsg("clent:    "+str+"\n"+jSendTextArea.getText());
    	out.flush();
    
    }
 
    public void stopRun(){//to stop the running thread
    	runState=false;
    	conState=false;
    	//  disConnect();
    } 

    /*
 	public void disConnect(){
  		try{
   			jStateTextField.setText("断开连接");
   			clientSock.close();
   			clientSock=null;
   			conState=false;
   
  			}catch (Exception exception){
   				jStateTextField.setText("无法断开连接");
  			}
  
 		}
     */
 
    public static void main(String[] args) {
    	// TODO 自动生成方法存根
    	Client client=new Client();
    	client.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

}  //  @jve:decl-index=0:visual-constraint="10,10"

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -