zoukankan      html  css  js  c++  java
  • 网络编程——基于TCP协议的Socket编程,基于UDP协议的Socket编程

    Socket编程

    目前较为流行的网络编程模型是客户机/服务器通信模式

    客户进程向服务器进程发出要求某种服务的请求,服务器进程响应该请求。如图所示,通常,一个服务器进程会同时为多个客户端进程服务,图中服务器进程B1同时为客户进程A1、A2和B2提供服务。

    Socket概述

    ①   所谓Socket通常也称作“套接字”,用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过“套接字”向网络发出请求或者应答网络请求。

    ②   Socket是连接运行在网络上的两个程序间的双向通信的端点。

    ③   网络通讯其实指的就是Socket间的通讯。

    ④   通讯的两端都有Socket,数据在两个Socket之间通过IO来进行传输。

     

    使用Socket进行网络通信的过程

    ①   服务器程序将一个套接字绑定到一个特定的端口,并通过此套接字等待和监听客户的连接请求。

    ②   客户程序根据服务器程序所在的主机和端口号发出连接请求。

    ③   如果一切正常,服务器接受连接请求。并获得一个新的绑定到不同端口地址的套接字。

    ④   客户和服务器通过读、写套接字进行通讯。

    基于TCP协议的Socket编程

    ①   创建TCP服务端步骤:

    a)         创建一个ServerSocket对象

    b)         调用accept()方法接受客户端请求

    c)         从Socket中获取I/O流

    d)         对I/O流进行读写操作,完成与客户端的交互

    e)         关闭I/O流和Socket

    ②   创建TCP客户端步骤:

    a)         创建一个Socket对象

    b)         从Socket中获取I/O流

    c)         对I/O流进行读写操作,完成与服务端的交互

    d)         关闭I/O流和Socket

    注:客户端和服务端进行数据传输时,客户端的输入流对应服务端的输出流,客户端的输出流对应服务端的输入流。

     

    示例:创建一个客户端与服务端通信的例子

    包名:com.iotek.tcpsocket

    服务端:

     1         // 1.创建一个ServerSocket对象
     2         ServerSocket serverSocket = new ServerSocket(8888);
     3         // 2.调用accept()方法接受客户端请求
     4         Socket socket = serverSocket.accept();
     5         System.out.println(socket.getInetAddress().getHostAddress() + "连接成功");
     6         // 3.获取socket对象的输入输出流
     7         BufferedReader br = new BufferedReader(new InputStreamReader(
     8                 socket.getInputStream()));
     9 
    10         PrintWriter pw = new PrintWriter(socket.getOutputStream(), true);
    11         String line = null;
    12         // 读取客户端传过来的数据
    13         while ((line = br.readLine()) != null) {
    14             if (line.equals("over")) {
    15                 break;
    16             }
    17             System.out.println(line);
    18             pw.println(line.toUpperCase());
    19         }
    20 
    21         pw.close();
    22         br.close();
    23         socket.close();
    24         System.out.println(socket.getInetAddress().getHostAddress() + "断开连接");

    客户端:

     1         Socket socket = new Socket("127.0.0.1", 8888);
     2         BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
     3 
     4         PrintWriter pw = new PrintWriter(socket.getOutputStream(), true);
     5         BufferedReader reader = new BufferedReader(new InputStreamReader(
     6                 socket.getInputStream()));
     7         while (true) {
     8             String line = br.readLine();// 获取键盘所输入的字符串
     9             pw.println(line);
    10             if (line.equals("over")) {
    11                 break;
    12             }
    13             System.out.println(reader.readLine());// 获取服务端传过来的大写字符串
    14         }
    15         reader.close();
    16         br.close();
    17         pw.close();
    18         socket.close();

    为了更直观的看见通信过程,将2个java程序复制到E盘根目录下,用命令行的形式来运行。

    打开cmd,编译java,步骤

    ① 进入e盘。  e:

    ② 编译所有java文件。 javac –d . *.java

    ③ 打开服务端。    java com.iotek.tcpsocket.TCPServer

    ④ 再打开一个cmd命令行用于打开客户端java com.iotek.tcpsocket.TCPClient

     连接成功

    在客户端输入hello回车之后测试成功。

    输入over,断开连接

    基于UDP协议的Socket编程

    ① 创建发送端

    a)     建立DatagramSocket对象。该端点建立,系统会随机分配一个端口。如果不想随机配置,可以手动指定。

    b)     将数据进行packet包的封装,必须要指定目的地地址和端口。

    c)     通过socket服务的send方法将该包发出。

    d)     将socket关闭。

    ② 创建接收端

    a)     建立DatagramSocket对象。要监听一个端口。

    b)     通过socket的receive方法将数据存入数据包中。

    c)     通过数据包dp的方法getData()、getAddress()、getPort()等方法获取包中的指定信息。

    d)     将socket关闭。

     

    示例:创建一个发送与接收的例子

    发送端:UDPDemo1

     1         DatagramSocket socket = new DatagramSocket();
     2         String str = "i love you";
     3         // 把数据进行封装到数据报包中
     4         DatagramPacket packet = new DatagramPacket(str.getBytes(),
     5                 str.length(), InetAddress.getByName("localhost"), 6666);
     6         socket.send(packet);// 发送
     7 
     8         byte[] buff = new byte[100];
     9         DatagramPacket packet2 = new DatagramPacket(buff, 100);
    10         socket.receive(packet2);
    11         System.out.println(new String(buff, 0, packet2.getLength()));
    12         socket.close();

    接收端:UDPDemo2

     1         // 先接收数据
     2         DatagramSocket socket = new DatagramSocket(6666);
     3         byte[] buff = new byte[100];
     4         DatagramPacket packet = new DatagramPacket(buff, 100);
     5         socket.receive(packet);// 接受传来的数据包
     6         System.out.println(new String(buff, 0, packet.getLength()));
     7 
     8         // 发送数据
     9         String str = "me too";
    10         DatagramPacket packet2 = new DatagramPacket(str.getBytes(),
    11                 str.length(), packet.getAddress(), packet.getPort());
    12         socket.send(packet2);
    13         socket.close();

    将2个java程序复制到E盘根目录下,用命令行的形式来运行。

    打开cmd,编译java,步骤:

    ① 进入e盘。  e:

    ②   编译以UDP开头的文件。 javac –d . UDP*.java

    ③   先运行接收端。  java com.iotek.tcpsocket.UDPDemo2

    ④   重新打开一个命令行,运行发送端。  java com.iotek.tcpsocket.UDPDemo1

  • 相关阅读:
    from __future__ import with_statement
    第六章 Flask数据库(二)
    python面向对象基础(四)内置方法 __xx__之new与init
    MySQL用户自定义变量
    iOS不得姐项目--appearance的妙用,再一次设置导航栏返回按钮,导航栏左右按钮的封装(巧用分类)
    iOS边练边学--NSURLSessionDataTask实现文件真正的断点续传
    iOS边练边学--AFNetWorking框架GET、Post、Download、Upload,数据解析模式以及监控联网状态
    iOS边练边学--NSURLSession、NSURLSessionTask的介绍与使用以及url中包含了中文的处理方法
    iOS开发小技巧--边接受数据边写入文件的两种方法
    iOS边练边学--文件压缩和解压缩的第三方框架SSZipArchive的简单使用
  • 原文地址:https://www.cnblogs.com/wzy330782/p/5479833.html
Copyright © 2011-2022 走看看