网络编程——基于TCP协议的Socket编程,基于UDP协议的Socket编程

时间:2022-02-06 09:04:30

Socket编程

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

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

网络编程——基于TCP协议的Socket编程,基于UDP协议的Socket编程

Socket概述

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

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

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

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

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

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

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

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

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

网络编程——基于TCP协议的Socket编程,基于UDP协议的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.创建一个ServerSocket对象
ServerSocket serverSocket = new ServerSocket(8888);
// 2.调用accept()方法接受客户端请求
Socket socket = serverSocket.accept();
System.out.println(socket.getInetAddress().getHostAddress() + "连接成功");
// 3.获取socket对象的输入输出流
BufferedReader br = new BufferedReader(new InputStreamReader(
socket.getInputStream())); PrintWriter pw = new PrintWriter(socket.getOutputStream(), true);
String line = null;
// 读取客户端传过来的数据
while ((line = br.readLine()) != null) {
if (line.equals("over")) {
break;
}
System.out.println(line);
pw.println(line.toUpperCase());
} pw.close();
br.close();
socket.close();
System.out.println(socket.getInetAddress().getHostAddress() + "断开连接");

客户端:

         Socket socket = new Socket("127.0.0.1", 8888);
BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); PrintWriter pw = new PrintWriter(socket.getOutputStream(), true);
BufferedReader reader = new BufferedReader(new InputStreamReader(
socket.getInputStream()));
while (true) {
String line = br.readLine();// 获取键盘所输入的字符串
pw.println(line);
if (line.equals("over")) {
break;
}
System.out.println(reader.readLine());// 获取服务端传过来的大写字符串
}
reader.close();
br.close();
pw.close();
socket.close();

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

网络编程——基于TCP协议的Socket编程,基于UDP协议的Socket编程

打开cmd,编译java,步骤

① 进入e盘。  e:

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

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

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

连接成功

网络编程——基于TCP协议的Socket编程,基于UDP协议的Socket编程

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

网络编程——基于TCP协议的Socket编程,基于UDP协议的Socket编程

输入over,断开连接

网络编程——基于TCP协议的Socket编程,基于UDP协议的Socket编程

基于UDP协议的Socket编程

① 创建发送端

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

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

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

d)     将socket关闭。

② 创建接收端

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

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

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

d)     将socket关闭。

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

发送端:UDPDemo1

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

接收端:UDPDemo2

         // 先接收数据
DatagramSocket socket = new DatagramSocket(6666);
byte[] buff = new byte[100];
DatagramPacket packet = new DatagramPacket(buff, 100);
socket.receive(packet);// 接受传来的数据包
System.out.println(new String(buff, 0, packet.getLength())); // 发送数据
String str = "me too";
DatagramPacket packet2 = new DatagramPacket(str.getBytes(),
str.length(), packet.getAddress(), packet.getPort());
socket.send(packet2);
socket.close();

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

网络编程——基于TCP协议的Socket编程,基于UDP协议的Socket编程

打开cmd,编译java,步骤:

① 进入e盘。  e:

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

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

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

网络编程——基于TCP协议的Socket编程,基于UDP协议的Socket编程

