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 }

浙公网安备 33010602011771号