Socket的简单通信

424 查看


前言

这篇文章只是简单的介绍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<Socket> 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/Socket