基于TCP协议,小的聊天demo。tomcat的原理也就类似于此

167 阅读2分钟

基于TCP协议写的使用Socket +多线程实现一个简单的聊天工具

需求: 1.要求客户端和服务端能够交替发送消息

2、在客户端和服务端都能看到彼此的聊天记录

服务端

package com.gosang;

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

/**
 * @Author: gosang
 * @DateTime: 2020/5/16 23:25
 * @Description: TODO
 */
public class Server {
    public static void main(String[] args) {

        ServerSocket serverSocket = null;
        Socket socket = null;

        //设置端口号,服务器IP地址默认是本机的。172.0.0.1=localhost
        try {
            //读
            serverSocket = new ServerSocket(8080);
            System.out.println("服务端启动:");
            //让服务器一直保持工作状态,即接收socket。
            while (true){
                //serverSocket.accept()是阻塞方法,拿到客户端发来的socket之前都不会继续往下走
                socket = serverSocket.accept();

                //accept一个socket就新建一个线程
                new Thread(new SocketRunable(socket)).start();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                socket.close();
                serverSocket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }
}

新建线程

package com.gosang;

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

/**
 * @Author: gosang
 * @DateTime: 2020/5/16 23:56
 * @Description: TODO
 */
public class SocketRunable implements Runnable{

    private Socket socket;

    public SocketRunable(Socket socket){
        this.socket = socket;
    }

    @Override
    public void run() {
        InputStream inputStream = null;
        OutputStream outputStream = null;
        DataInputStream dataInputStream = null;
        DataOutputStream dataOutputStream = null;
        String message = null;
        Scanner scanner = new Scanner(System.in);

        try {
            //让socket一直保持工作状态不然读写一次结束了服务自己就停止了
            while(true){
                //读
                System.out.println("客户端:");
                inputStream = socket.getInputStream();
                //通过数据流处理输入流。因为可以直接用UTF-8的形式直接拿到
                dataInputStream = new DataInputStream(inputStream);
                message = dataInputStream.readUTF();
                System.out.println(message);

                // 写
                System.out.println("服务端:");
                message = scanner.next();
                outputStream = socket.getOutputStream();
                dataOutputStream = new DataOutputStream(outputStream);
                dataOutputStream.writeUTF(message);
            }

        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }
}

客户端

package com.gosang;

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

/**
 * @Author: gosang
 * @DateTime: 2020/5/16 23:41
 * @Description: TODO
 */
public class Client {
    public static void main(String[] args) {
        InputStream inputStream = null;
        OutputStream outputStream = null;
        DataInputStream dataInputStream = null;
        DataOutputStream dataOutputStream = null;
        Scanner scanner = new Scanner(System.in);
        String message = null;
        Socket socket = null;

        try {
            //让socket一直保持工作状态不然读写一次结束了服务自己就停止了
            while(true){
                //设置此socket要访问的服务器的ip+端口
                socket = new Socket("127.0.0.1",8080);
                //写
                System.out.println("客户端:");
                message = scanner.next();
                outputStream = socket.getOutputStream();
                dataOutputStream = new DataOutputStream(outputStream);
                dataOutputStream.writeUTF(message);

                //读
                System.out.println("服务端:");
                inputStream = socket.getInputStream();
                dataInputStream = new DataInputStream(inputStream);
                message = dataInputStream.readUTF();
                System.out.println(message);
            }


        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }


    }
}