#Java学习之路——基础阶段二(第九篇)
我的学习阶段是跟着CZBK黑马的双源课程,学习目标以及博客是为了审查自己的学习情况,毕竟看一遍,敲一遍,和自己归纳总结一遍有着很大的区别,在此期间我会参杂Java疯狂讲义(第四版)里面的内容。
前言:此随笔主要是Java基础中的基础,相信大家对这方面肯定有着自己的理解和认识,具体详解可以参照万能的baidu,有的我就一笔带过,希望在我的学习之路上能够有大牛进行指导,也有更多的小伙伴共勉。
1.网络编程入门
首先要了解软件的结构有两种一种是C/S全称是Client/server 客户端和服务器之间的, 还有一种是B/S 全称是Browser/Service 浏览器和服务器之间的架构。而网络编程是在一定的协议的基础下,实现两台计算机的通信。
然后就是网络通信协议,通信协议是对计算机必须遵循的规则,只有遵循了这些规则才能完成之间的通讯。TCP/IP是互联网最基本最广泛的协议。才用了四层分层模型,每一层需要呼叫下一层来完成自己的需求。
TCP协议:是互联网面向对象的协议,这里客户端和服务器端需要进行三次交互从而达到连接的可靠。也称这三次交互叫三次握手。
UDP协议:是一个面向无连接的协议,是在不需要请求的情况下服务器发送数据包的一种协议,直接送达但是容易丢十数据,每个数据包的大小控制在64kb之内。
网络编程的三要素:协议,IP地址,端口号。
协议:是设定的连接规则,必须要在遵守规则的情况下进行连接。
IP地址:是一个设备号,可以理解为每个电脑特定的身份信息。这里有IPV4/IPV6两种。
常用的命令:Ipconfig在控制台输入,用来查询本机的IP地址
Ping 空格 IP地址用来查看网络是否能连接通路
而特殊的IP地址有127.0.0.1和localhost两种,这是本机的本地IP地址。
2.TCP通信程序
TCP能完成两台计算机之间的通讯。这里主要是服务器端和客户端两种。
在Java中提供了两个类来完成服务器和客户端之间的通讯,一种是Socket和ServerSocket。创建Socket请求服务器的连接,创建服务器ServerSocket等待请求。
Socket类:该类接近客户端套接字,套接字指的是两台设备之间的通讯端点。
构造方法:
Socket 参数传入的是要连接的地址IP和端口号。而如果要进行网络软件的测试一般是本地的127.0.0.1和localhost两种这种不进行任何网络协议的传输。
成员方法:
·getInputStream 返回此套接字的输入流
·getOutputStream 返回此套接字的输出流
·close 关闭此套接字
·shutdownOutput 禁用此套接字的输出流
serverSocket类:这个类实现了服务器端的套接字,等待通过网络的请求。
构造方法:
server 参数传入的是端口号。
成员方法:
·accept 倾听并接受连接,返回一个新的Socket对象。用鱼和客户端实现通讯,这个方法用一直会阻塞到建立连接。
这里是服务器端的实现:
其中运用到了ServerSocket / Socket / Thread / FileOutputStream /
这里所用到的优化:
为了防止socket是用完之后就进行关闭,可以使用While(true)方法将功能一直实现,而用了Thread 多线程方法为了能够在别人上传大文件时最服务器的占用使用了多线程的方法。
- import java.io.*;
- import java.net.ServerSocket;
- import java.net.Socket;
- public class server {
- public static void main(String[] args) throws IOException {
- System.out.println("server begining!");
- ServerSocket serverSocket = new ServerSocket(8889);
- while (true) {
- Socket accept = serverSocket.accept();
- new Thread(() -> {
- try (
- BufferedInputStream bufferedInputStream = new BufferedInputStream(accept.getInputStream());
- FileOutputStream fileOutputStream = new FileOutputStream(System.currentTimeMillis() + ".jpg");
- // BufferedoutputStream
- BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fileOutputStream);
- ) {
- byte[] bytes = new byte[1024];
- int len;
- while ((len = bufferedInputStream.read(bytes)) != -1) {
- bufferedOutputStream.write(bytes, 0, len);
- }
- System.out.println("backing...");
- OutputStream outputStream = accept.getOutputStream();
- outputStream.write("upload".getBytes());
- outputStream.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }).start();
- }
- }
- }
下面是客户端的实现:
- import java.io.*;
- import java.net.Socket;
- public class Client {
- public static void main(String[] args) throws IOException {
- BufferedInputStream bufferedinputStream = new BufferedInputStream(new FileInputStream("text.jpg"));
- Socket socket = new Socket("localhost", 8889);
- BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(socket.getOutputStream());
- byte[] bytes = new byte[1024];
- int len;
- while ((len = bufferedinputStream.read(bytes)) != -1) {
- bufferedOutputStream.write(bytes,0,len);
- }
- socket.shutdownOutput();
- System.out.println("finish");
- InputStream inputStream = socket.getInputStream();
- byte[] back = new byte[1024];
- inputStream.read(back);
- System.out.println(new String(back));
- inputStream.close();
- socket.close();
- bufferedinputStream.close();
- }
- }
#Java学习之路——基础阶段二(第九篇)的更多相关文章
- #Java学习之路——基础阶段(第九篇)
我的学习阶段是跟着CZBK黑马的双源课程,学习目标以及博客是为了审查自己的学习情况,毕竟看一遍,敲一遍,和自己归纳总结一遍有着很大的区别,在此期间我会参杂Java疯狂讲义(第四版)里面的内容. 前言: ...
- #Java学习之路——基础阶段二(第三篇)
我的学习阶段是跟着CZBK黑马的双源课程,学习目标以及博客是为了审查自己的学习情况,毕竟看一遍,敲一遍,和自己归纳总结一遍有着很大的区别,在此期间我会参杂Java疯狂讲义(第四版)里面的内容. 前言: ...
- #Java学习之路——基础阶段二(第一篇)
我的学习阶段是跟着CZBK黑马的双源课程,学习目标以及博客是为了审查自己的学习情况,毕竟看一遍,敲一遍,和自己归纳总结一遍有着很大的区别,在此期间我会参杂Java疯狂讲义(第四版)里面的内容. 前言: ...
- #Java学习之路——基础阶段二(第十篇)
我的学习阶段是跟着CZBK黑马的双源课程,学习目标以及博客是为了审查自己的学习情况,毕竟看一遍,敲一遍,和自己归纳总结一遍有着很大的区别,在此期间我会参杂Java疯狂讲义(第四版)里面的内容. 前言: ...
- #Java学习之路——基础阶段二(第八篇)
我的学习阶段是跟着CZBK黑马的双源课程,学习目标以及博客是为了审查自己的学习情况,毕竟看一遍,敲一遍,和自己归纳总结一遍有着很大的区别,在此期间我会参杂Java疯狂讲义(第四版)里面的内容. 前言: ...
- #Java学习之路——基础阶段二(第七篇)
我的学习阶段是跟着CZBK黑马的双源课程,学习目标以及博客是为了审查自己的学习情况,毕竟看一遍,敲一遍,和自己归纳总结一遍有着很大的区别,在此期间我会参杂Java疯狂讲义(第四版)里面的内容. 前言: ...
- #Java学习之路——基础阶段二(第六篇)
我的学习阶段是跟着CZBK黑马的双源课程,学习目标以及博客是为了审查自己的学习情况,毕竟看一遍,敲一遍,和自己归纳总结一遍有着很大的区别,在此期间我会参杂Java疯狂讲义(第四版)里面的内容. 前言: ...
- #Java学习之路——基础阶段二(第五篇)
我的学习阶段是跟着CZBK黑马的双源课程,学习目标以及博客是为了审查自己的学习情况,毕竟看一遍,敲一遍,和自己归纳总结一遍有着很大的区别,在此期间我会参杂Java疯狂讲义(第四版)里面的内容. 前言: ...
- #Java学习之路——基础阶段二(第四篇)
我的学习阶段是跟着CZBK黑马的双源课程,学习目标以及博客是为了审查自己的学习情况,毕竟看一遍,敲一遍,和自己归纳总结一遍有着很大的区别,在此期间我会参杂Java疯狂讲义(第四版)里面的内容. 前言: ...
随机推荐
- Django Push 的一些资料
先来中文的: 主要讲Orbited: http://sunsetsunrising.com/2009/django_comet.html#gsc.tab=0 再来英文的: http://www.rkb ...
- C# 数据库链接字符串加密工具
有些项目尤其是WinForm或者是WPF项目,针对一些工具形式的小项目,不想软件流出去之后,懂程序的的拿到手之后一看配置文件就知道了我们数据库的用户名和密码,如果外网能访问的话,那就麻烦大了.所以这里 ...
- Flux和ExtJS MVC框架的异同点介绍
Flux是Facebook在现有MVC框架数据流动复杂,难以设计和维护大型的前端应用的情况下设计的一种新的数据架构协议.叫做协议是因为Flux本身就像MVC一样,规定了一种机制,但是Facebook提 ...
- java web 实战经典(二)
一.jsp之间传值时乱码问题解决 request.setCharacterEncoding("GBK");//解决中文乱码 String postData = (String)re ...
- hadoop 2.x 简单实现wordCount
简单实现hadoop程序,包括:hadoop2.x的实现写法 import org.apache.hadoop.conf.Configured; import org.apache.hadoop.fs ...
- Linux系统中常见文件系统格式
Windows常用的分区格式有三种,分别是FAT16.FAT32.NTFS格式. 在Linux操作系统里有Ext2.Ext3.Linux swap和VFAT四种格式. FAT16: 作为一种文件名称, ...
- DDD实战进阶第一波(十):开发一般业务的大健康行业直销系统(实现经销商登录仓储与逻辑)
上一篇文章主要讲了经销商注册的仓储和领域逻辑的实现,我们先把应用服务协调完成经销商注册这部分暂停一下,后面文章统一讲. 这篇文章主要讲讲经销商登录的仓储和相关逻辑的实现. 在现代应用程序前后端分离的实 ...
- Python_性能测试
使用pip安装Python扩展库memory_profiler from memory_profiler import profile @profile #修饰器 def isPrime(n): if ...
- Axios源码深度剖析 - 替代$.ajax,成为xhr的新霸主
前戏 在正式开始axios讲解前,让我们先想想,如何对现有的$.ajax进行简单的封装,就可以直接使用原声Promise了? let axios = function(config){ return ...
- 常用的TCP选项
MSS选项:通知最大可接收量.发送SYN的TCP一端使用本选项通告对端它的最大分节大小(maximum segment size)即MSS,也就是它在本连接的每个TCP分节中愿意接受的最大数据量.发送 ...