使用Socket模拟实现聊天小工具

Socket是在应用层和传输层之间的一个抽象层,它把 TCP/IP 层复杂的操作抽象为几个简单的接口,供应用层调用实现进程在网络中的通信。
Socket 保证了不同计算机之间的通信,也就是网络通信。
下面我们使用Socket来模拟一个小的聊天工具。
首先需要一个服务器端,也就是接收消息的一端。

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

public class SocketServer {
    public static void main(String[] args){
        try{
            //1.创建ServerSocket对象,指定端口号为5000
            ServerSocket serverSocket = new ServerSocket(5000);
            
            //2.使用accept()方法监听客户端,与客户端建立连接,获取客户端的socket对象
            Socket socket = serverSocket.accept();
           
            //3.获取客户端发来的消息流(获取用户请求信息)
            InputStream is = socket.getInputStream();
           
            //4.使用带有缓冲区的BufferedReader读取消息流
            BufferedReader br = new BufferedReader(new InputStreamReader(is));
           
            //5.读取客户端发来的信息
            String msg = null;
            while((msg = br.readLine())!=null){
                System.out.println("来自客户端的消息:"+msg);
            }
            
            //6.关闭各种资源
            br.close();
            is.close();
            socket.close();
            serverSocket.close();
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

创建客户端,用于发送消息

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

//客户端
public class SocketClient{
    public static void main(String[] args) {
        try {
        	//1.创建客户端Socket对象,传入服务器端的ip和端口号
            Socket socket = new Socket("localhost",5000);
          
            //2.创建输出流对象
            OutputStream os = socket.getOutputStream();
           
            //3.通过输出流将信息发送请求给服务器
            String loginInfo = "你好,我是李焕英";
            os.write(loginInfo.getBytes());
           
            //4.关闭流及Socket对象
            os.close();
            socket.close();

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

启动服务:
先启动服务器端,再启动客户端,会在服务器端的控制台输出“来自客户端的消息:你好,我是李焕英”。通信完毕。
在这里插入图片描述

需求升级:
由于要模拟聊天工具,需要服务器端不断地监听客户端(使用循环),客户端需要手动输入信息进行发送(使用Scanner)。
服务器端:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

//服务器端
public class SocketServer {
    public static void main(String[] args) {
        try {
            //1、创建服务器端serversocket对象,指定端口号
            ServerSocket serverSocket = new ServerSocket(5000);
            Socket socket = null;
            InputStream inputStream = null;
            BufferedReader bfr = null;
            while (true){
                //2、使用accept()方法监听客户端的请求,建立连接,返回监听到的客户端的Socket对象
                 socket= serverSocket.accept();
                //3.创建输入流,接收客户端的信息
                inputStream = socket.getInputStream();

                //4.使用BufferedReader读取客户端的信息
                 bfr = new BufferedReader(new InputStreamReader(inputStream));
                String line = null;
                while((line = bfr.readLine())!=null){
                    System.out.println("来自客户端的消息:"+line);
                }
            }
            /*//5.关闭流和socket连接
            bfr.close();
            inputStream.close();
            socket.close();
            serverSocket.close();*/


        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

客户端:

import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;

public class SocketClient {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        try {
            boolean flag = true;
            while (flag){
                //创建socket对象
                Socket socket = new Socket("localhost",5000);
                //输出流
                OutputStream os = socket.getOutputStream();
                System.out.println("请输入要发送的信息:(按0退出)");
                String info = sc.next();
                if(!"0".equals(info)){
                    os.write(info.getBytes());
                }else {
                    flag = false;
                }
                os.close();
                socket.close();
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

效果:
客户端发送消息:
在这里插入图片描述
服务器端接受消息:
在这里插入图片描述
思考下,如何使用多线程处理多个客户端发送消息的请求?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值