JAVA-网络编程-TCP通信

JAVA-网络编程-TCP通信


TCP Server ServerSoket类

  • 此类实现服务器套接字。服务器套接字等待请求通过网络传入。它基于该请求执行某些操作,然后可能向请求者返回结果。
  • ServerSocket对象用于监听来自客户端的Socket连接,如果没有连接就一直处于等待状态。

构造方法

方法 说明
ServerSocket() 创建非绑定服务器套接字
ServerSocket(int port) 创建绑定到特定端口的服务器套接字

方法

返回值类型 方法 说明
Socket accept() 侦听并接受到此套接字的连接

返回的socket是客户端发来的请求产生的互相连接的对象

TCP Client Socket类

  • 此类实现客户端套接字(也可以就叫“套接字”)。套接字是两台机器间通信的端点。

构造方法

方法 说明
Socket() 通过系统默认类型的 SocketImpl 创建未连接套接字
Socket(InetAddress address, int port) 创建一个流套接字并将其连接到指定 IP 地址的指定端口号

方法

返回值类型 方法 说明
OutStream getOutputStream() 返回此套接字的输出流
InputStream getInputStream() 返回此套接字的输入流

代码

Client发送数据包

public class Client {

	public static void main(String[] args) throws UnknownHostException, IOException {
	
		// socket对象
		Socket socket = new Socket("127.0.0.1", 6667);
		// 输出流
		OutputStream os = socket.getOutputStream();
		// 封装数据
		os.write("nihao ".getBytes());
		// 关闭资源
		os.close();
		
	}
}

Server接收数据包

public class Server {

	public static void main(String[] args) throws IOException {
	
		// 服务器socket实例
		ServerSocket server = new ServerSocket(6667);
		Socket socket = server.accept();
		// 获取输入流
		InputStream is = socket.getInputStream();
		
		// 解包
		byte[] bytes = new byte[1024];
		int len = is.read(bytes);
		String ip = socket.getInetAddress().getHostAddress();
		System.out.println("ip:" + ip + ":" + new String(bytes, 0, len));
		
		// 释放资源
		is.close();
		server.close();
	}

}

文件传输:

Client发送文件

public class TCPFileClient {
	
	public static void main(String[] args) throws UnknownHostException, IOException {
		// 将本地文件上传至服务器
		// 创建客户端对象
		Socket socket = new Socket("127.0.0.1", 6669);
		
		// 读取数据
		FileInputStream fis = new FileInputStream("D:/io1227/print.txt");
		
		// 目的地
		OutputStream os = socket.getOutputStream();
		
		// 创建字节数组缓冲区
		byte[] bytes = new byte[1024];
		
		// 发送数据
		int len ;
		while ((len = fis.read()) != -1) {
			os.write(bytes, 0, len);
		}
		// 给输出流加结束标记
		socket.shutdownOutput();
		
		// TODO 接收回复
		InputStream is = socket.getInputStream();
		// 获取ip地址
		String ip = socket.getInetAddress().getHostAddress();
		len = is.read(bytes);
		System.out.println("ip:" + ip + ",内容为:" + new String(bytes, 0, len));
		
		// 关闭资源
		fis.close();
		socket.close();
		
	}

}

Server单线程接收数据包

public class TCPFileSever {

	public static void main(String[] args) throws IOException {
		
		// 创建服务器实例
		ServerSocket sever = new ServerSocket(6669);
		
		// 获取连接实例并获取输出流
		Socket socket = sever.accept();
		
		// 数据源
		InputStream is = socket.getInputStream();
		
		// 目的地,先判断文件夹是否存在
		File file = new File("D:/io1227/upload");
		if (!file.exists()) {
			file.mkdirs();
		}
		// 封装文件名
		String fileName = "oracle" + System.currentTimeMillis() + 
				new Random().nextInt(999999) + ".txt";
		FileOutputStream fos = new FileOutputStream(file + file.separator + fileName);
		
		// 建立字节缓冲区 
		byte[] bytes = new byte[1024];
		
		// 接收数据
		int len ;
		while ((len = is.read(bytes)) != -1) {
			fos.write(bytes, 0, len);
		}
		
		// 回复信息
//		socket.getOutputStream().write("收到".getBytes());
		OutputStream os = socket.getOutputStream();
		os.write("收到".getBytes());
		
		// 释放资源
		sever.close();
		fos.close();
	}

}

Sever多线程接收

// Runnable实现类
public class Upload implements Runnable{
	private Socket socket ;
	public Upload(Socket socket) {
		this.socket = socket;
	}
	@Override
	public void run() {
	
		FileOutputStream fos= null;
		
		try {
			// 数据源
			InputStream is = socket.getInputStream();
			// 目的地,先判断文件夹是否存在
			File file = new File("D:/io1227/upload");
			if (!file.exists()) {
				file.mkdirs();
			}
			// 封装文件名
			String fileName = "oracle" + System.currentTimeMillis() + 
					new Random().nextInt(999999) + ".txt";
			fos = new FileOutputStream(file + file.separator + fileName);
			
			// 建立字节缓冲区 
			byte[] bytes = new byte[1024];
			
			// 接收数据
			int len ;
			while ((len = is.read(bytes)) != -1) {
				fos.write(bytes, 0, len);
			}
			
			// 回复信息
//			socket.getOutputStream().write("收到".getBytes());
			OutputStream os = socket.getOutputStream();
			os.write("收到".getBytes());
			
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			// 释放资源
			try {
				fos.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
}

// 主线程
public class Demo01 {
	public static void main(String[] args) throws IOException {

		// 创建服务器实例
		ServerSocket sever = new ServerSocket(6669);
		while (true) {
			// 获取连接实例并获取输出流
			Socket socket = sever.accept();
			// 创建线程任务
			Upload upload = new Upload(socket);
			// 创建线程任务
			Thread th = new Thread(upload);
			// 开启线程
			th.start();
		}
		
	}
}

猜你喜欢

转载自www.cnblogs.com/torain/p/12788387.html