对话I/O—网络聊天室

今天看了一个马化腾的视频,二十年前,老马正在做QICQ的时候,人们通过互联网通信还是一个难以想象的概念。如今我们已经习惯了用聊天工具聊天,而聊天工具它原始的模样是什么?小翔哥将带你实现利用Java语言实现一个网络聊天室。

客户端

import java.net.*;
import java.io.*;

public class T1_Client{
    public static void main(String [] args){
        try{
            //使用Socket向指定IP的服务器中指定端口的服务端程序发送连接请求
            Socket socket = new Socket("10.200.65.65", 5000);
            
            //输出服务端信息:地址、端口
            System.out.println("Connected with server "+socket.getInetAddress()+":"+socket.getPort());
            
            //创建键盘输入流,并包装为BufferedReader方便处理文本(也可用Scanner)
            BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
            System.out.println(input);
            //获取网络连接输出流,并包装为PrintWriter方便输出(参数true,实时输出)
            PrintWriter output = new PrintWriter(socket.getOutputStream(), true);
            while(true){
                String lineToBeSent = input.readLine();
                //如果用户输入"end",终止循环
                if(lineToBeSent.equals("end")){
                    break;
                }else{
                    output.println(lineToBeSent);
                }
            }
            
            //通讯结束,关闭连接及相关资源
            input.close();
            output.close();
            socket.close();
        }catch(Exception ex){
            ex.printStackTrace();
        }
    }
}

 

服务端

import java.net.*;
import java.io.*;

public class T1_Server{
    public static void main(String [] args){
        ServerSocket server_socket = null;
        try{
            //使用ServerSocket监听本机指定的端口(端口可在1024~65535中随意指定)
            server_socket = new ServerSocket(5000);
            
            //服务端不断处理客户端的连接
            while(true){
                System.out.println("ready for connection...");
                
                //阻塞,等待连接,成功连接后,创建与客户端通讯的Socket对象实例
                Socket socket = server_socket.accept();
                
                //一条线程对应一个客户端
                T1_Server_Thread thread = new T1_Server_Thread(socket);
                thread.start();            
            }
        }catch(Exception ex){
            ex.printStackTrace();
        }finally{
            try{
                if(server_socket!=null){
                    server_socket.close();
                }
            }catch(Exception ex){
                ex.printStackTrace();
            }
        }
    }
}

class T1_Server_Thread extends Thread{
    private Socket socket;
    public T1_Server_Thread(Socket s){
        this.socket = s;
    }
    
    public void run(){
        try{
            //输出客户端信息:地址、端口
            System.out.println("New connection accepted "+socket.getInetAddress()+":"+socket.getPort());
            
            //获取网络连接输入流,并包装为BufferedReader方便处理文本
            BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            while(true){
                String message = input.readLine();
                if(message == null){
                    break;
                }else{
                    System.out.println(message);
                }
            }
            
            //通讯结束,关闭连接及相关资源
            input.close();
            socket.close();
            System.out.println("Connection closed by client");    
        }catch(Exception ex){
            ex.printStackTrace();
        }
    }
}

 

posted @ 2018-12-10 21:22  小翔哥  阅读(281)  评论(0编辑  收藏  举报