Client端:

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;

public class ChatClient {
    private static final String SERVER_IP = "127.0.0.1";
    private static final int SERVER_PORT = 8888;
    
    Socket socket = null;
    DataOutputStream dos = null;
    DataInputStream dis = null;
    private boolean bConnected = false;

private static Scanner in = new Scanner(System.in);
    private static String hostInfo = null;

Thread tRecv = new Thread(new RecvThread());

public static void main(String[] args) {
        new ChatClient().launch();
    }

public void launch() {
        connect();
        tRecv.start();
    }

public void connect() {
        try {
            socket = new Socket(SERVER_IP, SERVER_PORT);
            dos = new DataOutputStream(socket.getOutputStream());
            dis = new DataInputStream(socket.getInputStream());
            bConnected = true;

InetAddress addr = InetAddress.getLocalHost();
            String ip = addr.getHostAddress().toString();// 获得本机IP
            String address = addr.getHostName().toString();// 获得本机名称
            hostInfo = ip + "\t" + address + "\tconnected.";
            System.out.println(hostInfo);
            dos.writeUTF(hostInfo);
            dos.flush();
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

public void disconnect() throws IOException {
        try {
            dos.close();
            dis.close();
            socket.close();
        } catch (IOException e) {
        }
    }

private class RecvThread implements Runnable {
        public void run() {
            while (bConnected) {
                try {
                    if (in.hasNext()) {
                        String talk = in.nextLine();
                        if (talk.equals("quit")) {
                            disconnect();
                            bConnected = false;
                            break;
                        }
                        dos.writeUTF(talk);
                        dos.flush();
                    }
                    String talk = dis.readUTF();
                    System.out.println(talk);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

 


server端:

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.EOFException;
import java.io.IOException;
import java.net.BindException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;

public class ChatServer {
    boolean started = false;
    ServerSocket ss = null;
    
    List<Client> clients = new ArrayList<Client>();
    
    public static void main(String[] args) {
        new ChatServer().start();
    }
    
    public void start() {
        try {
            ss = new ServerSocket(8888);
            started = true;
        } catch (BindException e) {
            System.err.println("port in use.please stop program using this port and restart.");
            System.exit(0);
        } catch (IOException e) {
            e.printStackTrace();
        }
        
        try {
            while(started) {
                Socket s = ss.accept();
                Client c = new Client(s);
                // System.out.println("a client connected.");
                new Thread(c).start();
                clients.add(c);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                ss.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        
    }
    
    class Client implements Runnable {
        private Socket s;
        private DataInputStream dis = null;
        private DataOutputStream dos = null;
        private boolean bConnected = false;
        
        public Client(Socket s) {
            this.s = s;
            try {
                dis = new DataInputStream(s.getInputStream());
                dos = new DataOutputStream(s.getOutputStream());
                bConnected = true;
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        
        public void send(String str) {
            try {
                dos.writeUTF(str);
                dos.flush();
            } catch (IOException e) {
                clients.remove(this);
                System.out.println("a client quit.");
                //e.printStackTrace();
            }
        }
        
        public void run() {
            try {
                while(bConnected) {
                    String str = dis.readUTF();
                    solveTalk(str);
                }    
            } catch (EOFException e) {
                System.out.println("Client closed!");
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    if(dis != null) dis.close();
                    if(dos != null) dos.close();
                    if(s != null) {
                        s.close();
                        s = null;
                    }
                } catch (IOException e1) {
                    e1.printStackTrace();
                }
            }
        }
        
        private void solveTalk(String talk) {
            System.out.println(talk);
            for(int i=0;i<clients.size();i++) {
                Client c = clients.get(i);
                c.send(talk);
            }
        }
    }
    
}

最新文章

  1. Apache2.4部署django出现403 Forbidden错误解决办法
  2. Android获取时间
  3. ADO。Net(二)——防止SQL注入攻击
  4. K-邻近算法
  5. Less/Sass编译工具
  6. 一步步学Mybatis-怎么样实现动态SQL查询(6)
  7. 读取iPhone中的通讯录信息
  8. QQ强制视频聊天
  9. Splay Tree的删除操作
  10. EasyUI篇の日期控件
  11. 在Qt中将函数发送到主线程执行
  12. ubuntu -server 忘记root 密码方法
  13. WCF基金会
  14. Linux环境下Android JNI程序的编译
  15. 使用mpvue开发小程序教程(五)
  16. mysql中Error : Invalid default value for &#39;timestamp&#39;问题
  17. Python 爬取 猫眼 top100 电影例子
  18. React/anu实现Touchable
  19. PAT 1037 在霍格沃茨找零钱(20)(代码+思路)
  20. Django中配置用Redis做缓存和session

热门文章

  1. Lightoj 1009 - Back to Underworld
  2. [开源下载] 【开源项目】EasySL for Silverlight 4
  3. bzoj 5017 炸弹
  4. CF上的3道小题(2)
  5. 【SCOI 2005】 繁忙的都市
  6. Splay基本操作
  7. Linux设备模型 (2)
  8. Bootstrap 面板
  9. php pdo操作数据库
  10. bzoj 4584: [Apio2016]赛艇【dp】