java38.Socket通信------使用ServerSocket建立聊天服务器---2

来源:互联网 发布:iphone7和mac照片同步 编辑:程序博客网 时间:2024/05/20 07:20

在上一个博客代码中进行修改:

1.MyServerSocket类

package com.jikexueyuan.testmyserversocket.main;public class MyServerSocket {    public static void main(String[] args) {        new ServerListner().start();    }}

2.ServerListner类

package com.jikexueyuan.testmyserversocket.main;import java.io.IOException;import java.net.ServerSocket;import java.net.Socket;import javax.swing.JOptionPane;public class ServerListner extends Thread {    public void run() {        try {            // 1-65535            ServerSocket serverSocket = new ServerSocket(12345);// 服务器启动监听了12345            while (true) {                Socket socket = serverSocket.accept();// 线程阻塞---等待客户端连接12345端口                // 建立连接                JOptionPane.showMessageDialog(null, "有客户端链接到了本机的12345端口");                // 将socket传递给新的线程                ChatSocket cs = new ChatSocket(socket);                cs.start();                ChatManager.getChatManager().add(cs);            }        } catch (IOException e) {            e.printStackTrace();        }    }}

3.ChatSocket类

package com.jikexueyuan.testmyserversocket.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;// line:服务器从客户端读取的数据            while ((line = br.readLine()) != null) {                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();        }    }}

4.ChatManager类

package com.jikexueyuan.testmyserversocket.main;import java.util.Vector;public class ChatManager {    // 每个聊天服务器只有一个ChatManager,所以要单例化处理    //单例化:通过使用private的构造函数确保了在一个应用中只产生一个实例,并且是自行实例化的。    // 1.类的构造方法要变成private类型,以限制产生多个对象    private ChatManager() {    }    private static final ChatManager cm = new ChatManager();    public static ChatManager getChatManager() {        return cm;    }    Vector<ChatSocket> vector = new Vector<ChatSocket>();    // 为当前集合添加一个ChatSocket对象    public void add(ChatSocket cs) {        vector.add(cs);    }    // 其中某个ChatSocket线程,通过调用publish函数向其他所有客户端发送信息    public void publish(ChatSocket cs, String out) {// out为要发送的信息        for (int i = 0; i < vector.size(); i++) {            ChatSocket csChatSocket = vector.get(i);            if (!cs.equals(csChatSocket)) {// 如果当前对象不是发送消息的对象,                csChatSocket.out(out);//则当前客户端显示出来消息            }        }    }}

5.运行结果:

1.打开两个cmd,分别输入如图指令

这里写图片描述

2.两个cmd客户端连接成功

这里写图片描述

3.只要在一个窗口输入数据,另外一个窗口就会接收到

这里写图片描述

1 0
原创粉丝点击