Tcp简单连接

88 阅读1分钟

1.客户端程序

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

public class Client {
    public static void main(String[] args) throws IOException {
        Socket socket = new Socket();
        //超时时间
        socket.setSoTimeout(3000);
        socket.connect(new InetSocketAddress(Inet4Address.getLocalHost(), 2000), 3000);
        System.out.println("发起链接");
        System.out.println("客户端信息" + socket.getLocalAddress() + "port:" + socket.getLocalPort());
        System.out.println("服务器端信息" + socket.getInetAddress() + "port" + socket.getPort());
        try {
            //发送接受数据
            todo(socket);
        } catch (IOException e) {
            System.out.println(e);
        }
        socket.close();
        System.out.println("客户端退出");

    }

    private static void todo(Socket client) throws IOException {
        //构建键盘输入流
        InputStream stream = System.in;
        BufferedReader reader = new BufferedReader(new InputStreamReader(stream));
        //得到client的输出流,并转换为打印流
        OutputStream outputStream = client.getOutputStream();
        PrintStream printStream = new PrintStream(outputStream);

        //得到socket输入流
        InputStream inputStream = client.getInputStream();
        BufferedReader socketBuffReader = new BufferedReader(new InputStreamReader(inputStream));

        boolean flag = true;
        do {
            //键盘读取
            String line = reader.readLine();
            //发送数据
            printStream.println(line);

            //从服务器读取一行
            String echo = socketBuffReader.readLine();
            if ("bye".equalsIgnoreCase(echo)) {
                flag = false;
            } else {
                System.out.println(echo);
            }
        } while (flag);
        reader.close();
        socketBuffReader.close();
    }
}

2.服务端程序

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

public class Server {
    public static void main(String[] args) throws IOException {
        ServerSocket server = new ServerSocket(2000);

        System.out.println("服务器准备就绪");
        System.out.println("客户端信息" + server.getInetAddress() + "port:" + server.getLocalPort());
        //等待客户端链接
        for(;;){
            Socket client =server.accept();
            ClientHandler clientHandler = new ClientHandler(client);
            clientHandler.start();
        }
    }

    private static class ClientHandler extends Thread {
        private Socket socket;
        private boolean flag = true;

        ClientHandler(Socket socket) {
            this.socket = socket;
        }

        @Override
        public void run() {
            super.run();
            System.out.println("新客户端链接"+socket.getInetAddress()+"p:"+socket.getPort());
            try {
                //得到打印流,用于数据输出;服务器回送数据
                OutputStream outputStream = socket.getOutputStream();
                PrintStream printStream = new PrintStream(outputStream);

                BufferedReader socketInput=new BufferedReader(new InputStreamReader(socket.getInputStream()));

                do {
                    String str = socketInput.readLine();
                    if ("bye".equalsIgnoreCase(str)){
                        flag=false;
                    }else {
                        System.out.println(str);
                        printStream.println("回送"+str.length());
                    }
                }while (flag);
                socketInput.close();
                printStream.close();
            }catch (Exception e){
                System.out.println("链接异常断开");
            }finally {
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            System.out.println("客户端已退出");
        }
    }
}

3.先启动服务端程序,然后再启动客户端程序,在客户端控制台输入发送的数据,服务器收到客户端信息,并返回该发送数据的字符串长度