多线程通信之模拟QQ聊天功能

题目:模拟qq聊天功能:实现客户端与服务器(一对一)多次聊天功能,客户端首先发起聊天,输入的内容在服务器端和客户端显示,然后服务器端也可以输入信息,同样信息在客户端和服务端显示。

分析:需要建立客户端和服务器端两个类,从面向对象的思想出发,分析两个类各自需要实现的功能。
客户端:

1.创建套接字;
Socket s = new Socket();

2.创建输入流,接收键盘键入的内容并打印;
BufferedReader br = new BufferedReader(InputStreamReader(System.in));
String str = br.readline();
System.out.println(str) ;   

3.创建输出流,向服务端发送内容;
BufferedWriter bw = new BufferedWriter(OutputStreamWriter(s.getOutputStream()));
bw.write(str+"\r\n");
bw.flush();

4.创建输入流,接收服务端发送的内容并打印。
DataInputStream dis = new DataInputStream(s.getInputStream());
String data = dis.readUTF();
System.out.println(data);

客户端代码:

public class Client {
    public static void main(String[] args)  {

        String str = null;
        BufferedReader br = null;
        BufferedWriter bw = null;
        DataInputStream dis = null;
        int count=0;
        try {
            while(true){
                Socket s = new Socket("192.168.1.84",9999);
                //接收用户输入,创建输入流
                br = new BufferedReader(new InputStreamReader(System.in));
                str = br.readLine();
                System.out.println("我是客户端,我第一次说话:"+str);

                //客户端发出信息,创建输出流
                bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
                bw.write(str+"\r\n");//换行符号不能忘
                bw.flush();//缓冲流要刷新

                //客户端接受服务器端信息
                dis = new DataInputStream(s.getInputStream());
                String data = dis.readUTF();
                System.out.println("我是客户端,我聊嗨了:"+data);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if(dis != null){
                try {
                    dis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(bw != null){
                try {
                    bw.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(br != null){
                try {
                    br.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

服务器端:

1.创建服务器端的套接字;
ServerSocket ss = new ServerSocket();

2.接受客户端的连接;
Socket s = ss.accept();

3.创建输入流,接收客户端发送的内容并打印;
BufferedReader br = new BufferedReader(InputStreamReader(s.getInputStream()));
String str = br.readline();
System.out.println(str);

4.创建输出流,向客户端发送内容并打印。
DataOutputStream dos = newDataOutputStream(s.getOutputStream());
BufferedReader br = new BufferedReader(InputStreamReader(System.in));
String data = br.readline();
dos.writeUTF(data);
dos.flush();
System.out.println(data);

服务器端代码:

public class Server {

    public static void main(String[] args)  {
        Socket s = null;
        ServerSocket ss = null;
        BufferedReader br = null;
        DataOutputStream dos = null;
        BufferedReader br2 = null;
        try {
            //创建服务端套接字,等待接收端连接
            ss = new ServerSocket(9999);
            while(true){
                s = ss.accept();//这个要放在循环里面,因为要多次创建连接

                //创建输入流,接收客户端信息
                br = new BufferedReader(new InputStreamReader(s.getInputStream()));
                String str1 = br.readLine();
                System.out.println("我是服务器端,我第一次答话:"+str1);

                //创建数据流,向客户端发送数据
                dos = new DataOutputStream(s.getOutputStream());
                br2 = new BufferedReader(new InputStreamReader(System.in));
                String str = br2.readLine();
                dos.writeUTF(str);
                dos.flush();
                System.out.println("我是服务器端,我也聊嗨了:"+str);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if(s!=null){
                try {
                    s.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

你可能感兴趣的:(Java中的易混点)