Java Socket 示例代码

可变数据长度的示例

Socket 服务端

public class SocketServer {
	
	public static void main(String[] args) throws IOException {
		
		//启动socket服务端
	    ServerSocket server = new ServerSocket(8888);
	    
	    while (true) {
	    	//监听客户端请求
		    Socket socket = server.accept();
		    
		    //实际开发中,应将下面的代码放入到线程中执行。若客户端同时发起多个socket请求时,会发生阻塞
		    
		    //获取客户端请求数据
		    InputStream is = socket.getInputStream();
			ByteArrayOutputStream baos = new ByteArrayOutputStream(4096);
			byte[] buff = new byte[4096];
			int len;
			while ((len = is.read(buff)) != -1) {
				baos.write(buff, 0, len);
			}
			
			//输出请求数据
			System.out.println(baos.toString("utf-8"));
			
			//根据实际业务需求,考虑是否需要响应给客户端
			OutputStream os = socket.getOutputStream();
			os.write("ServerSocket的回复".getBytes("utf-8"));
			socket.shutdownOutput();  //关闭数据输出
			
			socket.close();  //关闭当前客户端通信,调用socket.close()会自动关闭输入流和输出流
		}
	    
		//server.close();  //关闭socket服务端(停止服务)
	    
	  }
}

Socket 客户端

public class SocketClient {
	
	public static void main(String args[]) throws UnknownHostException, IOException{
		
		//连接socket服务端
		Socket socket = new Socket("127.0.0.1", 8888);

		//向服务端发送数据
		OutputStream os = socket.getOutputStream();
		os.write("我是一个中国人".getBytes("utf-8"));
		socket.shutdownOutput(); //关闭数据输出,若不关闭则服务端接收客户端数据的输入流会一直阻塞
		//os.close();  //这里不要调用close,否则socket连接就断开了
		
		//根据实际业务需求,考虑是否需要接收服务端响应
		InputStream is = socket.getInputStream();
		ByteArrayOutputStream baos = new ByteArrayOutputStream(4096);
		byte[] buff = new byte[4096];
		int len;
		while ((len = is.read(buff)) != -1) {
			baos.write(buff, 0, len);
		}

		//输出服务端响应信息
		System.out.println(baos.toString("utf-8"));
		
		//关闭资源
		socket.close();  //关闭与服务端的通信,并自动关闭输入流和输出流
	}

}

固定长度的示例

Socket 服务端

	public static void main(String[] args) throws IOException {
		
	    ServerSocket server = new ServerSocket(8888);
	    
	    while (true) {
		    Socket socket = server.accept();
		    
		    //读取客户端请求数据,dis.read会阻塞,直到客户端write数据后才能读到数据
			DataInputStream dis = new DataInputStream(socket.getInputStream());
			byte[] buff = new byte[dis.readInt()]; //先读取4个字节的数据(int类型的数据占4个字节),获取真实数据长度
			dis.read(buff);  //读取真实数据
			
			System.out.println(new String(buff,"utf-8"));  //输出请求数据
		    
			//向客户端响应数据
			byte[] data = ("ServerSocket" + System.currentTimeMillis()).getBytes("utf-8");
			DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
			dos.writeInt(data.length);   //先发送4个字节的数据过去,告诉客户端真实数据的长度为多少
			dos.write(data); //发送真实数据
			
			socket.close();
		}
	    
		//server.close();  //关闭socket服务端(停止服务)
	    
	  }

Socket 客户端 

public static void main(String args[]) throws UnknownHostException, IOException{
		
		Socket socket = new Socket("127.0.0.1", 8888);

		//向服务端发送数据
		byte[] data = "我是一个中国人".getBytes("utf-8");
		DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
		dos.writeInt(data.length);   //先发送4个字节的数据过去(int类型的数据占4个字节),告诉服务端真实数据的长度为多少
		dos.write(data); //发送真实数据
		
		//读取服务器响应的数据
		DataInputStream dis = new DataInputStream(socket.getInputStream());
		byte[] buff = new byte[dis.readInt()]; //先读取4个字节的数据,获取真实数据长度
		dis.read(buff);  //读取真实数据
		
		System.out.println(new String(buff,"utf-8"));  //输出响应数据
		
		socket.close();
	}

参考资料:https://www.cnblogs.com/liuwenlin/p/10183652.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值