模擬tcp服務

跟別人的其實沒什麼區別,只是自己寫的,自己記錄一下。還有就是粘包到底怎麼處理呢,誰寫了代碼希望跟我說下,求學習,我一直沒弄懂,中間什麼轉換爲固定長度啥的……

package com.study.tcp;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
import com.alibaba.fastjson.JSON;
public class ClientTcp {
	
	public static void main(String[] args) throws UnknownHostException, IOException{
		
    	// 獲取用戶的輸入,當輸入內容爲“輸入停止” 時結束。
 		Scanner scanner = new Scanner(System.in);
 		
 		while(true) {
 			System.out.println("請編輯併發送消息……");
 			System.out.println("");
 			String scannerStr = "";
 			if(scanner.hasNextLine()) {
 				scannerStr = scanner.nextLine();
 			}
 			
 			// 給服務端發送的Map
 			Map<String, Object> outmap = new HashMap<String, Object>();
 			outmap.put("word", scannerStr);
 			
 			// 把map轉換爲json字符串
 			String outStr = JSON.toJSONString(outmap);
 			
 			//創建客戶端,指定客戶端的ip地址和端口號
 	        Socket socket = new Socket("127.0.0.1",8888);
 	        
 		    //獲取網絡字節輸出流,準備向服務器寫數據
 		    OutputStream os = socket.getOutputStream();
 			
 			// 需要發送的字符串
// 			String outStr = "服務器,你好:" + scannerStr;
 			//向服務器寫數據
 		    os.write(outStr.getBytes());
 		    
 		    //獲取網絡字節輸入流,準別讀物服務器返回的數據
 		    InputStream is = socket.getInputStream();
 		    
 		    //讀取服務器返回的數據
 		    byte[] bytes = new byte[1024];
 		    int len = is.read(bytes);
 		    
 		    String serverStr = new String(bytes,0,len);
 		    System.out.println("返回的字符串爲:" + new String(bytes,0,len));
 		    @SuppressWarnings("unchecked")
			Map<String, Object> map2 = JSON.parseObject(serverStr, Map.class);
 		    
 		    System.out.println("處理結果爲:" + map2.get("result"));
 		    System.out.println("處理時間爲:" + map2.get("datatime"));
 		    
 		    //釋放資源
 		    socket.close();
 		    
 		   if("輸入停止".equals(scannerStr)) {
				scanner.close();
				return;
			}
 		}
	    
	}

}
package com.study.tcp;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import com.alibaba.fastjson.JSON;

public class ServeTcp {
	
	public static void main(String[] args) throws UnknownHostException, IOException {
		System.out.println("===== 服務端開始   =====");
		//創建服務器
        ServerSocket server = new ServerSocket(8888);
        
        while(true) {
        	//監聽到發送數據的客戶端
            Socket scoket = server.accept();
    	    //創建網絡字節輸入流,讀取客戶端發送的數據
    	    InputStream is = scoket.getInputStream();
    	    //讀取客戶端發送的數據
    	    byte[] bytes = new byte[1024];
    	    int len = is.read(bytes);
    	    // 接受到的客戶端字符串
    	    String clientStr = new String(bytes,0,len);
    	    
    	    System.out.println(clientStr);
    	    
    	    // 把客戶端傳過來的數據解析
    	    @SuppressWarnings("unchecked")
			Map<String, Object> clientMap = JSON.parseObject(clientStr, Map.class);
 		    
    	    String neirong = (String) clientMap.get("word");
 		    System.out.println("客戶端傳過來的內容爲:" + neirong);
    	
    	    //獲取網絡字節輸出流,給客戶端寫回數據
    	    OutputStream os = scoket.getOutputStream();
    	    
    	    Map<String, Object> map = new HashMap<String, Object>();
    	    // 處理結果
 			map.put("result", "內容:" + neirong + ",已經處理。");
 			
 			//設置日期格式
 			SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
 			// 處理時間,new Date()爲獲取當前系統時間
 			map.put("datatime", df.format(new Date()));
 			
 			String outStr = JSON.toJSONString(map);
 			
 			os.write(outStr.getBytes());
    	    	
    	    //釋放資源
    	    scoket.close();
    	    // 如果傳來的字符串爲true 則跳出死循環
    	    if("輸入停止".equals(neirong)) {
    	    	server.close();
    		    System.out.println("===== 服務端結束  =====");
    	    	return;
    	    }
    	    
        }
	    
	}

}

額外需要一個fastjson 的jar包。自己弄下

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