网络编程——基于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.创建一个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盘根目录下,用命令行的形式来运行。

打开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
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盘根目录下,用命令行的形式来运行。

打开cmd,编译java,步骤:
① 进入e盘。 e:
② 编译以UDP开头的文件。 javac –d . UDP*.java
③ 先运行接收端。 java com.iotek.tcpsocket.UDPDemo2
④ 重新打开一个命令行,运行发送端。 java com.iotek.tcpsocket.UDPDemo1

网络编程——基于TCP协议的Socket编程,基于UDP协议的Socket编程的更多相关文章
- [深入浅出WP8.1(Runtime)]Socket编程之UDP协议
13.3 Socket编程之UDP协议 UDP协议和TCP协议都是Socket编程的协议,但是与TCP协议不同,UDP协议并不提供超时重传,出错重传等功能,也就是说其是不可靠的协议.UDP适用于一次只 ...
- TCP大文件上传与UDP协议
一.UCP大文件上传(解决粘包问题) ①客户端 import socket, os, json, struct client = socket.socket() client.connect(('12 ...
- 通过套接字(socket)和UDP协议实现网络通信
UDP---用户数据报协议,是一个简单的面向数据报的运输层协议.(无连接.封包.大小限制.速度快). 一.UDP协议的特点: 将数据及源和目的地封装成数据包中,不需要建立连接. 每个数据报的大小限制在 ...
- TCP/IP详解之:UDP协议
第11章 UDP协议 UDP首部 UDP的检验和是可选的,而TCP的检验和是必须的: UDP的检验和是端到端的检验和.由发送端计算,由接收端验证: 尽管UDP的检验和是可选的,但总是推荐被使用 IP ...
- TCP/IP五层模型-传输层-UDP协议
1.定义:UDP:是非面向连接.不可靠的用户数据包协议. 2.应用场景:适合对数据完整性要求不高,但对延迟很敏感,比如即时通信(语音视频聊天等). 3.UDP报文格式: 4.用UDP传输数据的应用层 ...
- 网络编程—网络基础概览、socket,TCP/UDP协议
网络基础概览 socket概览 socket模块—TCP/UDP的实现 TCP/UDP总结 网络基础概览 osi七层协议各层主要的协议 # 物理层传输电信号1010101010 # 数据链路层,以太网 ...
- 网络编程(四)——基于udp协议的套接字socket、socketserver模块的使用
基于udp协议的套接字.socketserver模块 一.UDP协议(数据报协议) 1.何为udp协议 不可靠传输,”报头”部分一共只有8个字节,总长度不超过65,535字节,正好放进一个IP数据包. ...
- 基于UDP协议的socket编程
UDP协议特点: 1.无连接.服务端与客户端传输数据之前不需要进行连接,且没有超时重发等机制,只是把数据通过网络发送出去.也正是因为此特点,所以基于UDP协议的socket的客户端在启动之前不需要先启 ...
- python 网络编程 tcp和udp 协议
1. 网络通信协议 osi七层,tcp\ip五层 tcp\ip五层 arp协议:通过IP地址找到mac地址 2.tcp和udp的区别 tcp协议:面向连接,消息可靠,相对udp来讲,传输速度慢,消息是 ...
- 网络编程(四)--基于udp协议的套接字、socketserver模块
一.UDP协议(数据报协议) 1.何为udp协议 不可靠传输,”报头”部分一共只有8个字节,总长度不超过65,535字节,正好放进一个IP数据包. 以太网头 ip头 ...
随机推荐
- ios 设置声音和震动,单独控制
一.今天项目中涉及了设置这快的声音震动和响铃,搞的头大,以前搞过,只是简单的调用系统的方法就可以实现,但是现在的公司要求,震动是震动,响铃是响铃,我看了微信,微信也是的分开的,做的很好,但是我就纳闷了 ...
- AngularJS-系统代码的配置和翻译
前言:在Web开发中常常会遇到这样的情况,有些页面的下拉选项是固定不变的几个,比如:性别,一般有男.女.保密等.对于这样的情形我们一般在数据库中存储的是数字或者其对应的代码,如果是可维护的需要系统给出 ...
- .vimrc vim 配置大全
map <F9> :call SaveInputData()<CR>func! SaveInputData() exec "tabnew" exec 'no ...
- MyBatis学习总结(七)——Mybatis缓存(转载)
孤傲苍狼 只为成功找方法,不为失败找借口! MyBatis学习总结(七)--Mybatis缓存 一.MyBatis缓存介绍 正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的 ...
- CMakeLists.txt for nginx
project(nginx) cmake_minimum_required(VERSION 2.8) aux_source_directory(. SRC_LIST) aux_source_direc ...
- OpenGL ES 中的模板测试
模板测试的主要功能是丢弃一部分片元,相对于深度检测来说,模板测试提出的片元数量相对较少.模板测试发生在剪裁测试之后,深度测试之前. 使用模板测试时很重要的代码提示: 1.glClear( GL_STE ...
- 19.dnw打不开
用dnw.exe烧写文件时,突然出现电脑死机,重启后,dnw就打不开了,dnw.ini的原因,该文件在c盘目录下,只需要删除它,就可以继续使用dnw了.
- Java开发环境配置
JDK下载地址: http://www.oracle.com/technetwork/java/javase/downloads/index.html 安装:双击exe文件一直下一步就Ok了. 环境变 ...
- Json与Bean互转,Timestamp类型的问题
Json与Java Bean互相转换时,Bean中的Timestamp字段是无法直接处理的,需要实现两个转换器. DateJsonValueProcessor的作用是Bean转换为Json时将Time ...
- delphi IOS 获取电池信息
procedure TDeviceInfoForm.btnGetDeviceInfoClick(Sender: TObject); var Device : UIDevice; begin Devic ...