java 多线程,socket 简单模拟聊天软件

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * Create by wdful
 * Email: wdful165177@gmail.com
 * Date: 2017/4/7
 */

/*
 * 聊天程序  一个线程控制收 一个线程控制发  同时执行
 */
//发送端
class Client implements Runnable {
    private Socket s;

    public Client(Socket s) {
        this.s = s;
    }

    @Override
    public void run() {
        while (true) {
            System.out.println(Thread.currentThread()+"客户端发信息:");
            BufferedReader ins = new BufferedReader(new InputStreamReader(System.in));
            String str = null;
            try {
                str = ins.readLine();
                //为了发送数据    获取Socket中的输出流
                OutputStream out = s.getOutputStream();
                out.write(str.getBytes());
                if ("886".equals(str)) {
                    System.out.println(Thread.currentThread()+": bye");
                    s.close();
                    System.exit(0);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            //获取数据
            InputStream in = null;
            try {
                in = s.getInputStream();
                byte[] data = new byte[1024];
                int len = in.read(data);
                System.out.println(Thread.currentThread()+"服务端对客户端说:");
                System.out.println(new String(data, 0, len));
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

class ServerClient implements Runnable {
    private ServerSocket ss;
    private Socket s;

    public ServerClient(ServerSocket ss) {
        this.ss = ss;
    }

    @Override
    public void run() {
        System.out.println("Server start ...");
        //建立服务端socket服务  并监听一个端口
        //获取客户端对象
        try {
            s = ss.accept();
            //连接状态
            System.out.println("Connected :" + s.getInetAddress().getHostAddress().toString() + " port:" + s.getPort());
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("获取客户端失败!");
        }
        while (true) {
            try {
                //读取数据
                InputStream in = s.getInputStream();
                byte[] data = new byte[1024];
                int len = in.read(data);
                String str = new String(data, 0, len);
                if ("886".equals(str)) {
                    System.out.println(Thread.currentThread()+": bye");
                    ss.close();
                    s.close();
                    System.exit(0);
                }
                System.out.println(Thread.currentThread()+"客户端对服务端说:");
                System.out.println(str);
                System.out.println(Thread.currentThread()+"服务端发信息:");
                BufferedReader ins = new BufferedReader(new InputStreamReader(System.in));
                //为了发送数据    获取Socket中的输出流
                OutputStream out = s.getOutputStream();
                out.write(ins.readLine().getBytes());
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }
}

class ChatDemo {
    public static void main(String[] args) throws IOException {
        //服务端启动
        ServerClient serverClient = new ServerClient(new ServerSocket(10000));
        Thread t2 = new Thread(serverClient);
        t2.start();
        //客户端启动
        Client client = new Client(new Socket("127.0.0.1",10000));
        Thread t1 = new Thread(client);
        t1.start();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阳十三

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值