网络编程——基于TCP协议的Socket编程,基于UDP协议的Socket编程的更多相关文章

  1. [深入浅出WP8.1(Runtime)]Socket编程之UDP协议

    13.3 Socket编程之UDP协议 UDP协议和TCP协议都是Socket编程的协议,但是与TCP协议不同,UDP协议并不提供超时重传,出错重传等功能,也就是说其是不可靠的协议.UDP适用于一次只 ...

  2. TCP大文件上传与UDP协议

    一.UCP大文件上传(解决粘包问题) ①客户端 import socket, os, json, struct client = socket.socket() client.connect(('12 ...

  3. 通过套接字(socket)和UDP协议实现网络通信

    UDP---用户数据报协议,是一个简单的面向数据报的运输层协议.(无连接.封包.大小限制.速度快). 一.UDP协议的特点: 将数据及源和目的地封装成数据包中,不需要建立连接. 每个数据报的大小限制在 ...

  4. TCP/IP详解之:UDP协议

    第11章 UDP协议  UDP首部 UDP的检验和是可选的,而TCP的检验和是必须的: UDP的检验和是端到端的检验和.由发送端计算,由接收端验证: 尽管UDP的检验和是可选的,但总是推荐被使用 IP ...

  5. TCP/IP五层模型-传输层-UDP协议

    ​1.定义:UDP:是非面向连接.不可靠的用户数据包协议. 2.应用场景:适合对数据完整性要求不高,但对延迟很敏感,比如即时通信(语音视频聊天等). 3.UDP报文格式: 4.用UDP传输数据的应用层 ...

  6. 网络编程—网络基础概览、socket,TCP/UDP协议

    网络基础概览 socket概览 socket模块—TCP/UDP的实现 TCP/UDP总结 网络基础概览 osi七层协议各层主要的协议 # 物理层传输电信号1010101010 # 数据链路层,以太网 ...

  7. 网络编程(四)——基于udp协议的套接字socket、socketserver模块的使用

    基于udp协议的套接字.socketserver模块 一.UDP协议(数据报协议) 1.何为udp协议 不可靠传输,”报头”部分一共只有8个字节,总长度不超过65,535字节,正好放进一个IP数据包. ...

  8. 基于UDP协议的socket编程

    UDP协议特点: 1.无连接.服务端与客户端传输数据之前不需要进行连接,且没有超时重发等机制,只是把数据通过网络发送出去.也正是因为此特点,所以基于UDP协议的socket的客户端在启动之前不需要先启 ...

  9. python 网络编程 tcp和udp 协议

    1. 网络通信协议 osi七层,tcp\ip五层 tcp\ip五层 arp协议:通过IP地址找到mac地址 2.tcp和udp的区别 tcp协议:面向连接,消息可靠,相对udp来讲,传输速度慢,消息是 ...

  10. 网络编程(四)--基于udp协议的套接字、socketserver模块

    一.UDP协议(数据报协议) 1.何为udp协议 不可靠传输,”报头”部分一共只有8个字节,总长度不超过65,535字节,正好放进一个IP数据包. 以太网头 ip头                  ...

随机推荐

  1. 了解npm的文件结构(npm-folders)和配置文件(npm-mrc)

    一.npm的文件结构 npm的安装: 本地安装 1. 将安装包放在 ./node_modules 下(运行 npm 命令时所在的目录),如果没有 node_modules 目录,会在当前执行 npm ...

  2. Android四大核心组件之ContentProvider

    实验内容 学习ContextProvider用法 编码实现简单ContextProvider功能 实验要求 通过简单代码了解ContextProvider功能和用法 实验步骤 ContextProvi ...

  3. Java多线程基本概念

    基本概念 线程与任务的概念不一样. 任务:通常是一些抽象的且离散的工作单元,比如在Web请求中,针对用户的请求需要返回相应的页面是一个任务,在Java中实现Runnable接口的类也是一个任务. 线程 ...

  4. Allegro Out Of Date Shapes原因及解决方法

    使用Allegro设计PCB板时,查看Status,经常会遇到out of date shapes的警告信息,具体如下: dynamic shape is still out of data or e ...

  5. hdfs文件系统架构详解

    hdfs文件系统架构详解 官方hdfs分布式介绍 NameNode *Namenode负责文件系统的namespace以及客户端文件访问 *NameNode负责文件元数据操作,DataNode负责文件 ...

  6. MyBatis+PageHelper实现分页

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/7256105.html 前面讲到Spring+SpringMVC+MyBatis深入学习及搭建(十七)--Sp ...

  7. 利用HTML5,前端js实现图片压缩

    http://blog.csdn.NET/qazwsx2345/article/details/21827553 主要用了两个HTML5的 API,一个file,一个canvas,压缩主要使用cnav ...

  8. JS学习笔记Day6

    一.数组 1.数组就是个容器,里面可以存放任意类型的数 2.定义数组:1)var arr = []: 2)var arr = new Array():构造函数定义方式,如果括号中有一个整数,该正数代表 ...

  9. rem、em 、font-size随着屏幕大小的改变而改变

    rem  的根标签是html 以html标签上设置的font-size的值为参考点 如: <div id="app"> <div id="son> ...

  10. Eclipse编译Android项目时出现的问题:Android requires compiler compliance level 5&period;0 or 6&period;0&period; Found &&num;39&semi;1&period;8&&num;39&semi; instead&period;

    Consle: Android requires compiler compliance level 5.0 or 6.0. Found '1.8' instead. Please use Andro ...