Java学习笔记53(网络编程:TCP协议案例)
简易的案例
客户端:
- package demo;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.OutputStream;
- import java.net.Socket;
- public class TCPClient {
- public static void main(String[] args) throws IOException {
- Socket socket = new Socket("127.0.0.1", 7000);
- OutputStream out = socket.getOutputStream();
- out.write("hello".getBytes());
- InputStream in = socket.getInputStream();
- byte[] data = new byte[1024];
- int len = in.read(data);
- System.out.println(new String(data, 0, len));
- socket.close();
- }
- }
服务器端:
- package demo;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.OutputStream;
- import java.net.ServerSocket;
- import java.net.Socket;
- public class TCPServer {
- public static void main(String[] args) throws IOException {
- ServerSocket server = new ServerSocket(7000);
- Socket socket = server.accept();
- InputStream in = socket.getInputStream();
- byte[] data = new byte[1024];
- int len = in.read(data);
- System.out.println(new String(data, 0, len));
- OutputStream out = socket.getOutputStream();
- out.write("收到".getBytes());
- socket.close();
- server.close();
- }
- }
先启动服务器端,再启动客户端,服务器端打印:hello,然后客户端打印:收到
注意区分这里的流对象
接下来在这个案例基础上做一个图片上传案例
图片上传的本质就是文件复制
客户端:
- package demo1;
- import java.io.FileInputStream;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.OutputStream;
- import java.net.Socket;
- public class TCPClient {
- public static void main(String[] args) throws IOException {
- Socket socket = new Socket("127.0.0.1", 7000);
- OutputStream out = socket.getOutputStream();
- FileInputStream fis = new FileInputStream("d:\\666.jpeg");
- int len = 0;
- byte[] bytes = new byte[1024];
- while ((len = fis.read(bytes)) != -1) {
- out.write(bytes, 0, len);
- }
- socket.shutdownOutput();
- // 服务器端读不到-1,不会终止,调用这个方法可以终止
- InputStream in = socket.getInputStream();
- len = in.read(bytes);
- System.out.println(new String(bytes, 0, len));
- fis.close();
- socket.close();
- }
- }
服务器端:
- package demo1;
- import java.io.File;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.io.InputStream;
- import java.net.ServerSocket;
- import java.net.Socket;
- import java.util.Random;
- public class TCPServer {
- public static void main(String[] args) throws IOException {
- ServerSocket server = new ServerSocket(7000);
- Socket socket = server.accept();
- InputStream in = socket.getInputStream();
- File upload = new File("d:\\upload");
- if (!upload.exists()) {
- upload.mkdirs();
- }
- String filename = System.currentTimeMillis() + new Random().nextInt(999999) + ".jpeg";
- FileOutputStream fos = new FileOutputStream(upload + File.separator + filename);
- // 这里是处理图片重名的问题
- byte[] bytes = new byte[1024];
- int len = 0;
- while ((len = in.read(bytes)) != -1) {
- fos.write(bytes, 0, len);
- }
- socket.getOutputStream().write("上传成功".getBytes());
- fos.close();
- socket.close();
- server.close();
- }
- }
如果多个客户端一起上传,就需要多线程的技术,每个客户端占一个线程
客户端不需要修改
服务器端:
- package demo1;
- import java.io.IOException;
- import java.net.ServerSocket;
- import java.net.Socket;
- public class TCPServer {
- public static void main(String[] args) throws IOException {
- ServerSocket server = new ServerSocket(7000);
- while (true) {
- Socket socket = server.accept();
- new Thread(new Upload(socket)).start();
- }
- }
- }
- package demo1;
- import java.io.File;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.io.InputStream;
- import java.net.ServerSocket;
- import java.net.Socket;
- import java.util.Random;
- public class Upload implements Runnable {
- private Socket socket;
- public Upload(Socket socket) {
- this.socket = socket;
- }
- public void run() {
- try {
- InputStream in = socket.getInputStream();
- File upload = new File("d:\\upload");
- if (!upload.exists()) {
- upload.mkdirs();
- }
- String filename = System.currentTimeMillis() + new Random().nextInt(999999) + ".jpeg";
- FileOutputStream fos = new FileOutputStream(upload + File.separator + filename);
- // 这里是处理图片重名的问题
- byte[] bytes = new byte[1024];
- int len = 0;
- while ((len = in.read(bytes)) != -1) {
- fos.write(bytes, 0, len);
- }
- socket.getOutputStream().write("上传成功".getBytes());
- fos.close();
- socket.close();
- } catch (IOException ex) {
- System.out.println(ex);
- }
- }
- }
Java学习笔记53(网络编程:TCP协议案例)的更多相关文章
- 网络编程TCP协议-聊天室
网络编程TCP协议-聊天室(客户端与服务端的交互); <span style="font-size:18px;">1.客户端发数据到服务端.</span> ...
- java学习笔记15--多线程编程基础2
本文地址:http://www.cnblogs.com/archimedes/p/java-study-note15.html,转载请注明源地址. 线程的生命周期 1.线程的生命周期 线程从产生到消亡 ...
- 网络编程——TCP协议、UDP协议、socket套接字、粘包问题以及解决方法
网络编程--TCP协议.UDP协议.socket套接字.粘包问题以及解决方法 TCP协议(流式协议) 当应用程序想通过TCP协议实现远程通信时,彼此之间必须先建立双向通信通道,基于该双向通道实现数 ...
- java学习笔记14--多线程编程基础1
本文地址:http://www.cnblogs.com/archimedes/p/java-study-note14.html,转载请注明源地址. 多线程编程基础 多进程 一个独立程序的每一次运行称为 ...
- 7.4 (java学习笔记)网络编程之TCP
一.TCP 1.1 TCP(Transmission Control Protocol 传输控制协议),是一种面向连接的,安全的传输协议,但效率相比于UDP而言比较低. TCP传输时需要确保先建立连接 ...
- JAVA基础知识之网络编程——-TCP/IP协议,socket通信,服务器客户端通信demo
OSI模型分层 OSI模型是指国际标准化组织(ISO)提出的开放系统互连参考模型(Open System Interconnection Reference Model,OSI/RM),它将网络分为七 ...
- nodejs学习笔记之网络编程
了解一下OSI七层模型 OSI层 功能 TCP/IP协议 应用层 文件传输,电子邮件,文件服务,虚拟终端 TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet 表示层 数据格式化 ...
- 【原】Java学习笔记034 - 网络
package cn.temptation; import java.net.InetAddress; public class Sample01 { public static void main( ...
- Java精选笔记_网络编程
网络编程 概述 现在的网络编程基本上都是基于请求/响应方式的,也就是一个设备发送请求数据给另外一个,然后接收另一个设备的反馈. 在网络编程中,发起连接程序,也就是发送第一次请求的程序,被称作客户端(C ...
- 网络编程——TCP协议和通信
第1章 TCP通信 TCP通信同UDP通信一样,都能实现两台计算机之间的通信,通信的两端都需要创建socket对象. 区别在于,UDP中只有发送端和接收端,不区分客户端与服务器端,计算机之间可以任意地 ...
随机推荐
- [译]与TensorFlow的第一次接触(三)之聚类
转自 [译]与TensorFlow的第一次接触(三)之聚类 2016.08.09 16:58* 字数 4316 阅读 7916评论 5喜欢 18 前一章节中介绍的线性回归是一种监督学习算法,我们使用数 ...
- 一个ipv4到ipv6的移植问题
之前在使用ipv4的时候,有一个模块是使用raw socket来发包,它使用的一个option是:IP_HDRINCL. 如果设置了IP_HDRINCL选项,则raw会绕过source validat ...
- MySQL的show profile(已过时)简介以及该功能在MySQL 5.7中performance_schema中的替代
本文出处:http://www.cnblogs.com/wy123/p/6979499.html show profile 命令用于跟踪执行过的sql语句的资源消耗信息,可以帮助查看sql语句的执行情 ...
- python入门(七):字符串
1.字符串类型: >>> s="早上好" #str类型的字符串 >>> type(s) <class 'str ...
- 2018面向对象程序设计(Java)第16周学习指导及要求
2018面向对象程序设计(Java)第16周学习指导及要求(2018.12.13-2018.12.16) 学习目标 (1) 掌握线程概念: (2) 掌握线程创建的两种技术: (3) 理解和掌握线程 ...
- 最小费用最大流 HDU1533
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1533 #include<bits/stdc++.h> #define fi first ...
- springboot 整合 mybatis
spirngboot 整合mybatis有两种方式 第一种 无配置文件注解版,这一种符合springboot的风格 第二种 有配置文件xml版本,这一种就是传统的模式 无论哪一种,首先都需要加入MyS ...
- Linux进程的原理及与信号的联系
第1节 程序.进程.守护进程.僵尸进程的区别 程序.进程.守护进程.僵尸进程: 程序:c/php/java,代码文件,静态的,放在磁盘里的数据. 进程:正在内存中运行的程序,进程是动态的,会申请和使用 ...
- Ubuntu修改时间时区
设定时区:dpkg-reconfigure tzdata 选择Asia,Hong Kong. sudo apt-get install ntpdate // 安装时间同步工具 sudo ntpdate ...
- 信号基础知识----线性调频信号LFM //matlab命令:chirp
%关于线性调频信号(LFM) %参考书目:声呐技术,第二章P33 clc;close all;clear all;%参数----------------------------------f0=100 ...