JAVA SOCKET Server 和 Client

Server端:

  1 import java.io.BufferedInputStream;
  2 import java.io.DataInputStream;
  3 import java.io.IOException;
  4 import java.io.OutputStream;
  5 import java.net.ServerSocket;
  6 import java.net.Socket;
  7 import java.util.ArrayList;
  8 import java.util.List;
  9 
 10 public class Server {
 11  
 12     private static class ClientHandler implements Runnable {
 13         int i=0;
 14  
 15         private Socket socket;
 16  
 17         public ClientHandler(Socket socket) {
 18             this.socket = socket;
 19         }
 20         
 21         @Override
 22         public void run() {
 23             OutputStream os=null;
 24             try {
 25  
 26                 //封装输入流(接收客户端的流)
 27                 BufferedInputStream bis = new BufferedInputStream(
 28                         socket.getInputStream());
 29                 DataInputStream dis = new DataInputStream(bis);
 30                 byte[] bytes = new byte[1]; // 一次读取一个byte
 31                 String ret = "";
 32                 while (dis.read(bytes) != -1) {
 33                     ret += bytesToHexString(bytes) + " ";
 34                     if (dis.available() == 0) { //一个请求
 35                         System.out.println(socket.getRemoteSocketAddress() + ":" + ret);
 36                         ret = "";
 37                         os = socket.getOutputStream();
 38                         if(i<10){
 39                             byte byte2[]={1,2,3,4,5,6,7,8,9,2};
 40                             os.write(byte2);
 41                         }
 42                         if(i>=10&&i<=20){
 43                             byte byte2[]={1,2,3,4,5,6,7,8,9,1};
 44                             os.write(byte2);
 45                         }
 46                         if(i>20&&i<30){
 47                             byte byte2[]={1,2,3,4,5,6,7,8,9,0};
 48                             os.write(byte2);
 49                         }
 50                         if(i>=30&&i<=40){
 51                             byte byte2[]={1,2,3,4,5,6,7,8,9,3};
 52                             os.write(byte2);
 53                         }
 54                         if(i>40){
 55                             byte byte2[]={1,2,3,4,5,6,7,8,9,2};
 56                             os.write(byte2);
 57                         }
 58                             i++;
 59                     }
 60                 }
 61  
 62             } catch (Exception e) {
 63                 e.printStackTrace();
 64             } finally {
 65                 System.out.println("client is over");
 66                 if (socket != null) {
 67                     try {
 68                         socket.close();
 69                     } catch (IOException e) {
 70  
 71                         e.printStackTrace();
 72                     }
 73                 }
 74             }
 75  
 76         }
 77  
 78     }
 79  
 80     public static void main(String[] args) {
 81  
 82         ServerSocket server = null;
 83         try {
 84             server = new ServerSocket(8888);
 85             while (true) {
 86                 System.out.println("listening...");
 87  
 88                 Socket socket = server.accept();
 89                 System.out.println("连接客户端地址:" + socket.getRemoteSocketAddress());
 90                 System.out.println("connected...");
 91                 ClientHandler handler = new ClientHandler(socket);
 92                 Thread t = new Thread(handler);
 93                 t.start();
 94  
 95             }
 96  
 97         } catch (Exception e) {
 98             e.printStackTrace();
 99         } finally {
100  
101             if (server != null) {
102                 try {
103                     server.close();
104                 } catch (IOException e) {
105  
106                     e.printStackTrace();
107                 }
108             }
109         }
110     }
111  
112     /**
113      * byte[]数组转换为16进制的字符串
114      *
115      * @param bytes 要转换的字节数组
116      * @return 转换后的结果
117      */
118     public static String bytesToHexString(byte[] bytes) {
119         StringBuilder sb = new StringBuilder();
120         for (int i = 0; i < bytes.length; i++) {
121             String hex = Integer.toHexString(0xFF & bytes[i]);
122             if (hex.length() == 1) {
123                 sb.append('0');
124             }
125             sb.append(hex);
126         }
127         return sb.toString();
128     }
129  
130 }

