美文网首页
Java学习5-socket通信(2)

Java学习5-socket通信(2)

作者: 持之以蘅 | 来源:发表于2019-06-22 21:04 被阅读0次
    • 基于TCP协议的socket通信
    • 目标:了解概念,通信模型,实现socket的步骤,服务端和客户端应该做些什么

    什么是scoket

    • 套接字,用来描述IP地址和端口(上篇已经提到过),通信链的句柄;应用程序通过其向网络发送请求或者应答网络请求;包含进行网络通信所必须的五种信息:连接所是哟个的协议;本机的IP地址;本地远程的协议端口;远地主机的IP地址以及远地进程的协议端口。

    通信模型

    image.png
    实现步骤
    • 创建 server socket 和socket
    • 打开连接到的socket的输入/输出流
    • 按照协议对socket进行读/写操作
    • 关闭输入输出流,以及socket

    服务端设计

    好像找到我要用的地方了,服务端

    步骤
    • 创建server socket对象,绑定监听得端口
    • 调用accept()方法监听客户端的请求
    • 连接建立后,通过输入流读取客户端发送的请求信息
    • 通过输出流向客户端发送响应信息
    • 关闭相关资源
    public class SocketServer {
        public static void main(String[] args) throws IOException {
            //1.创建一个服务器端Socket,即ServerSocket,指定绑定的端口,并监听此端口
            ServerSocket serverSocket = new ServerSocket(12345);
            InetAddress address = InetAddress.getLocalHost();
            String ip = address.getHostAddress();
            Socket socket = null;
            //2.调用accept()等待客户端连接
            System.out.println("~~~服务端已就绪,等待客户端接入~,服务端ip地址: " + ip);
            socket = serverSocket.accept();
            //3.连接后获取输入流,读取客户端信息
            InputStream is=null;
            InputStreamReader isr=null;
            BufferedReader br=null;
            OutputStream os=null;
            PrintWriter pw=null;
            is = socket.getInputStream();     //获取输入流
            isr = new InputStreamReader(is,"UTF-8");
            br = new BufferedReader(isr);
            String info = null;
            while((info=br.readLine())!=null){//循环读取客户端的信息
                System.out.println("客户端发送过来的信息" + info);
            }
            socket.shutdownInput();//关闭输入流
            socket.close();
        }
    }
    
    • 显示有问题
      原因还未找到
      image.png

    客户端设计

    • 创建socket对象,指明需要链接的服务器的地址和端号
    • 链接建立后,通过输出流向服务器发送请求信息
    • 通过输出流获取服务器响应的信息
    • 关闭相关资源
    public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            Button btn_accept = (Button) findViewById(R.id.btn_accept);
            btn_accept.setOnClickListener(this);
        }
    
        @Override
        public void onClick(View v) {
            new Thread() {
                @Override
                public void run() {
                    try {
                        acceptServer();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }.start();
        }
    
        private void acceptServer() throws IOException {
            //1.创建客户端Socket,指定服务器地址和端口
            Socket socket = new Socket("172.16.2.54", 12345);
            //2.获取输出流,向服务器端发送信息
            OutputStream os = socket.getOutputStream();//字节输出流
            PrintWriter pw = new PrintWriter(os);//将输出流包装为打印流
            //获取客户端的IP地址
            InetAddress address = InetAddress.getLocalHost();
            String ip = address.getHostAddress();
            pw.write("客户端:~" + ip + "~ 接入服务器!!");
            pw.flush();
            socket.shutdownOutput();//关闭输出流
            socket.close();
        }
    }
    
    • 结果好像依旧不行先放在这里吧

    相关文章

      网友评论

          本文标题:Java学习5-socket通信(2)

          本文链接:https://www.haomeiwen.com/subject/llnvqctx.html