Java tcp的使用和实现简单Tomcat功能

1、入门例子


1.1、客户端

import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
 
/**
 * tcp通讯(客户端)
 * @date 2018年2月8日
 */
public class Client {
 
	public static void main(String[] args) throws Exception{
		//第一步:建立tcp的客户端服务
		Socket socket = new Socket(InetAddress.getLocalHost(),9090);
		//第二步:准备数据,获取对应的流通道
		OutputStream out = socket.getOutputStream();
		String data = "第一个tcp程序";
		//第三步:写出数据
		out.write(data.getBytes());
		//获取服务端回显数据
		InputStream inputStream = socket.getInputStream();
		byte buf[] = new byte[1024];
		int length = inputStream.read(buf);
		System.out.println(new String(buf,0,length));
		//第四步:关闭资源
		out.close();
		socket.close();
	}
}

1.2、服务端

import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
 
/**
 * tcp通讯(服务端)
 * @date 2018年2月8日
 */
public class Server {
 
	public static void main(String[] args) throws Exception {
		//第一步:建立tcp的服务端
		ServerSocket serverSocket = new ServerSocket(9090);
		//第二步:接收客户端的连接。accept也是一个阻塞性方法,如果没接收到连接,则一直等待
		Socket socket = serverSocket.accept();
		//第三步:获取socket对应的流通道
		InputStream inputStream = socket.getInputStream();
		//第四步:通过输入流通道获取数据
		byte buf[] = new byte[1024];
		int length = inputStream.read(buf);
		System.out.println("服务端接收的数据"+new String(buf,0,length));
		//发送客户端数据
		OutputStream out = socket.getOutputStream();
		out.write("服务端收到了!".getBytes());
		out.close();
		//第五步:关闭资源
		//socket.close();没必要
		serverSocket.close();
	}
}

2、多线程下载图片,统计人数


2.1、服务端

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.util.HashSet;
import java.util.Set;
 
/**
 * tcp多线程下载图片,统计人数
 * @date 2018年2月8日
 */
public class ImageServer implements Runnable{
 
	private Socket socket;
	/**
	 * 统计人数,去重
	 */
	static Set<String> ips = new HashSet<>();
	public ImageServer(Socket socket){
		this.socket = socket;
	}
	public void run(){
		try {
			OutputStream out = socket.getOutputStream();
			BufferedInputStream is = new BufferedInputStream(new FileInputStream("F:\\2.png"));
			int legnth = -1;
			byte buf[] = new byte[1024];
			while ((legnth = is.read(buf)) != -1) {
				out.write(buf,0,legnth);
			}
			String ip = socket.getInetAddress().getHostAddress();//获取对方ip
			if (ips.add(ip)) {
				System.out.println(ip + "下载成功!当前人数:"+ips.size());
			}
			is.close();
			socket.close();//socket会占用cpu默认分配的端口,一个通讯程序最少会占用2个端口
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

2.2、服务端启动类

import java.net.ServerSocket;
import java.net.Socket;
 
public class ImageMain {
 
	public static void main(String[] args) throws Exception {
		ServerSocket serverSocket = new ServerSocket(9090);
		Socket socket = null;
		Thread thread = null;
		while (true) {//不断的接收用户请求
			socket = serverSocket.accept();//为每一个客户端分配一个线程
			thread = new Thread(new ImageServer(socket));
			thread.start();
		}
	}
}
 

2.3、客户端

import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.InetAddress;
import java.net.Socket;
 
/**
 * tcp客户端下载图片
 * @date 2018年2月8日
 */
public class ImageClient {
	 
	public static void main(String[] args) throws Exception {
		Socket socket = new Socket(InetAddress.getLocalHost(),9090);
		InputStream inputStream = socket.getInputStream();
		BufferedOutputStream bos = new  BufferedOutputStream(new FileOutputStream("F:\\1.png"));
		byte buf[] = new byte[1024];
		int length = -1;
		while ((length = inputStream.read(buf)) != -1) {
			bos.write(buf);
		}
		bos.close();
		socket.close();
	}
}

3、tcp与浏览器通讯(tomcat原理)


import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
 
import javax.imageio.ImageIO;
 
/**
 * tcp与浏览器通讯
 * @date 2018年2月8日
 */
public class TomcatServer implements Runnable{
 
	private Socket socket;
	public TomcatServer (Socket socket) {
		this.socket = socket;
	}
	@Override
	public void run() {
		try {
			DataOutputStream out = new DataOutputStream(socket.getOutputStream());
			//向浏览器输出图片
			BufferedImage image = ImageIO.read(new File("F:/1.png"));
			ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
			ImageIO.write(image, "png", byteOut);
			byte buf [] = byteOut.toByteArray();
			out.write(buf);
			//向浏览器输出文字
			//out.write("<br>Hello chrome !".getBytes());
			out.close();
			socket.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	 
	public static void main(String[] args) throws Exception {
		ServerSocket serverSocket = new ServerSocket(9090);
		Socket socket = null;
		while(true){
			socket = serverSocket.accept();
			new Thread(new TomcatServer(socket)).start();;
		}
	}
}

在浏览器输入:http://ip地址:9090即可
部分浏览会没有效果,建议用IE测试。

如果使用谷歌则需要在代码额外处理请求头。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

terrybg

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值