• 学习java的第三十一天。。。(网络编程)


    Socket简介

    Socket的底层机制复杂,Java平台提供了一些简单的API,可以更简单有效的使用Socket开发而无需了解底层机制
    通信链路的端点就被称为“套接字”(英文名Socket)
    是提供给应用程序的接口

    什么是Socket

    简单来说就是IP地址与端口的结合协议  一种地址与端口的结合描述协议
    TCP/IP协议的相关API的总称;是网络Api的集合实现
    涵盖了:Stream Socket/ Datagram Socket

    Socket的作用与组成

    在网络传输中用于唯一标识两个端点之间的连接
    端点:包括(IP+Port)
    4个要素:客户端地址、客户端端口、服务器地址、服务器端口

    Socket之TCP

    TCP是面向连接的通信协议
    通过三次握手建立连接,通讯完成时要拆除连接
    由于TCP是面向连接的所以只能用于端到端的通讯
     

    Socket之UDP

    UDP是面向无连接的通讯协议
    UDP数据包括目的端口号和源端口号信息
    由于通讯不需要连接,所以可以实现广播发送,并不局限于端到端

    java.net包

    Socket
    ServerSocket
    DatagramPacket
    DatagramSocket
    InetAddress
    …………

    基于TCP协议的Socket编程

    Socket网络编程一般可以分成如下步骤进行

        建立连接
        打开Socket关联的输入输出流
        数据流中读写信息
        关闭所有的数据流和Socket

    Socket中实现对象的传递

    序列化传递对象信息 :ObjectOutputStream  oos = new  ObjectOutputStream(…);
    oos.writeObject(…);

    ObjectInputStream  ois = new  ObjectInputStream(…);
    Object = ois.readObject();

    多线程处理多请求

        采用多线程的方式
        一个专门负责监听的应用主服务程序
        一个专门负责处理请求的线程程序

     

    1. public static void main(String[] args) {
    2. // 创建通信链路的端点客户端套接字
    3. Socket socket =null;
    4. OutputStream os = null;
    5. InputStream is =null;
    6. BufferedReader br =null;
    7. try {
    8. socket = new Socket("localhost",10086);
    9. //获取输出流将数据发送出去
    10. os= socket.getOutputStream();
    11. String str = "用户名:芝士雪豹,密码:123456";
    12. byte[] bytes=str.getBytes();
    13. //通过输出流调用方法将数据发送出去
    14. os.write(bytes);
    15. System.out.println("数据发送完毕");
    16. //关闭通道
    17. socket.shutdownOutput();
    18. is =socket.getInputStream();
    19. br = new BufferedReader(new InputStreamReader(is));
    20. String result =br.readLine();
    21. System.out.println("我是客户端,接收到的服务器端响应信息为:"+result);
    22. } catch (UnknownHostException e) {
    23. // TODO Auto-generated catch block
    24. e.printStackTrace();
    25. } catch (IOException e) {
    26. // TODO Auto-generated catch block
    27. e.printStackTrace();
    28. }finally{
    29. try {
    30. br.close();
    31. is.close();
    32. os.close();
    33. socket.close();
    34. } catch (IOException e) {
    35. e.printStackTrace();
    36. }
    37. }
    38. }

     

    1. public static void main(String[] args) {
    2. // 创建服务器端套接字ServerSocket
    3. ServerSocket ss = null;
    4. Socket socket = null;
    5. InputStream is = null;
    6. BufferedReader br = null;
    7. OutputStream os = null;
    8. try {
    9. ss = new ServerSocket(10086);
    10. //服务器通过调用侦听方法来获取客户端请求
    11. socket = ss.accept();
    12. //通过返回的Socket对象调用方法获取一个输入流来读取客户端发送过来的信息
    13. is = socket.getInputStream();
    14. //通过输入流读取客户端发送的消息
    15. br = new BufferedReader(new InputStreamReader(is));
    16. String str = br.readLine();
    17. System.out.println("我这边是服务器,我接受到的消息是"+str);
    18. os= socket.getOutputStream();
    19. String result = "密码正确,我测你们码";
    20. byte[] bytes=result.getBytes();
    21. //通过输出流调用方法将数据发送出去
    22. os.write(bytes);
    23. System.out.println("给客户端的响应信息发送成功");
    24. } catch (IOException e) {
    25. // TODO Auto-generated catch block
    26. e.printStackTrace();
    27. }finally{
    28. try {
    29. os.close();
    30. br.close();
    31. is.close();
    32. socket.close();
    33. ss.close();
    34. } catch (IOException e) {
    35. // TODO Auto-generated catch block
    36. e.printStackTrace();
    37. }
    38. }
    39. }
    1. public class Student implements Serializable{
    2. /** 用户名 */
    3. private String loginName;
    4. /** 用户密码 */
    5. private String age;
    6. public Student() {
    7. super();
    8. }
    9. public Student(String loginName, String age) {
    10. super();
    11. this.loginName = loginName;
    12. this.age = age;
    13. }
    14. public String getLoginName() {
    15. return loginName;
    16. }
    17. public void setLoginName(String loginName) {
    18. this.loginName = loginName;
    19. }
    20. public String getAge() {
    21. return age;
    22. }
    23. public void setAge(String age) {
    24. this.age = age;
    25. }
    26. }

    基于UDP协议的Socket编程

    基于UDP协议的Socket网络编程步骤

        利用 DatagramPacket 对象封装数据包
        利用 DatagramSocket 发送数据包
        利用 DatagramSocket 接收数据包
        利用 DatagramPacket 处理数据包

     

    1. public class Receive {
    2. public static void main(String[] args) {
    3. DatagramSocket ds = null;
    4. //创建DatagramPacket对象,用来准备接收数据
    5. byte[] buf = new byte[1024];
    6. DatagramPacket dp = new DatagramPacket(buf, 1024);
    7. try {
    8. ds = new DatagramSocket(8800);
    9. ds.receive(dp);
    10. //显示接收到的信息
    11. String mess = new String(dp.getData(), 0, dp.getLength());
    12. System.out.println(dp.getAddress().getHostAddress()+"说:"+mess);
    13. } catch (SocketException e) {
    14. // TODO Auto-generated catch block
    15. e.printStackTrace();
    16. } catch (IOException e) {
    17. // TODO Auto-generated catch block
    18. e.printStackTrace();
    19. }finally{
    20. ds.close();
    21. }
    22. }
    23. }

     

    1. public class Send {
    2. public static void main(String[] args) {
    3. String mess = "您好,我想咨询一个问题";
    4. //创建inetAddress,获取本地主机地址
    5. InetAddress ia = null;
    6. DatagramSocket ds = null;
    7. try {
    8. ia = InetAddress.getByName("localhost");
    9. //创建DataGramPacket对象,封装数据
    10. DatagramPacket dp = new DatagramPacket(mess.getBytes(), mess.getBytes().length, ia,8800);
    11. //创建DatagramSocket对象,向服务器发送数据
    12. ds = new DatagramSocket();
    13. ds.send(dp);
    14. } catch (UnknownHostException e) {
    15. // TODO Auto-generated catch block
    16. e.printStackTrace();
    17. } catch (SocketException e) {
    18. // TODO Auto-generated catch block
    19. e.printStackTrace();
    20. } catch (IOException e) {
    21. // TODO Auto-generated catch block
    22. e.printStackTrace();
    23. }finally{
    24. ds.close();
    25. }
    26. }
    27. }

  • 相关阅读:
    java+php+python的公文审批系统-办公系统
    网络攻防原理与技术 第一章 课后题
    生物科技和基因编辑技术
    kafka如何保证消息不丢?
    好看的货架效果(含3D效果)
    函数指针、函数指针数组、计算器+转移表等归纳总结
    【elasticsearch】搜索过程详解
    tcp记录
    04.封装radio与radio-group组件
    如何在Linux以docker-compose方式快速部署运行StackEdit,并实现公网访问
  • 原文地址:https://blog.csdn.net/qihaojinqiuma/article/details/126485089