模拟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包。自己弄下

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