Socket介绍及使用ServerSocket建立聊天服务器

实现效果

Socket介绍及使用ServerSocket建立聊天服务器_第1张图片

使用命令行建立多个客户端访问服务端,用一个客户端可以向其它所有客户端发消息

实现步骤

1 运行代码

2 在命令行下输入telnet locahost 8888//8888是代码中服务器的端口,可以更改至1~65535中的任意端口,但是有些端口可能已经被占用

3最后不要忘记关闭程序

//第二步如果出错,可能是windows下默认没有开启远程连接服务,解决方法见点击打开链接

Socket介绍及使用ServerSocket建立聊天服务器_第2张图片

代码:

MyServerSocket

public class MyServerSocket {
//主线程
	public static void main(String[] args) {

		new ServerListener().start();//由于客户端的监听阻塞线程,所以利用ServerListener新建一个线程,防止主线程被阻塞
	}

}

ServerListener

public class ServerListener extends Thread {

	public void run(){
		//参数需要传入一个整型即端口,可以从1~65535
		try {
			ServerSocket serverSocket = new ServerSocket(8888);
			//侦听客户端的连接,阻塞线程
			while(true){
				Socket socket = serverSocket.accept();//侦听是否有客户端链接到serverSocket这个服务端端口
				JOptionPane.showMessageDialog(null, "有客户端连接到8888端口");
				//会有多个客户端连接到这个服务器端口,需要将它们放到不同线程中
				ChatSocket cs = new ChatSocket(socket);
				cs.start();
				ChatManager.getChatManager().add(cs);

			}
		} catch (IOException e) {

			e.printStackTrace();
		}
	}
}

ChatSocket

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) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	public void run(){
		try {
			//得到客户端输入流,并通过服务端,发送给其它客户端
			BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream(),"UTF-8"));
			String line = null;
			
			while((line = br.readLine()) != null){
				ChatManager.getChatManager().publish(this, line);//diao'yong
			}
			br.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}
}

ChatManager

public class ChatManager {//对连接到服务器的多个客户端进行管理
//单例化处理
	private ChatManager(){}//一个聊天服务器只能有一个ChatManager
	private static final ChatManager cm = new ChatManager();
	
	public static ChatManager getChatManager(){
		return cm;
	}
	
//vector可以实现自动增长的可变数组,将所有的客户端放入其中
	Vector vector = new Vector();
	
	public void add(ChatSocket cs){
		vector.add(cs);//add方法实现将chatSocket放入其中
	}
//此方法将客户端中一个客户端输出的信息,发送给其余的客户端	
	public void publish(ChatSocket cs,String out){
		for(int i=0;i



你可能感兴趣的:(Socket介绍及使用ServerSocket建立聊天服务器)