服务端:

  • 1.用指定的端口实例化一个ServerSocket对象。
  • 2.调用ServerSocket的accept()方法,以等待连接,并阻塞。
  • 3.利用accept()方法返回的Socket对象,进行IO读写操作。
  • 4.关闭流,回收资源。

代码实现:

/**
     * 基于TCP协议的Socket通信,实现用户登录,服务端
     */
    //1、创建一个服务器端Socket,即ServerSocket,指定绑定的端口,并监听此端口
    ServerSocket serverSocket =newServerSocket(10050);//1024-65535的某个端口
    //2、调用accept()方法开始监听,等待客户端的连接
    Socket socket = serverSocket.accept();
    //3、获取输入流,并读取客户端信息
    InputStream is = socket.getInputStream();
    InputStreamReader isr =newInputStreamReader(is);
    BufferedReader br =newBufferedReader(isr);
    String info =null;
    while((info=br.readLine())!=null){
     Log.d("MainActivity",Hello,我是服务器,客户端说:"+info);
    }
    socket.shutdownInput();//关闭输入流
    //4、获取输出流,响应客户端的请求
    OutputStream os = socket.getOutputStream();
    PrintWriter pw = new PrintWriter(os);
    pw.write("Hello World!");
    pw.flush();
  
    //5、关闭资源
    pw.close();
    os.close();
    br.close();
    isr.close();
    is.close();
    socket.close();
    serverSocket.close();

客户端:

  • 1.用服务端的IP地址和端口实例化Socket对象。
  • 2.调用connect方法,连接服务器。
  • 3.获得Socket上的流,把流封装进BufferedReader/PrintWriter的实例,以进行读写。
  • 4.利用Socket提供的getInputStream和getOutputStream方法,通过IO流对象,向服务器发送数据流。
  • 5.关闭流,回收资源。

代码实现:

try {
                Socket socket = new Socket();
                socket.connect(new InetSocketAddress("ip地址", 10050), 1000);

                //获取输入输出流
                OutputStream ou = socket.getOutputStream();
                //获取输出输出流
                BufferedReader bff = new BufferedReader(new InputStreamReader(
                        socket.getInputStream()));
                //向服务器发送信息
                ou.write(content.getBytes("utf-8"));
                ou.flush();

                //读取发来服务器信息
                String result = "";
                String buffer = "";
                while ((buffer = bff.readLine()) != null) {
                    result = result + buffer;
                }
                msg.obj = result.toString();
                //发送消息 修改UI线程中的组件
                myHandler.sendMessage(msg);
                //关闭各种输入输出流
                bff.close();
                ou.close();
                socket.close();
            } catch (SocketTimeoutException aa) {
                //连接超时 在UI界面显示消息
                msg.obj =  "服务器连接失败!请检查网络是否打开";
                //发送消息 修改UI线程中的组件
                myHandler.sendMessage(msg);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

获取本地Ip的方法:

public static String getIPAddress(Context context) {
        NetworkInfo info = ((ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE)).getActiveNetworkInfo();
        if (info != null && info.isConnected()) {
            if (info.getType() == ConnectivityManager.TYPE_MOBILE) {//当前使用2G/3G/4G网络
                try {
                    //Enumeration<NetworkInterface> en=NetworkInterface.getNetworkInterfaces();
                    for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements(); ) {
                        NetworkInterface intf = en.nextElement();
                        for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements(); ) {
                            InetAddress inetAddress = enumIpAddr.nextElement();
                            if (!inetAddress.isLoopbackAddress() && inetAddress instanceof Inet4Address) {
                                return inetAddress.getHostAddress();
                            }
                        }
                    }
                } catch (SocketException e) {
                    e.printStackTrace();
                }
 
            } else if (info.getType() == ConnectivityManager.TYPE_WIFI) {//当前使用无线网络
                WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
                WifiInfo wifiInfo = wifiManager.getConnectionInfo();
                String ipAddress = intIP2StringIP(wifiInfo.getIpAddress());//得到IPV4地址
                return ipAddress;
            }
        } else {
            //当前无网络连接,请在设置中打开网络
        }
        return null;
    }
 
    /**
     * 将得到的int类型的IP转换为String类型
     * @param ip
     * @return
     */
    public static String intIP2StringIP(int ip) {
        return (ip & 0xFF) + "." +
                ((ip >> 8) & 0xFF) + "." +
                ((ip >> 16) & 0xFF) + "." +
                (ip >> 24 & 0xFF);
    }

服务端多线程实现:

  • 1.服务器端创建ServerSocket,循环调用accept()等待客户端连接。
  • 2.客户端创建一个socket并请求和服务器端连接。
  • 3.服务器端接受客户端请求,创建socket与该客户建立专线连接。
  • 4.建立连接的两个socket在一个单独的线程上对话。
  • 5.服务器端继续等待新的连接。

代码实现:

public class ServerThread extends Thread{
    private Socket socket;

    //在构造中得到要单独会话的socket
    public ServerThread(Socket socket) {
        this.socket = socket;
    }
    
    @Override
    public void run() {
        super.run();
        InputStreamReader reader = null;
        BufferedReader bufReader = null;
        OutputStream os = null; 
        try {
            reader = new InputStreamReader(socket.getInputStream());
            bufReader = new BufferedReader(reader);
            String s = null;
            StringBuffer sb = new StringBuffer();
            while((s = bufReader.readLine()) != null){
                sb.append(s);
            }
            Log.d("MainActivity","服务器:"+sb.toString());
            //关闭输入流
            socket.shutdownInput();
            
            //返回给客户端数据
            os = socket.getOutputStream();
            os.write(("我是服务端,客户端发给我的数据就是:"+sb.toString()).getBytes());
            os.flush();
            socket.shutdownOutput();
        } catch (IOException e2) {
            e2.printStackTrace();
        } finally{//关闭IO资源
            if(reader != null){
                try {
                    reader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            
            if(bufReader != null){
                try {
                    bufReader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(os != null){
                try {
                    os.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }  
    }
    
}
//服务器线程处理 和本线程相关的socket
   Socket socket =null;
   ServerSocket serverSocket =new ServerSocket(10086);
   Socket socket =null;
   int count =0;//记录客户端的数量
   while(true){
     socket = serverScoket.accept();
     ServerThread serverThread =new ServerThread(socket);
     serverThread.start();
     count++;
     Log.d("MainActivity","客户端连接的数量:"+count);
 }