Android一个线程内连接多个tcp服务端

来源:互联网 发布:python 爬虫 股票数据 编辑:程序博客网 时间:2024/05/21 15:44

通常情况下我们客户端开启tcp去连接服务器都是一个连接一个线程;这样写代码也是比较easy的

public class SocketTcpClient implements Runnable {    private final String ip;    private Socket socket;    public SocketTcpClient(String ip) {        this.context = context;        this.ip = ip;    }    @Override    public void run() {        try {            socket = new Socket(ip, 5246);            OutputStream out = socket.getOutputStream();            out.write("Hello World".getBytes());            while (true) {                InputStream in = socket.getInputStream();                byte[] buff = new byte[1024];                int length = in.read(buff);                //收到的数据                String data = new String(buff, 0, length);            }        } catch (Exception e) {            e.printStackTrace();    }}

使用就只需要启动这个线程即可,这样就可以一直接收服务器端发送过来的数据了。如果你有多个服务器需要连接的话只需要在外面套一个for循环就可以了;
这样如果连接太多,new 了太多线程这样就很浪费资源了。

   new Thread(new SocketTcpClient("192.168.0.252")).start();

现在就回到我们这篇文章需要讲的一个线程连接多个tcp,只需要对客户端修改下即可

public class SocketTcpClient {    private Socket socket;    private byte[] buff = new byte[1024];    SocketTcpClient(String ip, int port) {        try {            //首先创建 tcp 连接            socket = new Socket(ip, port);            OutputStream out = socket.getOutputStream();            out.write("Hello World".getBytes());        } catch (IOException e) {            e.printStackTrace();        }    }    /**     * 循环接数据     */    public void run() {        try {            InputStream in = socket.getInputStream();            int length = in.read(buff);            String data = new String(buff, 0, length);            System.out.println(data.replace("\n", ""));        } catch (Exception e) {            e.printStackTrace();        }    }}

使用构造函数,初始化socket tcp连接
编写一个run()函数,获取服务端发送过来的数据
接下来重点就是在启动线程的地方了,持续接收数据

使用一个线程启动多个tcp客户端

public class Test {    public static int port1 = 8271;    public static int port2 = 8272;    public static int port3 = 8273;    public static List<SocketTcpClient> clients = new ArrayList<>();    public static void main(String[] args) {        //模拟三台服务器        new Thread(new SocketTcpServer(port1)).start();        new Thread(new SocketTcpServer(port2)).start();        new Thread(new SocketTcpServer(port3)).start();        //客户端开启一个线程 连接三个tcp服务端        new Thread(() -> {            //开启三个客户端 建立三个tcp连接            clients.add(new SocketTcpClient("127.0.0.1", port1));            clients.add(new SocketTcpClient("127.0.0.1", port2));            clients.add(new SocketTcpClient("127.0.0.1", port3));            while (true) {                for (SocketTcpClient client : clients) {                    client.run();                }            }        }).start();    }}

这样子可以暂时实现,但是如果连接太多的话还是会有问题的;此时你就需要使用到java non-blocking IO(NIO)了 。

Demo下载

阅读全文
'); })();
1 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 广州市第八人民医院 广州市邮编 广州市邮政编码 广州市公共资源交易中心 广州市儿童公园 广州市个人摇号查询 广州市公共资源交易中心网站 广州市网上车辆管理所 广州市公共资源交易 广州市人口 广州市中小学教师继续教育 广州市图片 广州市医药 广州市入户 广州市康复中心 广州市几个区 广州市哪个省 广州市面积 广州市沙河 广州市的医院 广州市业余大学 广州市番禺长隆酒店 广州希诺酒店 广州58 广州563 58广州 买房 广州 广州房屋 广州房地产公司排名 广州地产公司排名 广州购房条件 广州房地产信息网 广州房产论坛 广州市学位房 广州经济适用房价格 房王网广州 广州学位房 增城房 广州护墙板批发 拣宝王 广州好