Client端:

  1 import java.io.IOException;
  2 import java.io.InputStream;
  3 import java.io.OutputStream;
  4 import java.net.Socket;
  5 
  6 import com.cqjgzx.soft.utils.CommonUtils;
  7 import com.cqjgzx.soft.utils.PropertisUtil;
  8 
  9 public class Client_bak extends Thread {
 10 
 11     //读取配置文件
 12     public static String host = null;
 13     public static int port = 0;
 14     public static String api = null;
 15     //定义一个Socket对象
 16     Socket socket = null;
 17     //初始化判断值
 18     boolean bol1=false;//A
 19     boolean bol2=false;//B
 20     boolean bol3=false;//A+B
 21     /***
 22      * 连接service
 23      * @param host
 24      * @param port
 25      */
 26     public Client_bak(String host, int port) {
 27         try {
 28             //初始化日志
 29             //需要服务器的IP地址和端口号,才能获得正确的Socket对象
 30             socket = new Socket(host, port);
 31             //提示连接成功
 32             System.out.println(host+":"+port+"服务器连接成功!");
 33             //设置超时时间
 34             socket.setSoTimeout(10000);
 35         } catch (Exception e) {
 36             System.out.println("无法连接服务器!");
 37             //e.printStackTrace();
 38         }
 39 
 40     }
 41 
 42     @Override
 43     public void run() {
 44         //客户端一连接就可以写数据个服务器了
 45         new sendMessThread().start();
 46         super.run();
 47         try {
 48             // 读Sock里面的数据
 49             InputStream s = socket.getInputStream();
 50             byte[] buf = new byte[100];
 51             int len = 0;
 52             while ((len = s.read(buf)) != -1) {
 53                 buf=CommonUtils.subBytes(buf, 0, 10);
 54                 //获取到服务器返回的值,此时转为了字符串,但是字符串最后2位才是我们需要的
 55                 String allValueStr=CommonUtils.bytes_String16(buf);
 56                 System.out.println("我是服务器传来的值:"+allValueStr);
 57             }
 58 
 59         } catch (IOException e) {
 60             System.out.println("连接超时!");
 61             //e.printStackTrace();
 62         }
 63     }
 64    
 65     //往Socket里面写数据,需要新开一个线程
 66     class sendMessThread extends Thread{
 67         @Override
 68         public void run() {
 69             super.run();
 70             //写操作
 71             OutputStream os= null;
 72             try {
 73                 os= socket.getOutputStream();
 74                 while(true){
 75                     //保证传递到服务端的数据解析为16进制后为01 02 03 04 05 06 FE 02 00 00 00 04 6D C6
 76                     byte[] bytes = {1,2,3,4,5,6,(byte) 254,2,0,0,0,4,109,(byte) 198};
 77                     os.write(bytes);
 78                     os.flush();
 79                     Thread.sleep(300);
 80                 }
 81             } catch (Exception e) {
 82                 System.out.println("服务器断开了连接!");
 83                 //e.printStackTrace();
 84                 try {
 85                     //每隔5S重启
 86                     Thread.sleep(5000);
 87                     init();
 88                 } catch (Exception e1) {
 89                     //e1.printStackTrace();
 90                 }
 91             }
 92         }
 93     }
 94 
 95     public static void init(){
 96         host = PropertisUtil.getProperties("server_host");
 97         port = Integer.parseInt(PropertisUtil.getProperties("server_port"));
 98         api = PropertisUtil.getProperties("server_api");
 99         //需要服务器的正确的IP地址和端口号
100         Client_bak clientTest=new Client_bak(host, port);
101         clientTest.start();
102     }
103     
104     
105     
106     //函数入口
107     public static void main(String[] args) {
108         init();
109     }
110     
111 }

 

posted @ 2020-05-20 15:26  受伤的芒果  阅读(531)  评论(0)    收藏  举报