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测试。
如果使用谷歌则需要在代码额外处理请求头。