首页 > 代码库 > java socket编程--聊天小案例

java socket编程--聊天小案例

  很久以前写过socket聊天室,都快忘完了,心血来潮又重新写一遍。

服务器端:

技术分享
package com.fancy;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStream;import java.io.PrintWriter;import java.net.ServerSocket;import java.net.Socket;import java.util.HashMap;import java.util.Map;public class Server {    private int port;    private ServerSocket server;    private Map<String,PrintWriter> clients = new HashMap();    public Server() throws IOException {        port = 10025;        server = new ServerSocket(port);        System.out.println("成功创建服务器端!");        startReceive();    }    public void startReceive() throws IOException{        while(true){            Socket socket = server.accept();            //InetAddress address = socket.getInetAddress();            ClientHandler handler = new ClientHandler(socket);            new Thread(handler).start();        }    }    public void sendMsg(String from,String str) throws IOException {        for(String k:clients.keySet()){            if(k.equals(from)){                continue;            }            PrintWriter pw = clients.get(k);            pw.println(str);            pw.flush();        }    }    class ClientHandler implements Runnable{        private String nickname;        private Socket socket;        private PrintWriter pw;        public ClientHandler(Socket socket){            this.socket = socket;        }        @Override        public void run() {            BufferedReader br = null;            try {                InputStream in = socket.getInputStream();                br = new BufferedReader(new InputStreamReader(in));                OutputStream out = socket.getOutputStream();                pw = new PrintWriter(out,true);                String name = br.readLine();                this.nickname = name;                if(!clients.containsKey(name)){                    clients.put(name, pw);                    pw.println("欢迎新朋友:"+name+",当前在线人数:"+clients.size());                }                String str;                while((str = br.readLine())!=null){                    if("exit".equalsIgnoreCase(str.trim())){                        clients.remove(this.nickname);                        this.socket.close();                        sendMsg("all", this.nickname+"下线了,当前在线人数:"+clients.size());                    }else{                        sendMsg(name,name+":"+str);                    }                }            } catch (Exception e) {                e.printStackTrace();            } finally{                try {                    br.close();                } catch (IOException e) {                }            }        }    }    public static void main(String[] args) {        try {            Server s = new Server();        } catch (IOException e) {            e.printStackTrace();        }    }}
View Code

客户端:

技术分享
package com.fancy;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStream;import java.io.PrintWriter;import java.net.Socket;import java.net.UnknownHostException;import java.util.Scanner;public class Client {    private Socket socket;    private boolean online = true;    public Client() throws UnknownHostException, IOException {        socket = new Socket("127.0.0.1", 10025);        OutputStream out = socket.getOutputStream();        PrintWriter pw = new PrintWriter(out, true);        Scanner scan = new Scanner(System.in);        String word;        ServerHandler hander = new ServerHandler();        new Thread(hander).start();        System.out.println("请输入您的昵称:");        word = scan.nextLine();        pw.println(word);        pw.flush();        while((word=scan.nextLine())!=null){            pw.println(word);            pw.flush();            if("exit".equalsIgnoreCase(word)){                online = false;                break;            }        }    }    class ServerHandler implements Runnable{        @Override        public void run() {            while(online){                InputStream in;                try {                    in = socket.getInputStream();                    BufferedReader br = new BufferedReader(new InputStreamReader(in));                    String back = br.readLine();                    System.out.println(back);                } catch (IOException e) {                    e.printStackTrace();                }            }        }    }    public static void main(String[] args) {        try {            Client c = new Client();            System.out.println("started!");        } catch (UnknownHostException e) {            e.printStackTrace();        } catch (IOException e) {            e.printStackTrace();        }            }}
View Code

 

  运行一次server,多次client的结果如下:

  技术分享

 

java socket编程--聊天小案例