简易的案例

客户端:

  1. package demo;
  2.  
  3. import java.io.IOException;
  4. import java.io.InputStream;
  5. import java.io.OutputStream;
  6. import java.net.Socket;
  7.  
  8. public class TCPClient {
  9. public static void main(String[] args) throws IOException {
  10. Socket socket = new Socket("127.0.0.1", 7000);
  11. OutputStream out = socket.getOutputStream();
  12. out.write("hello".getBytes());
  13. InputStream in = socket.getInputStream();
  14. byte[] data = new byte[1024];
  15. int len = in.read(data);
  16. System.out.println(new String(data, 0, len));
  17. socket.close();
  18. }
  19. }

服务器端:

  1. package demo;
  2.  
  3. import java.io.IOException;
  4. import java.io.InputStream;
  5. import java.io.OutputStream;
  6. import java.net.ServerSocket;
  7. import java.net.Socket;
  8.  
  9. public class TCPServer {
  10. public static void main(String[] args) throws IOException {
  11. ServerSocket server = new ServerSocket(7000);
  12. Socket socket = server.accept();
  13. InputStream in = socket.getInputStream();
  14. byte[] data = new byte[1024];
  15. int len = in.read(data);
  16. System.out.println(new String(data, 0, len));
  17. OutputStream out = socket.getOutputStream();
  18. out.write("收到".getBytes());
  19. socket.close();
  20. server.close();
  21. }
  22. }

先启动服务器端,再启动客户端,服务器端打印:hello,然后客户端打印:收到

注意区分这里的流对象

接下来在这个案例基础上做一个图片上传案例

图片上传的本质就是文件复制

客户端:

  1. package demo1;
  2.  
  3. import java.io.FileInputStream;
  4. import java.io.IOException;
  5. import java.io.InputStream;
  6. import java.io.OutputStream;
  7. import java.net.Socket;
  8.  
  9. public class TCPClient {
  10. public static void main(String[] args) throws IOException {
  11. Socket socket = new Socket("127.0.0.1", 7000);
  12. OutputStream out = socket.getOutputStream();
  13. FileInputStream fis = new FileInputStream("d:\\666.jpeg");
  14. int len = 0;
  15. byte[] bytes = new byte[1024];
  16. while ((len = fis.read(bytes)) != -1) {
  17. out.write(bytes, 0, len);
  18. }
  19. socket.shutdownOutput();
  20. // 服务器端读不到-1,不会终止,调用这个方法可以终止
  21. InputStream in = socket.getInputStream();
  22. len = in.read(bytes);
  23. System.out.println(new String(bytes, 0, len));
  24. fis.close();
  25. socket.close();
  26. }
  27. }

服务器端:

  1. package demo1;
  2.  
  3. import java.io.File;
  4. import java.io.FileOutputStream;
  5. import java.io.IOException;
  6. import java.io.InputStream;
  7. import java.net.ServerSocket;
  8. import java.net.Socket;
  9. import java.util.Random;
  10.  
  11. public class TCPServer {
  12. public static void main(String[] args) throws IOException {
  13. ServerSocket server = new ServerSocket(7000);
  14. Socket socket = server.accept();
  15. InputStream in = socket.getInputStream();
  16. File upload = new File("d:\\upload");
  17. if (!upload.exists()) {
  18. upload.mkdirs();
  19. }
  20. String filename = System.currentTimeMillis() + new Random().nextInt(999999) + ".jpeg";
  21. FileOutputStream fos = new FileOutputStream(upload + File.separator + filename);
  22. // 这里是处理图片重名的问题
  23. byte[] bytes = new byte[1024];
  24. int len = 0;
  25. while ((len = in.read(bytes)) != -1) {
  26. fos.write(bytes, 0, len);
  27. }
  28. socket.getOutputStream().write("上传成功".getBytes());
  29. fos.close();
  30. socket.close();
  31. server.close();
  32. }
  33. }

如果多个客户端一起上传,就需要多线程的技术,每个客户端占一个线程

客户端不需要修改

服务器端:

  1. package demo1;
  2.  
  3. import java.io.IOException;
  4. import java.net.ServerSocket;
  5. import java.net.Socket;
  6.  
  7. public class TCPServer {
  8. public static void main(String[] args) throws IOException {
  9. ServerSocket server = new ServerSocket(7000);
  10. while (true) {
  11. Socket socket = server.accept();
  12. new Thread(new Upload(socket)).start();
  13. }
  14. }
  15. }
  1. package demo1;
  2. import java.io.File;
  3. import java.io.FileOutputStream;
  4. import java.io.IOException;
  5. import java.io.InputStream;
  6. import java.net.ServerSocket;
  7. import java.net.Socket;
  8. import java.util.Random;
  9.  
  10. public class Upload implements Runnable {
  11.  
  12. private Socket socket;
  13.  
  14. public Upload(Socket socket) {
  15. this.socket = socket;
  16. }
  17.  
  18. public void run() {
  19. try {
  20. InputStream in = socket.getInputStream();
  21. File upload = new File("d:\\upload");
  22. if (!upload.exists()) {
  23. upload.mkdirs();
  24. }
  25. String filename = System.currentTimeMillis() + new Random().nextInt(999999) + ".jpeg";
  26. FileOutputStream fos = new FileOutputStream(upload + File.separator + filename);
  27. // 这里是处理图片重名的问题
  28. byte[] bytes = new byte[1024];
  29. int len = 0;
  30. while ((len = in.read(bytes)) != -1) {
  31. fos.write(bytes, 0, len);
  32. }
  33. socket.getOutputStream().write("上传成功".getBytes());
  34. fos.close();
  35. socket.close();
  36. } catch (IOException ex) {
  37. System.out.println(ex);
  38. }
  39. }
  40. }

