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

📄 server.java

📁 java版本的聊天程序
💻 JAVA
字号:
package Chat;

import javax.swing.JFrame;
import java.awt.Dimension;
import javax.swing.JPanel;
import javax.swing.JLabel;
import java.awt.Rectangle;
import java.awt.event.KeyEvent;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
//import java.net.ServerSocket; 
//import java.net.Socket; 
import javax.swing.JOptionPane;
import javax.swing.JTextField;
import javax.swing.JButton;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

public class Server extends JFrame implements Runnable{

	private JPanel jServerPanel = null;
	private JLabel jPortLabel = null;
	private JTextField jPortTextField = null;
	private JButton jConnButton = null;
	private JButton jDisConnButton = null;
	private JLabel jSendLabel = null;
	private JScrollPane jSendScrollPane = null;
	private JLabel jReceivedLabel = null;
	private JScrollPane jReceivedScrollPane = null;
	private JTextArea jSendTextArea = null;
	private JTextArea jReceivedTextArea = null;
	private JButton jSendButton = null;
	private JButton jClearButton = null;
	private JLabel jStateLabel = null;
	private JTextField jStateTextField = null;
	private ServerSocket  server;
	private Socket socket = null; 
	private boolean conState=false;
	private Thread chatThread;
	private PrintWriter out;
	private BufferedReader in=null;
	private boolean runState;

	/**
	 * This method initializes 
	 * 
	 */
	public Server() {
		super();
		initialize();
		
		this.setLocation(200, 100);
		this.setVisible(true);
	}

	/**
	 * This method initializes this
	 * 
	 */
	private void initialize() {
        this.setSize(new Dimension(417, 375));
        this.setContentPane(getJServerPanel());
        this.setTitle("通信系统服务器端");
			
	}

	/**
	 * This method initializes jServerPanel	
	 * 	
	 * @return javax.swing.JPanel	
	 */
	private JPanel getJServerPanel() {
		if (jServerPanel == null) {
			jStateLabel = new JLabel();
			jStateLabel.setBounds(new Rectangle(8, 54, 65, 27));
			jStateLabel.setText("系统状态:");
			jReceivedLabel = new JLabel();
			jReceivedLabel.setBounds(new Rectangle(11, 191, 83, 25));
			jReceivedLabel.setText("信息记录:");
			jSendLabel = new JLabel();
			jSendLabel.setBounds(new Rectangle(9, 95, 78, 24));
			jSendLabel.setText("发送信息:");
			jPortLabel = new JLabel();
			jPortLabel.setBounds(new Rectangle(8, 21, 64, 27));
			jPortLabel.setText("端口号:");
			jServerPanel = new JPanel();
			jServerPanel.setLayout(null);
			jServerPanel.add(jPortLabel, null);
			jServerPanel.add(getJPortTextField(), null);
			jServerPanel.add(getJConnButton(), null);
			jServerPanel.add(getJDisConnButton(), null);
			jServerPanel.add(jSendLabel, null);
			jServerPanel.add(getJSendScrollPane(), null);
			jServerPanel.add(jReceivedLabel, null);
			jServerPanel.add(getJReceivedScrollPane(), null);
			jServerPanel.add(getJSendButton(), null);
			jServerPanel.add(getJClearButton(), null);
			jServerPanel.add(jStateLabel, null);
			jServerPanel.add(getJStateTextField(), null);
		}
		return jServerPanel;
	}

	/**
	 * This method initializes jPortTextField	
	 * 	
	 * @return javax.swing.JTextField	
	 */
	private JTextField getJPortTextField() {
		if (jPortTextField == null) {
			jPortTextField = new JTextField();
			jPortTextField.setBounds(new Rectangle(71, 19, 108, 30));
			jPortTextField.setText("30000");
		}
		return jPortTextField;
	}

	/**
	 * This method initializes jConnButton	
	 * 	
	 * @return javax.swing.JButton	
	 */
	private JButton getJConnButton() {
		if (jConnButton == null) {
			jConnButton = new JButton();
			jConnButton.setBounds(new Rectangle(195, 17, 90, 33));
			jConnButton.setText("准备连接");
			jConnButton.addActionListener(new java.awt.event.ActionListener() {
				public void actionPerformed(java.awt.event.ActionEvent e) {
					
				  if(conState==true){
					  JOptionPane.showMessageDialog(jServerPanel,"清先断开连接",
	    						"清先断开连接",JOptionPane.ERROR_MESSAGE); 
				  }
				  else{				   
				     serverListen();
				  }
				}	
			});
		}
		return jConnButton;
	}

