我的学习阶段是跟着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(); } }