Java Socket笔记-利用tcp socket搭建CS模型

36 篇文章 1 订阅

目录

 

基本概念

代码与实例


 

基本概念

这里采用的是TCP模型,只说明一点,在Java中有

import java.net.Socket;

这个包中TCP的用法个人觉得和QTcpSocket差不多(个人觉得QTcpSocket好用点,可能是自己习惯问题)

这里用控制台输入,输出可以采用这样的方式!

首先构造一个输入流:

InputStream in = System.in;
BufferedReader input = new BufferedReader(new InputStreamReader(in));

得到socket的输入流

InputStream inputStream = client.getInputStream();
BufferedReader socketBufferedReader = new BufferedReader(new InputStreamReader(inputStream));

然后从键盘输入就可以直接发送了!

String str = input.readLine();
socketPrintStream.println(str);

这样的话,就要从键盘输入,然后再发送了!

 

代码与实例

程序运行截图如下

服务器端:

客户端:

源码如下:

Client.java

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

public class Client {

    public static void main(String[] args) throws IOException{

        Socket socket = new Socket();
        socket.setSoTimeout(3000);

        //连接本地, 端口 2000, 超时时间3000ms
        socket.connect(new InetSocketAddress(Inet4Address.getLocalHost(), 2000), 3000);

        System.out.println("已发起服务器连接,并进入后续流程!");
        System.out.println("客户端信息:" + socket.getLocalAddress() + " p:" + socket.getLocalPort());
        System.out.println("服务器信息:" + socket.getInetAddress() + " p:" + socket.getPort());

        try{

            todo(socket);
        }
        catch (Exception e){

            System.out.println("异常关闭");
        }

        //释放资源
        socket.close();
        System.out.println("客户端已退出!");
    }

    private static void todo(Socket client) throws IOException{


        //得到socket输出流,并转换为打印流
        OutputStream outputStream = client.getOutputStream();
        PrintStream socketPrintStream = new PrintStream(outputStream);

        //构建键盘输入流
        InputStream inputStream = client.getInputStream();
        InputStream in = System.in;
        BufferedReader input = new BufferedReader(new InputStreamReader(in));
        BufferedReader socketBufferedReader = new BufferedReader(new InputStreamReader(inputStream));

        boolean flag = true;
        do{

            //键盘读取一行
            String str = input.readLine();

            //发送到服务器
            socketPrintStream.println(str);

            //从服务器读取一行
            String echo = socketBufferedReader.readLine();
            if("bye".equalsIgnoreCase(echo)){

                flag = false;
            }
            else{

                System.out.println(echo);
            }

        }
        while (flag);

        //资源释放
        socketPrintStream.close();
        socketBufferedReader.close();
    }
}

Server.java

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
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() + " P:" + server.getLocalPort());

        //等待服务器连接
        server.accept();

        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{

                //得到打印流,用于数据输出;服务器会送数据使用
                PrintStream socketOutput = new PrintStream(socket.getOutputStream());
                //得到输入流,用于接收数据
                BufferedReader socketInput = new BufferedReader(new InputStreamReader(socket.getInputStream()));

                do{

                    //客户端拿到一条数据
                    String str = socketInput.readLine();
                    if("bye".equalsIgnoreCase(str)){

                        flag = false;
                        //回送
                        socketOutput.println("bye");
                    }
                    else{

                        //打印到屏幕,并回送数据长度
                        System.out.println(str);
                        socketOutput.println("回送:" + str.length());
                    }
                }
                while (flag);

                socketInput.close();
                socketOutput.close();

            }
            catch (Exception e){

                System.out.println("连接异常断开!");
            }finally {

                //关闭连接
                try{
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            System.out.println("客户端已退出:" + socket.getInetAddress() + " P:" + socket.getPort());
        }
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT1995

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值