极客教学笔记---Java实现简单聊天客户端模拟


偶然间在网上看见的教程,想着弥补下自己对java的空白就写了这个学习一下。结果来说不够完善,关于UTF-8接受方会出现乱码。在此仅用于以后参考工程结构。

MySocketServer:

package testmySocket.main;

public class MySocketServer {
 
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new ServerListener().start();
	}

}

ServerListener:

package testmySocket.main;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

import javax.swing.JOptionPane;

public class ServerListener extends Thread {
	public void run(){
		//1-65535
		try{
			ServerSocket serverSocket = new ServerSocket(12345);
			while(true){
				//block
				Socket socket = serverSocket.accept();
				//building link
				JOptionPane.showMessageDialog(null, "有客户端连接到了本机的12345号端口");
				//将Socket传递给新的线程
				ChatSocket cs = new ChatSocket(socket);
				cs.start();
				ChatManager.getChatManager().add(cs);
			}
		} catch(IOException e){
			e.printStackTrace();
		}
	}
}

ChatSocket:

package testmySocket.main;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.Socket;

public class ChatSocket extends Thread {
	Socket socket;
	public ChatSocket(Socket s){
		this.socket = s;
	}
	
	public void out(String out){
		try {
			socket.getOutputStream().write(out.getBytes("UTF-8"));
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	public void run(){
		try {
			BufferedReader br = new 
					BufferedReader(new 
							InputStreamReader(socket.getInputStream(),"UTF-8"));
			String line = null;
			while((line = br.readLine())!=null){
				System.out.println(line);
				ChatManager.getChatManager().publish(this, line);
			}
			br.close();
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e){
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}
  

ChatManager:

package testmySocket.main;

import java.util.Vector;

public class ChatManager {
	private  ChatManager(){}
	private static final ChatManager cm = new ChatManager();
	public static ChatManager getChatManager(){
		return cm;
	}
	Vector<ChatSocket> vector = new Vector<ChatSocket>();
	
	public void add(ChatSocket cs){
		vector.add(cs);
	}
	
	public void publish(ChatSocket cs,String out){
		for(int i=0 ; i<vector.size() ; i++){
			ChatSocket csChatSocket = vector.get(i);
			if(!cs.equals(csChatSocket)){
				csChatSocket.out(out+"\n");
			}
		}
	}
}

StartClient:

package test2;

import java.awt.EventQueue;

import test3.MainWindow;

public class StartClient {

	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					MainWindow frame = new MainWindow();
					frame.setVisible(true);
					ChatManager.getCM().setWindow(frame);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

}

MainWindow:

package test3;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;

import test2.ChatManager;

import javax.swing.JTextArea;
import javax.swing.GroupLayout;
import javax.swing.GroupLayout.Alignment;
import javax.swing.JButton;
import javax.swing.LayoutStyle.ComponentPlacement;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

public class MainWindow extends JFrame {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private JPanel contentPane;
	JTextArea txt;

	 /** 
	 * Create the frame.
	 */
	public MainWindow() {
		setAlwaysOnTop(true);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 450, 300);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		
		txt = new JTextArea();
		txt.setText("Ready...");
		
		JTextArea Ip = new JTextArea();
		Ip.setText("127.0.0.1");
		
		JButton button = new JButton("\u8FDE\u63A5\u5230\u670D\u52A1\u5668");
		button.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent arg0) {
				ChatManager.getCM().connect(Ip.getText());
			}
		});
		
		JTextArea send = new JTextArea();
		send.setText("\u4F60\u597D");
		
		JButton button_1 = new JButton("\u53D1\u9001");
		button_1.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent arg0) {
				ChatManager.getCM().send(send.getText());
				appendText("我说:"+send.getText());
				send.setText(" ");
			}
		});
		GroupLayout gl_contentPane = new GroupLayout(contentPane);
		gl_contentPane.setHorizontalGroup(
			gl_contentPane.createParallelGroup(Alignment.LEADING)
				.addGroup(Alignment.TRAILING, gl_contentPane.createSequentialGroup()
					.addGroup(gl_contentPane.createParallelGroup(Alignment.TRAILING)
						.addComponent(txt, Alignment.LEADING, GroupLayout.DEFAULT_SIZE, 423, Short.MAX_VALUE)
						.addGroup(Alignment.LEADING, gl_contentPane.createSequentialGroup()
							.addComponent(Ip)
							.addPreferredGap(ComponentPlacement.RELATED)
							.addComponent(button))
						.addGroup(gl_contentPane.createSequentialGroup()
							.addComponent(send, GroupLayout.DEFAULT_SIZE, 345, Short.MAX_VALUE)
							.addPreferredGap(ComponentPlacement.UNRELATED)
							.addComponent(button_1)))
					.addContainerGap())
		);
		gl_contentPane.setVerticalGroup(
			gl_contentPane.createParallelGroup(Alignment.LEADING)
				.addGroup(gl_contentPane.createSequentialGroup()
					.addGroup(gl_contentPane.createParallelGroup(Alignment.BASELINE)
						.addComponent(button)
						.addComponent(Ip, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))
					.addPreferredGap(ComponentPlacement.RELATED)
					.addComponent(txt, GroupLayout.DEFAULT_SIZE, 175, Short.MAX_VALUE)
					.addPreferredGap(ComponentPlacement.RELATED)
					.addGroup(gl_contentPane.createParallelGroup(Alignment.TRAILING)
						.addComponent(button_1)
						.addComponent(send, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)))
		);
		contentPane.setLayout(gl_contentPane);
	}
	
	public void appendText(String in){
		txt.append("\n"+in);
	}
}

ChatManager:

package test2;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

import test3.MainWindow;

public class ChatManager {
	
	private ChatManager(){};
	private static final ChatManager instance = new ChatManager();
	public static ChatManager getCM(){
		return instance;
	}
	
	MainWindow window;
	private String Ip;
	Socket socket;
	BufferedReader reader;
	PrintWriter writer;
	
	public void setWindow(MainWindow window){
		this.window = window;
		window.appendText("文本框已经和ChatManager绑定。");
	}
	
	public void connect(String ip){
		this.Ip = ip;
		new Thread(){

			@Override
			public void run() {
				try {
					socket = new Socket(Ip,12345);
					writer = new PrintWriter(
							 new OutputStreamWriter(socket.getOutputStream()));
					reader = new BufferedReader(
							 new InputStreamReader(socket.getInputStream(),"UTF-8"));
					String line = null;
					while((line = reader.readLine()) != null){
						window.appendText("收到:"+line);
					}
					writer.close();
					reader.close();
					writer = null;
					reader = null;
					
				} catch (UnknownHostException e) {
					e.printStackTrace();
				} catch (IOException e){
					e.printStackTrace();
				}
			}
			 
			
		}.start();
	}
	
	public void send(String out){
		if(writer != null){
			writer.write(out+"\n");
			writer.flush();
		}else{
			window.appendText("当前链接已经中断...");
		}
	}
}

最终效果图:


posted @ 2018-04-05 14:28  Assassin_poi君  阅读(273)  评论(0编辑  收藏  举报