zoukankan      html  css  js  c++  java
  • Socket实现一个简单的半双工通信

    Socket是client进行在网络与server进行数据交互的一种基本通信方式。通信有三种通信。即单工。半双工,和全双工。
    所谓单工,就是仅仅可以进行单向通信,如bb机。
    而半双工就是一来一回的通信方式,如对讲机。


    全双工也是最经常使用的,就是现实长连接实时通信。如QQ。
    假设理解了上面的三个工作方式,那以下就以半双工为例,分析一下其工作的流程:
    首先:在server端建立一个监听端口,没有多么复杂,就相当于一个等待连接的东西。


    第二步:这时候,假设在client的话,要想去连接上面的server。就要去用相应的方法发送一个请求。意思是让server把这个端口打开,建立通信。
    第三步:server接受到client发送的请求,会建立连接。这个很重要,真正意义上的通信也就開始了。
    第四步:上面的连接完毕之后,客服端開始向server端发送相应的数据信息。


    第五步:server接收到数据。
    第六步:接收到数据之后,进行处理。返回结果。
    第七步:客服端接收到结果信息。

    总而言之,上面的步骤依照我的总结就是:
    连接——–发送数据——-接收数据——处理——返回数据—–client接收—————循环下去。

    以下是一个实现半双工的简单实例:
    server端:

    package test1;
    import java.io.BufferedReader;
    import java.io.FileReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.PrintWriter;
    import java.net.*;
    public class Server1 {
    
        /**
         * @param args
         */
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            Server1 ms1=new Server1();
    
        }
        public Server1(){
            try {
    //          实例化
                ServerSocket p1=new ServerSocket(9999);
    //          等待接收一个连接
                Socket s=p1.accept();//返回一个socket连接
    //          接收数据
                InputStreamReader isr=new InputStreamReader(s.getInputStream());
                BufferedReader br=new BufferedReader(isr);
                String info=br.readLine();
                System.out.println("server接收到:"+info);
    //          server返回数据向client发送
                PrintWriter pw=new PrintWriter(s.getOutputStream(),true);
                pw.println("这是server返回的数据");
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    
    }
    

    client:

    package test1;
    import java.io.*;
    import java.net.Socket;
    import java.net.UnknownHostException;
    
    public class Client1 {
    
        /**
         * @param args
         */
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            Client1 p2=new Client1();
        }
        public Client1(){
            try {
    //          连接某一个server端ip/端口号
                Socket s=new Socket("127.0.0.1",9999);
    //          发送数据,true是即时刷新
                PrintWriter pw=new PrintWriter(s.getOutputStream(),true);
                pw.println("这是client发送的数据");
    //          client接收到返回的数据
                InputStreamReader isr=new InputStreamReader(s.getInputStream());
                BufferedReader br=new BufferedReader(isr);
                String response=br.readLine();
                System.out.println("client收到"+response);
            } catch (UnknownHostException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
    
  • 相关阅读:
    tkinter_战队数据查询系统
    python_tkinter组件
    python_tkinter基本属性
    python_tkinter组件摆放方式
    python_推导式
    python_装饰器
    python_模块1
    python_生成随机验证码
    linux基础_使用指令3
    linux部署django项目流程(全)
  • 原文地址:https://www.cnblogs.com/zhchoutai/p/8452468.html
Copyright © 2011-2022 走看看