Java学习笔记53(网络编程:TCP协议案例)的更多相关文章

  1. 网络编程TCP协议-聊天室

    网络编程TCP协议-聊天室(客户端与服务端的交互); <span style="font-size:18px;">1.客户端发数据到服务端.</span> ...

  2. java学习笔记15--多线程编程基础2

    本文地址:http://www.cnblogs.com/archimedes/p/java-study-note15.html,转载请注明源地址. 线程的生命周期 1.线程的生命周期 线程从产生到消亡 ...

  3. 网络编程——TCP协议、UDP协议、socket套接字、粘包问题以及解决方法

    网络编程--TCP协议.UDP协议.socket套接字.粘包问题以及解决方法 TCP协议(流式协议) ​ 当应用程序想通过TCP协议实现远程通信时,彼此之间必须先建立双向通信通道,基于该双向通道实现数 ...

  4. java学习笔记14--多线程编程基础1

    本文地址:http://www.cnblogs.com/archimedes/p/java-study-note14.html,转载请注明源地址. 多线程编程基础 多进程 一个独立程序的每一次运行称为 ...

  5. 7.4 (java学习笔记)网络编程之TCP

    一.TCP 1.1 TCP(Transmission Control Protocol 传输控制协议),是一种面向连接的,安全的传输协议,但效率相比于UDP而言比较低. TCP传输时需要确保先建立连接 ...

  6. JAVA基础知识之网络编程——-TCP/IP协议,socket通信,服务器客户端通信demo

    OSI模型分层 OSI模型是指国际标准化组织(ISO)提出的开放系统互连参考模型(Open System Interconnection Reference Model,OSI/RM),它将网络分为七 ...

  7. nodejs学习笔记之网络编程

    了解一下OSI七层模型   OSI层 功能 TCP/IP协议 应用层 文件传输,电子邮件,文件服务,虚拟终端  TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet 表示层 数据格式化 ...

  8. 【原】Java学习笔记034 - 网络

    package cn.temptation; import java.net.InetAddress; public class Sample01 { public static void main( ...

  9. Java精选笔记_网络编程

    网络编程 概述 现在的网络编程基本上都是基于请求/响应方式的,也就是一个设备发送请求数据给另外一个,然后接收另一个设备的反馈. 在网络编程中,发起连接程序,也就是发送第一次请求的程序,被称作客户端(C ...

  10. 网络编程——TCP协议和通信

    第1章 TCP通信 TCP通信同UDP通信一样,都能实现两台计算机之间的通信,通信的两端都需要创建socket对象. 区别在于,UDP中只有发送端和接收端,不区分客户端与服务器端,计算机之间可以任意地 ...

随机推荐

  1. [译]与TensorFlow的第一次接触(三)之聚类

    转自 [译]与TensorFlow的第一次接触(三)之聚类 2016.08.09 16:58* 字数 4316 阅读 7916评论 5喜欢 18 前一章节中介绍的线性回归是一种监督学习算法,我们使用数 ...

  2. 一个ipv4到ipv6的移植问题

    之前在使用ipv4的时候,有一个模块是使用raw socket来发包,它使用的一个option是:IP_HDRINCL. 如果设置了IP_HDRINCL选项,则raw会绕过source validat ...

  3. MySQL的show profile(已过时)简介以及该功能在MySQL 5.7中performance_schema中的替代

    本文出处:http://www.cnblogs.com/wy123/p/6979499.html show profile 命令用于跟踪执行过的sql语句的资源消耗信息,可以帮助查看sql语句的执行情 ...

  4. python入门(七):字符串

    1.字符串类型: >>> s="早上好"               #str类型的字符串 >>> type(s) <class 'str ...

  5. 2018面向对象程序设计(Java)第16周学习指导及要求

    2018面向对象程序设计(Java)第16周学习指导及要求(2018.12.13-2018.12.16)   学习目标 (1) 掌握线程概念: (2) 掌握线程创建的两种技术: (3) 理解和掌握线程 ...

  6. 最小费用最大流 HDU1533

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1533 #include<bits/stdc++.h> #define fi first ...

  7. springboot 整合 mybatis

    spirngboot 整合mybatis有两种方式 第一种 无配置文件注解版,这一种符合springboot的风格 第二种 有配置文件xml版本,这一种就是传统的模式 无论哪一种,首先都需要加入MyS ...

  8. Linux进程的原理及与信号的联系

    第1节 程序.进程.守护进程.僵尸进程的区别 程序.进程.守护进程.僵尸进程: 程序:c/php/java,代码文件,静态的,放在磁盘里的数据. 进程:正在内存中运行的程序,进程是动态的,会申请和使用 ...

  9. Ubuntu修改时间时区

    设定时区:dpkg-reconfigure tzdata 选择Asia,Hong Kong. sudo apt-get install ntpdate // 安装时间同步工具 sudo ntpdate ...

  10. 信号基础知识----线性调频信号LFM //matlab命令:chirp

    %关于线性调频信号(LFM) %参考书目:声呐技术,第二章P33 clc;close all;clear all;%参数----------------------------------f0=100 ...