• 基于TCP协议的socket通信


    基于TCP协议Socket服务端和客户端的通信模型:

                                            

    Socket通信步骤:

      1.建立服务端ServerSocket和客户端Socket

      2.打开连接到Socket的输出输入流

      3.按照协议进行读写操作

      4.关闭相对应的资源

    多线程服务器

    多线程用来实现 服务器与多客户端之间的通信

    基本步骤

      1 服务器创建serverSocket,循环调用accept()等待客户端连接

      2 客户端创建一个scoket并请求和服务器端连接

      3 服务器端接收客户端请求,创建socket与该客户建立专线连接

      4 建立连接的连个socket在一个单独的线程上对话

      5 服务器继续等待新的连接

    客户端

     1 package com.socket;
     2 
     3 import java.io.BufferedReader;
     4 import java.io.InputStream;
     5 import java.io.InputStreamReader;
     6 import java.io.OutputStream;
     7 import java.io.PrintWriter;
     8 import java.net.Socket;
     9 
    10 public class Client {
    11 
    12     /**
    13      * 基于TCP协议的socket通信
    14      * 客户端
    15      * @return
    16      */
    17     public static void main(String[] args) {
    18         
    19         try {
    20             //指定服务地址和端口号
    21             Socket socket=new Socket("localhost", 8888);
    22             //2.获取输出流,向服务器端发送信息     字节流
    23             OutputStream op = socket.getOutputStream();
    24             //将输出流包装为打印流
    25             PrintWriter ps = new PrintWriter(op);
    26             ps.write("用户名 client 密码 123 ");
    27             ps.flush();
    28             //关闭输出流
    29             socket.shutdownOutput();
    30             
    31             //从服务器获取输入流
    32             InputStream is = socket.getInputStream();
    33             BufferedReader bf = new BufferedReader(new InputStreamReader(is));
    34             String info = null;
    35             
    36             while((info=bf.readLine())!=null){
    37                 System.out.println("服务器说"+info);
    38             }
    39             
    40             //关闭资源
    41             socket.close();
    42         } catch (Exception e) {
    43             // TODO Auto-generated catch block
    44             e.printStackTrace();
    45         }
    46     }
    47 
    48 }

    服务器端

     1 package com.socket;
     2 
     3 
     4 import java.io.IOException;
     5 import java.net.InetAddress;
     6 import java.net.ServerSocket;
     7 import java.net.Socket;
     8 
     9 public class Server {
    10 
    11     /**
    12      * 基于TCP协议的Socket编程
    13      *     服务器端
    14      * @return
    15      */
    16     public static void main(String[] args) {
    17         
    18         int count = 0;
    19         try {
    20             //1.创建一个服务器端Socket,即ServerSocket,指定绑定的端口,并监听此端口
    21             ServerSocket serverSocket = new ServerSocket(8888);
    22             //循环监听客户端连接
    23             while(true){
    24                 // 调用accept()方法开始监听,等待客户端的连接
    25                 Socket     socket=serverSocket.accept();
    26                 SocketThread st = new SocketThread(socket);
    27                 
    28                 st.start();
    29                 count++;
    30                 System.out.println("当前客户数量: "+count);
    31                 
    32                 InetAddress address=socket.getInetAddress();
    33                 
    34                 System.out.println("当前客户端ip"+address);
    35             }
    36             
    37             
    38         } catch (IOException e) {
    39             
    40             e.printStackTrace();
    41         }
    42         
    43         
    44     }
    45 
    46 }

    服务器端线程类

     1 package com.socket;
     2 
     3 import java.io.BufferedReader;
     4 import java.io.IOException;
     5 import java.io.InputStream;
     6 import java.io.InputStreamReader;
     7 import java.io.OutputStream;
     8 import java.io.PrintWriter;
     9 import java.net.Socket;
    10 
    11 public class SocketThread extends Thread {
    12 
    13     /**
    14      * 循环接收客户端线程
    15      * 
    16      * @return
    17      */
    18     // 和本线程相关的Socket
    19     Socket socket = null;
    20     public SocketThread(Socket socket) {
    21         this.socket = socket;
    22     }
    23 
    24     @Override
    25     public void run() {
    26 
    27         InputStream is = null;
    28         OutputStream os = null;
    29         BufferedReader bs = null;
    30         PrintWriter pw = null;
    31         try {
    32             is = socket.getInputStream();
    33 
    34             bs = new BufferedReader(new InputStreamReader(is));
    35             String info = null;
    36             while ((info = bs.readLine()) != null) {
    37 
    38                 System.out.println("我是服务器    客户端 说 " + info);
    39             }
    40             socket.shutdownInput();
    41 
    42             // 相应客户端信息
    43             os = socket.getOutputStream();
    44             pw = new PrintWriter(os);
    45             pw.print("你好,欢迎登陆");
    46             pw.flush();
    47         } catch (IOException e) {
    48             // TODO Auto-generated catch block
    49             e.printStackTrace();
    50         } finally {
    51 
    52             try {
    53                 if (os != null)
    54                     os.close();
    55                 if (is != null)
    56                     is.close();
    57                 if (bs != null)
    58                     bs.close();
    59                 if (pw != null)
    60                     pw.close();
    61                 if (socket != null)
    62                     socket.close();
    63             } catch (IOException e) {
    64                 // TODO Auto-generated catch block
    65                 e.printStackTrace();
    66             }
    67 
    68         }
    69     }
    70 
    71 }
  • 相关阅读:
    关于Cocos2d-x开发一个游戏的过程自述
    关于JDK环境变量的配置问题
    lnmp、lamp、lnmpa一键安装包(Updated: 2015-10-25)
    成大事者必备的九种能力、九种手段、九种心态
    燕十八mysql笔记
    cmake 安装 mysql5.5 版本
    IOS 中微信 网页授权报 key[也就是code]失效 解决办法
    js 复制 功能
    php 二维数组排序
    php获取前一天,前一个月,前一年的时间
  • 原文地址:https://www.cnblogs.com/cmyxn/p/5848343.html
Copyright © 2020-2023  润新知