资讯专栏INFORMATION COLUMN

Socket的简单通信

Atom / 2958人阅读

摘要:前言这篇文章只是简单的介绍通信,是一篇入门文章。首先一句话简单的介绍网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个。通信客户端的通信与服务端类似,获取输入流,读取服务器发来的消息,并显示到界面中。

前言

这篇文章只是简单的介绍Socket通信,是一篇入门文章。所有还没有接触,但又想了解的可以参考下。希望对你们有所帮助。

Socket

首先一句话简单的介绍Socket:网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket
所有我们下面要建立一个服务端与客户端的通信。

嘿嘿,其实上面的那句话是百度百科的,不知道你们发现了没有
服务端

这里我们只要新建了个简单的Java类,只是实现开启后等到客户端的连接。

实例化ServerSocket

绑定通信端口,最好端口设大点,防止端口被占用

                    java.net.ServerSocket serverSocket = new java.net.ServerSocket(30000);
等待连接

我们这里设计了死循环,只要开启了就一直等待客户端的连接请求

while (true) {
                        //接收连接请求
                        Socket s = serverSocket.accept();
                        list.add(s);
                        //为每一个连接开启一个的线程
                        new Thread(new ServiceRunnable(s)).start();
                    }

因为我实现的是在多线程下得通信,所有将每个Socket加入到List中并且为每一个连接的Socket开启一个多带带的线程。

通信

如何客户端发来的消息,我们就向每一个连接的Socket发送该消息,所有首先要获取输入流

            br = new BufferedReader(new InputStreamReader(s.getInputStream(), "utf-8"));

读取数据

        public String readContent() {
            try {
                return br.readLine();
            } catch (IOException e) {
                list.remove(s);
                e.printStackTrace();
            }
            return null;
        }

获取输出流发送消息

while ((content = readContent()) != null) {
                //遍历所有连接了的Socket,向所有客户端Socket发送消息
                for (Iterator it = list.iterator(); it.hasNext(); ) {
                    Socket socket = it.next();
                    try {
                        pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
                        pw.println(content);
                    } catch (IOException e) {
                        it.remove();
                        e.printStackTrace();
                    }
                }
            }

服务端这样就可以了,下面是客户端

客户端

客户端布局只要实现一个简单的发送界面,这里就不多说了。直接说Socket

建立连接

指定服务主机名或IP地址与连接的端口号,应为是本地服务器所有这里直接使用本地IP地址。

socket = new Socket("192.168.56.1", 30000);
通信

客户端的通信与服务端类似,获取输入流,读取服务器发来的消息,并显示到界面中。

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

                new Thread(new Runnable() {
                    String line;

                    @Override
                    public void run() {
                        try {
                            //读取服务端发来的消息
                            while ((line = br.readLine()) != null) {
                                Message message = new Message();
                                message.what = 1;
                                message.obj = line;
                                handler.sendMessage(message);
                            }
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }).start();                

点击发送,获取输出流向服务器发送消息

    @Override
    public void onClick(View v) {
        Message message = new Message();
        message.what = 2;
        message.obj = et.getText().toString();
        clientThread.clientHandler.sendMessage(message);
        et.setText("");
    }
clientHandler = new Handler(Looper.getMainLooper()) {
                    @Override
                    public void handleMessage(Message msg) {
                        if (msg.what == 2) {
                            try {
                                //向服务端发送消息
                                pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
                                pw.println(msg.obj);
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                        }
                    }
                };

到此整个的Socket通信就基本上完成了。

总结

通过上面的示例使用Socket实现通信,主要分为三步

实例化Socket,建立连接

获取输入流,读取数据

获取输出流,发送数据

当然这只是一个简单的例子,带领我们入门而已。有兴趣的可以借助下面的Demo学习。

Demo地址:https://github.com/idisfkj/So...

关注

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/65977.html

相关文章

  • Socket 通信原理

    摘要:什么是的中文翻译过来就是套接字。套接字是什么,我们先来看看它的英文含义插座。服务端过程咱再来聊聊服务端的过程,服务端先初始化,建立流式套接字,与本机地址及端口进行绑定,然后通知,准备好接收连接,调用阻塞,等待来自客户端的连接。 什么是 Socket? Socket 的中文翻译过来就是套接字。套接字是什么,我们先来看看它的英文含义:插座。 Socket 就像一个电话插座,负责连通两端的电...

    Michael_Lin 评论0 收藏0
  • 你不知道WebSocket吗?

    摘要:什么是是一种在单个连接上进行全双工通信的协议。短轮询配段代码,静态服务中间件用来返回静态文件当前价格是元获取最新价格接口客户端不停的发送请求,去服务端获取最新价格。它通过连接到一个服务器,以格式接收事件不关闭连接。 什么是WebSocket? WebSocket是一种在单个TCP连接上进行全双工通信的协议。这里我们发现了一个有趣的词:全双工,那我们就来简单了解下通信方式有哪些! 单工 ...

    techstay 评论0 收藏0
  • 你不知道WebSocket吗?

    摘要:什么是是一种在单个连接上进行全双工通信的协议。短轮询配段代码,静态服务中间件用来返回静态文件当前价格是元获取最新价格接口客户端不停的发送请求,去服务端获取最新价格。它通过连接到一个服务器,以格式接收事件不关闭连接。 什么是WebSocket? WebSocket是一种在单个TCP连接上进行全双工通信的协议。这里我们发现了一个有趣的词:全双工,那我们就来简单了解下通信方式有哪些! 单工 ...

    remcarpediem 评论0 收藏0
  • python网络编程

    摘要:在任何类型的通信开始之前,网络应用程序必须创建套接字。基于文件的套接字,家族名又名基于网络的套接字,家族名在和后续的版本中,支持的套接字有,,,。中的网络编程在中主要是用模块来实现基于套接字的网络通信。 python学习记录--网络编程 1、套接字介绍 一台机器上的不同进程之间进行通信可以利用队列,管道等,但是不同机器之间的进程进行通信用队列是不行的,解决这个问题就是网络套接字。 套接...

    xuhong 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<