用Java网络编程Socket编程实现群聊天室的功能,使用CS平台

    技术2022-07-14  67

    群聊天室是客户端连接服务器端之后,客户端向服务器端发送消息,然后服务器端接收到该客户端的消息之后,转发给其他的所有客户端的功能小程序。客户端需要输入自己的昵称,然后在群里发言,大家都能看见。 一、服务器端 1、先构建服务器端,开启服务器之后,客户端才能够进行连接

    public class Server { //用客户端的昵称作为key Map<String,PrintWriter> allout; //添加start方法 public void start() { allout=new HashMap<String, PrintWriter>(); try { //在Start方法中用ServerSocket创建服务器 ServerSocket server=new ServerSocket(8888); System.out.println("服务器已经成功创建,等待客户端连接"); while(true) { //用accept()方法等待客户端连接 Socket client=server.accept(); System.out.println("有客户接入,IP地址为:"+client.getInetAddress()); //启动线程 new ClientThread(client, allout).start(); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static void main(String[] args) { //创建Server对象,并调用start方法 Server server=new Server(); server.start(); } }

    2、建立接受客户端的消息和向客户端转发消息的线程

    //向客户端发送消息,接受客户端发的消息 class ClientThread extends Thread{ //连接到服务器端的客户端 Socket client; Map<String,PrintWriter> allout; //建立有参构造器 public ClientThread(Socket client, Map<String, PrintWriter> allout) { super(); this.client = client; this.allout = allout; } public void run() { //获取输入流对象 try { OutputStream out=client.getOutputStream(); //使用自动刷新的输出流 PrintWriter pw=new PrintWriter(out); pw.println("欢迎来到新明天补习班"); pw.println("请先输入学生姓名:"); //强制刷新 pw.flush(); //接受客户端的 消息 InputStream in=client.getInputStream(); BufferedReader br=new BufferedReader(new InputStreamReader(in)); //获取名字 String name=br.readLine(); //将名字和消息放入map集合 allout.put(name, pw); String line=null; while((line=br.readLine())!=null) { //把信息发给当前除了自己的所有人 sendMsg(name+"说"+line,pw); } br.close(); } catch (IOException e) { e.printStackTrace(); } } private void sendMsg(String line, PrintWriter pw) { Set<String> names=allout.keySet(); //遍历 for(String name:names) { PrintWriter p=allout.get(name); if(p!=pw) { p.println(line); p.flush(); } } } }

    二、客户端 1、先建立客户端

    public class Client { //添加Open方法 public void open() { try { Socket client=new Socket("localhost",8888); System.out.println("已成功连接服务器"); //获取客户端输入流对象 InputStream in=client.getInputStream(); new ReadFromServer(in).start();; //获取客户端输出流对象 OutputStream out=client.getOutputStream(); new WriteToServer(out).start(); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } public static void main(String[] args) { //建立Client对象,调用open()方法 Client client=new Client(); client.open(); } }

    2、建立读取服务器所发送消息的线程

    //读取服务器发送消息的线程 class ReadFromServer extends Thread{ InputStream in; public ReadFromServer(InputStream in) { super(); this.in = in; } public void run() { //缓冲字符输入流传入信息 BufferedReader br=new BufferedReader(new InputStreamReader(in)); String line=null; try { while((line=br.readLine())!=null) { System.out.println(line); } br.close(); } catch (IOException e) { e.printStackTrace(); } } }

    3、建立客户端向服务器发送消息的线程

    //客户端向服务器发送消息的线程 class WriteToServer extends Thread{ OutputStream out; public WriteToServer(OutputStream out) { super(); this.out = out; } public void run() { Scanner key=new Scanner(System.in); PrintWriter p=new PrintWriter(out); while(true) { String line=key.nextLine(); p.println(line); p.flush(); } } }
    Processed: 0.010, SQL: 9