TCP传输数据。上传文件

TCP:通过三次握手,建立一个连接通道

1.客户端getoutputstream进行write

2.服务端getinputstream进行read

3.服务器端getoutputstream进行write

4.客户端getinputstream进行read

传输结束之后,通道要关闭。

最初版本客户端

public class ClientTCP {

	public static void main(String[] args) throws Exception {
		Socket s = new Socket("127.0.0.1", 8888);
		OutputStream os = s.getOutputStream();
		os.write("TCP走你".getBytes());
		s.close();
	}

}
服务器端
public class ServerTCP {

	public static void main(String[] args) throws Exception {
		// 创建socket对象并监听指定端口
		ServerSocket ss = new ServerSocket(8888);
		// 获取客户端连接对象
		Socket s = ss.accept();
		// 通过连接对象获取输入流,读取数据
		InputStream in = s.getInputStream();
		byte[] buf = new byte[1024];
		int len = in.read(buf);
		// 将客户端传输的数据转换成字符串
		String result = new String(buf, 0, len);
		String ip = s.getInetAddress().getHostAddress();
		System.out.println("ip=" + ip + ",result=" + result);
		// 关闭资源
		ss.close();
	}

}



有来回的TCP聊天室

客户端

public class ClientTCP2 {

	public static void main(String[] args) throws Exception {
//		建立客户端的Socket并指定地址和端口号
		Socket s = new Socket("127.0.0.1", 8888);
//		向服务器端写出数据
		OutputStream out = s.getOutputStream();
//		将字节输出流转换为缓冲字符输出流
		OutputStreamWriter osw = new OutputStreamWriter(out);
		BufferedWriter bw = new BufferedWriter(osw);
		bw.write("借点钱啊");
		bw.newLine();
//		刷新缓冲区,将缓冲区中的数据刷新到服务器端
		bw.flush();
//		接受服务器端给的反馈信息
		InputStream is = s.getInputStream();
//		将字节读取流转换成缓冲字符读取流
		InputStreamReader isr = new InputStreamReader(is);
		BufferedReader br = new BufferedReader(isr);
		String result = br.readLine();
		System.out.println(result);
		s.close();
	}
		
}
服务器端
public class ServerTCP2 {

	public static void main(String[] args) throws Exception {
		// 建立服务端Socket并监听指定接口
		ServerSocket ss = new ServerSocket(8888);
		// 通过端口接受连接对象
		Socket s = ss.accept();
		// 连接对象获取客户端传输过来的数据
		InputStream in = s.getInputStream();
		// 将字节读取流转换成缓冲字符读取流
		InputStreamReader isr = new InputStreamReader(in);
		BufferedReader br = new BufferedReader(isr);
		String result = br.readLine();
		System.out.println(result);
		// 将结果反馈给客户端
		OutputStream out = s.getOutputStream();
		// 将字节输出流转换成缓冲字符输出流
		OutputStreamWriter osw = new OutputStreamWriter(out);
		BufferedWriter bw = new BufferedWriter(osw);
		bw.write("不在,没钱");
		// bw.newLine();
		bw.flush();
		s.close();
		ss.close();
	}

}
持续性传输数据

客户端

public class Client2 {

	public static void main(String[] args) throws Exception {
		Socket socket = new Socket("127.0.0.1", 8888);
		OutputStream out = socket.getOutputStream();
		OutputStreamWriter osw = new OutputStreamWriter(out);
		BufferedWriter bw = new BufferedWriter(osw);
		Scanner sc = new Scanner(System.in);
		String content;
		while (!(content=sc.nextLine()).equals("886")) {
			bw.write(content);
			bw.newLine();
			bw.flush();
		}
		sc.close();
		socket.close();
	}

}
服务端
public class Server2 {

	public static void main(String[] args) throws Exception {
		ServerSocket ss = new ServerSocket(8888);
		while (true) {
			Socket s = ss.accept();
			// 因为可能是多个客户端,所以不能一直只为一个客户端处理数据,当连接拿到之后,将任务交给子线程进行处理
			new Thread(new DealSocket(s)).start();
		}
	}

}

class DealSocket implements Runnable {
	private Socket s;

	public DealSocket(Socket s) {
		super();
		this.s = s;
	}

	@Override
	public void run() {
		try {
			// TODO Auto-generated method stub
			BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
			String result;
			while ((result = br.readLine()) != null) {
				System.out.println(result);
			}
			s.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}
}
将图片上传

客户端

public static void main(String[] args) throws Exception {
		// 创建客户端套接字并指定地址和端口号
		Socket s = new Socket("127.0.0.1", 8888);
		// 获取输出流
		// 将字节输出流包装成缓冲字节输出流
		BufferedOutputStream bos = new BufferedOutputStream(s.getOutputStream());
		// 将图片写出到服务端
		BufferedInputStream bis = new BufferedInputStream(new FileInputStream("/Users/yoofale/Desktop/9527.jpg"));
		// 自定义缓冲区
		byte[] buf = new byte[1024];
		int len;
		while ((len = bis.read(buf)) != -1) {
			bos.write(buf, 0, len);
			bos.flush();
		}
		// 关闭流
		bis.close();
//		告诉服务端上传完毕
		s.shutdownInput();
		// 获取上传的结果
		BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
		System.out.println(br.readLine());
		// 关闭资源
		s.close();
	}
服务端
public class UploadServer {

	public static void main(String[] args) throws Exception {
		Socket s = null;
		// 获取客户端链接对象
		try {
			ServerSocket ss = new ServerSocket(8888);
			while (true) {
				s = ss.accept();
				// 获取客户端发送过来的字节数据
				BufferedInputStream bis = new BufferedInputStream(s.getInputStream());
				// 封装图片保存的位置
				BufferedOutputStream bos = new BufferedOutputStream(
						new FileOutputStream("/Users/yoofale/Desktop/" + System.currentTimeMillis()));
				// 循环读写
				byte[] buf = new byte[1024];
				int len;
				while ((len = bis.read(buf)) != -1) {
					bos.write(buf, 0, len);
					bos.flush();
				}
				System.out.println("上传成功");
				BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
				bw.write("上传成功");
				bw.newLine();
				bw.flush();
			}
		} catch (Exception e) {
			// 此时,上传失败
			System.out.println("上传失败");
			try {
				BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
				bw.write("上传失败");
				bw.newLine();
				bw.flush();
			} catch (Exception e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			if (null != s) {
				try {
					s.close();
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值