java socket通信(數據傳輸)

客戶端:

public class SocketSendUtils {
    
    protected static Logger logger = LoggerFactory.getLogger(HttpHelper.class);
    
    public static JSONObject acceptData(JSONObject json,String str,String addStr) {
        JSONObject obj = null;
        try {
            // 要連接的服務端IP地址和端口
            String host = "127.0.0.1";
            int port = 12345;          //與服務端端口一致
            Socket socket;
                socket = new Socket(host, port);       // 與服務端建立連接
            OutputStream outputStream = socket.getOutputStream();         // 建立連接後獲得輸出流
            String message = "你好  我是客戶端";
            socket.getOutputStream().write(str.getBytes("UTF-8"));
            socket.getOutputStream().write(json.toString().getBytes("UTF-8"));
            socket.shutdownOutput();          //通過shutdownOutput高速服務器已經發送完數據,後續只能接受數據
        
            InputStream inputStream = socket.getInputStream();
            byte[] bytes = new byte[1024];
            int len;
            StringBuilder sb = new StringBuilder();
            while ((len = inputStream.read(bytes)) != -1) {
                    sb.append(new String(bytes, 0, len,"UTF-8"));    //注意指定編碼格式,發送方和接收方一定要統一,建議使用UTF-8
            }
            
        } catch (Exception e1) {
            e1.printStackTrace();
        }
            return obj;
    }
}

 

注:一般客戶端、服務端傳輸數據都是傳一次關閉一次,以下案例是直到傳輸完畢,才關閉連接

服務端:

public class SocketServer {
public static final int PORT = 12345;//監聽的端口號   
    
    public static void main(String[] args) {  
        System.out.println("服務器啓動...\n");  
        SocketServer server = new SocketServer();  
        server.init();  
    }  
  
    public void init() {  
        try {  
            ServerSocket serverSocket = new ServerSocket(PORT);  
            while (true) {  
                Socket client = serverSocket.accept();      // 一旦有堵塞, 則表示服務器與客戶端獲得了連接  
                new HandlerThread(client);              // 處理這次連接  
            }  
        } catch (Exception e) {  
            System.out.println("服務器異常: " + e.getMessage());  
        }  
    }  
  
    private class HandlerThread implements Runnable {  
        private Socket socket;  
        public HandlerThread(Socket client) {  
            socket = client;  
            new Thread(this).start();  
        }  
  
        public void run() {  
            try {  
                InputStream inputStream = socket.getInputStream();
                byte[] bytes = new byte[1024];
                int len;
                StringBuilder sb = new StringBuilder();
                while ((len = inputStream.read(bytes)) != -1) {     //只有當客戶端關閉它的輸出流的時候,服務端才能取得結尾的-1
                    sb.append(new String(bytes, 0, len, "UTF-8"));  // 注意指定編碼格式,發送方和接收方一定要統一,建議使用UTF-8
                }
               System.out.println("客戶端發過來的內容:" + sb.toString());    // 處理客戶端數據  
               OutputStream outputStream = socket.getOutputStream();
               outputStream.close();  
               inputStream.close();
            } catch (Exception e) {  
                System.out.println("服務器 run 異常: " + e.getMessage());  
            } finally {  
                if (socket != null) {  
                    try {  
                        socket.close();  
                    } catch (Exception e) {  
                        socket = null;  
                        System.out.println("服務端 finally 異常:" + e.getMessage());  
                    }  
                }  
            } 
        }  
    } 
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章