• 20145223《Java程序程序设计》第10周学习总结


    20145223《Java网络编程》

    一、Java的网络编程

    ·网络编程是指编写运行在多个设备(计算机)的程序,这些设备都通过网络连接起来。

    ·java.net包中J2SE的API包含有类和接口,它们提供低层次的通信细节。你可以直接使用这些类和接口,来专注于解决问题,而不用关注通信细节。

    ·java.net包中提供了两种常见的网络协议的支持:

    ·TCP: TCP是传输控制协议的缩写,它保障了两个应用程序之间的可靠通信。通常用于互联网协议,被称TCP / IP。

    ·UDP: UDP是用户数据报协议的缩写,一个无连接的协议。提供了应用程序之间要发送的数据的数据包。

    二、TCP编程

    1.客户端:

    ·在客户端网络编程中,首先需要建立连接,在Java API中以java.net.Socket类的对象代表网络连接,所以建立客户端网络连接,也就是创建Socket类型的对象。

    2.服务器端:

    ·在服务器端程序编程中,由于服务器端实现的是被动等待连接,所以服务器端编程的第一个步骤是监听端口,也就是监听是否有客户端连接到达。

    3.服务器端编程的第二个步骤是获得连接。该步骤的作用是当有客户端连接到达时,建立一个和客户端连接对应的Socket连 接对象,从而释放客户端连接对于服务器端端口的占用。实现功能就像公司的前台一样,当一个客户到达公司时,会告诉前台我找某某某,然后前台就·通知某某某, 然后就可以继续接待其它客户了。通过获得连接,使得客户端的连接在服务器端获得了保持,另外使得服务器端的端口释放出来,可以继续等待其它的客户端连接。

    4.客户端和服务器现在可以通过对Socket对象的写入和读取来进行进行通信。

    5.连接建立后,通过使用I/O流在进行通信。每一个socket都有一个输出流和一个输入流。客户端的输出流连接到服务器端的输入流,而客户端的输入流连接到服务器端的输出流。

    6.TCP是一个双向的通信协议,因此数据可以通过两个数据流在同一时间发送.以下是一些类提供的一套完整的有用的方法来实现sockets。

    ·使用套接字建立TCP连接步骤:
    服务器实例化一个ServerSocket对象,表示通过服务器上的端口通信。
    服务器调用 ServerSocket类 的accept()方法,该方法将一直等待,直到客户端连接到服务器上给定的端口。
    服务器正在等待时,一个客户端实例化一个Socket对象,指定服务器名称和端口号来请求连接。
    Socket类的构造函数试图将客户端连接到指定的服务器和端口号。如果通信被建立,则在客户端创建一个Socket对象能够与服务器进行通信。
    在服务器端,accept()方法返回服务器上一个新的socket引用,该socket连接到客户端的socket。

    Socket编程中需要注意的问题

    隐患 1.忽略返回状态 第一个隐患很明显,但它是开发新手最容易犯的一个错误。
    如果您忽略函数的返回状态,当它们失败或部分成功的时候,您也许会迷失。
    反过来,这可能传播错误,使定位问题的源头变得困难。
    捕获并检查每一个返回状态,而不是忽略它们。

    隐患 2.对等套接字闭包

    隐患 3.地址使用错误(EADDRINUSE) 您可以使用 bind API 函数来绑定一个地址(一个接口和一个端口)到一个套接字端点。可以在服务器设置中使用这个函数,以便限制可能有连接到来的接口。也可以在客户端设置中使用这个函数,以便限制应当供出去的连接所使用的接口。bind 最常见的用法是关联端口号和服务器,并使用通配符地址(INADDR_ANY),它允许任何接口为到来的连接所使用。

    隐患 4.发送结构化数据

    隐患 5.TCP 中的帧同步假定

    java.net.SocketException四大异常解决方案

    java.net.BindException:Address already in use: JVM_Bind。
    该异常发生在服务器端进行new ServerSocket(port)(port是一个0,65536的整型值)操作时。异常的原因是以为与port一样的一个端口已经被启动,并进行监听。此时用netstat –an命令,可以看到一个Listending状态的端口。只需要找一个没有被占用的端口就能解决这个问题。

    2.java.net.SocketException: Connection refused: connect。

    该异常发生在客户端进行 new Socket(ip, port)操作时,该异常发生的原因是或者具有ip地址的机器不能找到(也就是说从当前机器不存在到指定ip路由),或者是该ip存在,但找不到指定的端口进行监听。出现该问题,首先检查客户端的ip和port是否写错了,如果正确则从客户端ping一下服务器看是否能ping通,如果能ping通(服务服务器端把ping禁掉则需要另外的办法),则看在服务器端的监听指定端口的程序是否启动,这个肯定能解决这个问题。

    3.java.net.SocketException: Socket is closed,

    该异常在客户端和服务器均可能发生。异常的原因是己方主动关闭了连接后(调用了Socket的close方法)再对网络连接进行读写操作。

    4.java.net.SocketException: (Connection reset或者Connect reset by peer:Socket write error)。

    该异常在客户端和服务器端均有可能发生,引起该异常的原因有两个,第一个就是如果一端的Socket被关闭(或主动关闭或者因为异常退出而引起的关闭),另一端仍发送数据,发送的第一个数据包引发该异常(Connect reset by peer)。另一个是一端退出,但退出时并未关闭该连接,另一端如果在从连接中读数据则抛出该异常(Connection reset)。简单的说就是在连接断开后的读和写操作引起的。

    学习进度条

    代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
    目标 4000行 20篇 400小时
    第一周 200/200 1/1 15/12
    第二周 180/380 1/1 18/12
    第三周 600/980 1/1 17/16
    第四周 400/380 1/1 16/15
    第五周 300/680 1/1 14/14
    第六周 200/200 2/2 10/10
    第七周 100/100 2/2 10/10
    第八周 50/50 1/2 5/5
    第九周 70/70 1/1 8/8
    第十周 20/20 1/1 8/8
  • 相关阅读:
    freemarker模版引擎技术总结
    ajax跨域访问数据
    mysql 导入 大sql文件
    Python获取并输出当前日期时间
    Pandas dataframe数据写入文件和数据库
    java DTO 转 POJO
    vs2008 c#项目调试dll源码,问题:“若要调试此模块,请将其项目生成配置更改为“调试”模式” 的解决方案
    sqlserver 2008 merger语句
    sqlserver查询数据库中有多少个表,多少视图,多少存储过程,或其他对象
    sqlserver中select造成死锁
  • 原文地址:https://www.cnblogs.com/20145223ymy/p/5471795.html
Copyright © 2020-2023  润新知