10.30 学习总结
JAVA
- 问题一:
TCP代码为什么TCP的服务端不能够收到客户端发送过来的东西,貌似是连接建立没有成功?但是客户端那里显示文件发送成功了。询问ChatGpt无果。目前还没有处理好这个问题。
TCP的过程比UDP要复杂一些:
- 对于客户端来说:
- 先创建
socket
,这个socket
需要传入服务端的端口号以及对应的IP地址;- 对于
socket
类是通信的关键:在客户端创建socket
对象,指定服务器的IP地址和端口号, - 也能获得对应的输入输出流
- 服务器则使用
ServerSocket
在指定的端口监听客户端的连接请求 - 当有客户端连接时,
ServerSocket
会返回一个新的Socket
对象,用于与客户端进行通信。
- 对于
- 第二步进行文件的输入,将文件先读入内存中(即创建输入流)
- 第三步将刚才读入的文件输出,故先要创建输出流。由于输出的方向是朝着服务器,所以要使用socket对象中的输出流,即
getOutputStream
- 输出到服务器的过程即第四步,通过一个buffer数组进行传输。
public class TcpTest2 { @Test public void client() throws IOException { //1创建socket InetAddress inetAddress = InetAddress.getByName("127.0.0.1"); int port = 9090; Socket socket = new Socket(inetAddress,port); //2创建file实例,创建输入流, File file = new File("pic.png"); FileInputStream fis = new FileInputStream(file); //3通过socket获得输出流 OutputStream os = socket.getOutputStream(); //4读写数据 byte[] buffer = new byte[1024]; int len; while ((len = fis.read(buffer)) != -1){ os.write(buffer,0,len); } System.out.println("数据发送完毕"); //接受来自服务器端 InputStream is = socket.getInputStream(); ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); byte[] buffer2 = new byte[5]; int len2; while ((len2 = is.read(buffer2)) != - 1){ byteArrayOutputStream.write(buffer2,0,len2); } socket.shutdownOutput(); //5关闭相关流与资源 os.close(); fis.close(); socket.close(); } @Test public void server() throws IOException{ //1socket int port = 9090; ServerSocket serverSocket = new ServerSocket(port); //2使用accept方法接受来自于客户端的socket Socket socket = serverSocket.accept(); //3输入流 InputStream inputStream = socket.getInputStream(); //4file实例,output实例 File file = new File("pic_copy.png"); FileOutputStream fileOutputStream = new FileOutputStream(file); //5读写数据 byte[] buffer = new byte[1024]; int len; while ((len = inputStream.read(buffer)) != - 1){ fileOutputStream.write(buffer,0,len); } System.out.println("数据接受完毕"); //6服务端发送数据给客户端 OutputStream os = socket.getOutputStream(); os.write("很漂亮" .getBytes()); //7关闭 os.close(); fileOutputStream.close(); inputStream.close(); socket.close(); serverSocket.close(); }
- 对于服务器而言:
- 同样先创建关键的socket,不过服务器是ServerSocket,注意ServeSocket构造器只需要接受端口号作为初始化参数
- 第二步也十分关键,需要使用其
accept
方法来接受对方的socket,然后以接收到的这个socket作为双方通信的桥梁。 - 第三步依然通过socket来创建文件的输入流
- 由于要把文件写到服务器上的存储中,即可以看做输入流目前在服务器的内存中,要写到本地硬盘中,所以创建文件输入流。
- 接下来的操作就是正常的读写数据了。
- 先创建
- 所以为什么没有进行成功通信呢?
- 问题二:
今天刚刚入门反射,感觉JAVA的更新一直是为了更好地便捷地去写一些代码,甚至会去”打破“自己之前的一些”死“规定。反射刚开始就对我造成了冲击,这不是跟封装的思想刚好相反吗?但是这个问题留给了明天,明天学完反射这一章节再来给自己解释。
Python
3. 问题一:
在国外的课程中貌似对于frame和enviornment这两个概念很重视,还画了许多frame框架图来解释一些复杂的嵌套环境下的运行情况。国内的教程好像没有这么讲的吧?听国外的课程对于英语听力的要求还是有点高的,毕竟自带的中文翻译还是有点抽象的,并且打开还遮住了视频底下很大一部分,观感十分不好。
4. 问题二:
其实最近比较难的就在于高阶函数Higher-Order Function
和闭包这两个概念这里。慢慢嚼吧,今天已经到十一点了睡觉了。