	/**
	 * This method initializes jDisConnButton	
	 * 	
	 * @return javax.swing.JButton	
	 */
	private JButton getJDisConnButton() {
		if (jDisConnButton == null) {
			jDisConnButton = new JButton();
			jDisConnButton.setBounds(new Rectangle(295, 17, 90, 33));
			jDisConnButton.setText("断开连接");
			jDisConnButton.addActionListener(new java.awt.event.ActionListener() {
				public void actionPerformed(java.awt.event.ActionEvent e) {
					
					  if(conState==false){
						  JOptionPane.showMessageDialog(jServerPanel,"连接还没有建立",
		    						"连接还没有建立",JOptionPane.ERROR_MESSAGE); 
					  }
					  else{
					    try{
					    	//	jStateTextField.setText("等待接收客户端");
					    	//	repaint();
					    	out.println("Server exit!");
					    	out.flush();
					    	jReceivedTextArea.insert("\n", 0);
							jReceivedTextArea.insert("Server exit!", 0);
					    //	Thread.sleep(500); 
					   // 	disConnect();
					    	stopRun();
					  
					    }catch(Exception exception){
					    	jStateTextField.setText("无法断开连接");
					    }
					  }
					  
					}
					
				});
		}
		return jDisConnButton;
	}

	/**
	 * This method initializes jSendScrollPane	
	 * 	
	 * @return javax.swing.JScrollPane	
	 */
	private JScrollPane getJSendScrollPane() {
		if (jSendScrollPane == null) {
			jSendScrollPane = new JScrollPane();
			jSendScrollPane.setBounds(new Rectangle(9, 119, 271, 63));
			jSendScrollPane.setViewportView(getJSendTextArea());
		}
		return jSendScrollPane;
	}

	/**
	 * This method initializes jReceivedScrollPane	
	 * 	
	 * @return javax.swing.JScrollPane	
	 */
	private JScrollPane getJReceivedScrollPane() {
		if (jReceivedScrollPane == null) {
			jReceivedScrollPane = new JScrollPane();
			jReceivedScrollPane.setBounds(new Rectangle(10, 215, 381, 103));
			jReceivedScrollPane.setViewportView(getJReceivedTextArea());
		}
		return jReceivedScrollPane;
	}

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

	/**
	 * This method initializes jReceivedTextArea	
	 * 	
	 * @return javax.swing.JTextArea	
	 */
	private JTextArea getJReceivedTextArea() {
		if (jReceivedTextArea == null) {
			jReceivedTextArea = new JTextArea();
		}
		return jReceivedTextArea;
	}

	/**
	 * This method initializes jSendButton	
	 * 	
	 * @return javax.swing.JButton	
	 */
	private JButton getJSendButton() {
		if (jSendButton == null) {
			jSendButton = new JButton();
			jSendButton.setBounds(new Rectangle(299, 120, 70, 23));
			jSendButton.setText("发送");
			jSendButton.addActionListener(new java.awt.event.ActionListener() {
				public void actionPerformed(java.awt.event.ActionEvent e) {
					if(jSendTextArea.getText().equals("")){
	    				JOptionPane.showMessageDialog(jServerPanel,"输入内容为空",
	    						"输入内容为空",JOptionPane.ERROR_MESSAGE);
	    			}
	    			else if(conState==true){
					   sendInformation();
					   jSendTextArea.setText("");
					}
					else{
						 JOptionPane.showMessageDialog(jServerPanel,"还没有连接客户端",
		    						"还没有连接客户端",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(299, 155, 70, 23));
			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(73, 54, 312, 27));
			jStateTextField.setText("准备就绪,等待接收客户端");
			jStateTextField.setEditable(false);
		}
		return jStateTextField;
	}

	public void run(){
		
		 String msg;
		 runState=true;
		  
		 while(runState){
			   try{
				   msg=in.readLine();
				   if(msg.equals("Client 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("Client:   "+str+"\n"+msg);
				   }
				   Thread.sleep(500);    
			   }
			   catch(Exception e){
			   }
			 }
		 
		  //endConnect();
		 try{//服务器退出关闭连接和相关的"流"
			 jStateTextField.setText("断开连接");			 
			 socket.close();
			 server.close();
			 in.close();
			 out.close();
			 socket=null;
			 server=null;			
			 
		 }
		 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("Server:    "+str+"\n"+jSendTextArea.getText());
		  out.flush();
	}
	
	public void stopRun(){//to stop the running thread
		  runState=false;
		  conState=false;
		//  disConnect();
	} 
/*	
	public void disConnect(){
		try{
	    	socket.close();
	    	server.close();
	    	server = null;
	    	socket = null; 
	    	conState=false;
	    	jStateTextField.setText("断开连接");
	  
	    }catch(Exception exception){
	    	exception.printStackTrace();
	    }
	}
*/	
	
	public void serverListen(){
		 try{
		    	//	jStateTextField.setText("等待接收客户端");
		    	//	repaint();
		
		    	server = new ServerSocket(Integer.parseInt(jPortTextField.getText()), 5); 					
		    	socket = server.accept(); 
		    	in=new BufferedReader(new InputStreamReader(socket.getInputStream()));
				out=new PrintWriter(socket.getOutputStream());
		    	conState=true;
		    	jStateTextField.setText("建立连接,来自:"+socket.getInetAddress().getHostAddress());
		  
		    }catch(Exception exception){
		    	exception.printStackTrace();
		    	jStateTextField.setText("建立连接失败");
		  }
		 chatThread=new Thread(this);
		 chatThread.start();
	//	  run();
	}
	
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO 自动生成方法存根
		  Server server=new Server();
	      server.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}

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

⌨️ 快捷键说明

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