Socket网络编程TCP、UDP演示样例
Socket网络编程:
1) OSI(了解):
国际标准化组织ISO(International Orgnization for Standardization)指定了网络通信的模型:开放系统互联(OSI,Open System Interconnection),把网络通信工作分为七层:物理层(最底层)-数据链路层-网络层-传输层-会话层-表示层-应用层(应用程序)
|
数据格式 |
功能与连接方式 |
典型设备 |
|
|
应用层 |
网络服务与使用者应用程序间的一个接口 |
||
|
表示层 |
数据表示、数据安全、数据压缩 |
||
|
会话层 |
建立、管理和终止会话 |
||
|
传输层 |
数据组织成数据段Segment |
用一个寻址机制来标识一个特定的应用程序(port号) |
|
|
网络层 |
切割和又一次组合数据包Packet |
基于网络层地址(IP地址)进行不同网络系统间的路径选择 |
路由器 |
|
数据链路层 |
将比特信息封装成数据帧Frame |
在物理层上建立、撤销、标识逻辑链接和链路复用 以及差错校验等功能。通过使用接收系统的硬件地址或物理地址来寻址 |
网桥、交换机、网卡 |
|
物理层 |
传输比特(bit)流 |
建立、维护和取消物理连接 |
光纤、同轴电缆、 双绞线、中继器和集线器 |
2) TCP/IP模型:网络通信协议。将OSI简化为四层:
a. 应用层:
b. 传输层:TCP协议、UDP协议是传输层协议
c. 网络层:IP协议、ICMP协议是传输层协议
d. 网络接口层:
① TCP协议(传输控制协议):
传输层协议。面向连接(须要建立两方会话),可靠的(发送若没收回确认信息,则又一次发送)。速度慢。
建立TCP连接须要三次握手,终止它须要四次握手。比如:web应用。下载文件断点续传。
② UDP协议(用户数据报协议):
传输层协议。面向无连接(仅仅是一方发送)。不可靠(仅仅发送不确认,可能会丢包)。速度快,将数据压缩成数据包,数据报限制大小在64K以内。
如:CS,QQ,在线视频,语音电话。
③ IP协议:
网络层协议。面向无连接。
IP地址(IPv4)由4个字节组成。具有唯一性。依据网络号和主机号所占字节数分为ABCDE五类地址。
(參考《TCP/IP具体解释》)
④ ICMP协议:
网络层协议。面向无连接,用于传输出错报告控制信息.比方用于检查网络通不通的Ping命令,“Ping”的过程实际上就是ICMP协议工作的过程。
3) Socket网络编程:
① 原理:通过建立一个双向的网络通信连接实现数据交换,通信的两端都称作一个Socket。
② 广泛使用:能够在Linux。Unix,Windows平台使用而且C语言,JAVA都支持Socket。
③ 网络通讯要素:
IP地址、port号、传输协议
④ JAVA Socket通信须要java.net包下的Socket和ServerSocket实现client和server端。
建立连接所需的寻址信息是远程计算机的IP地址和port号。
port号:[了解]port号占两个字节。一台机器能够存在65536个port号,port有什么用呢?我们知道。一台拥有IP地址的主机能够提供很多服务,比方Web服务、FTP服务、SMTP服务等,这些服务全然能够通过1个IP地址来实现。那么,主机是如何区分不同的网络服务呢?显然不能仅仅靠IP地址,由于IP 地址与网络服务的关系是一对多的关系。实际上是通过“IP地址+port号”来区 分不同的服务的。
0-1024为系统保留port,ftpport是21,smtpport号25,pop3port号110,port号分为TCPport和UDPport,每一个都有65536个。
⑤ DNS:Domain Name System,域名系统 ,依据主机名找到对于的ip地址。先到C:\Windows\System32\drivers\etc\hosts文件里解析。
⑥ JAVA中使用网络编程:
a. UDP方式:
建立DatagramSocket对象。作为发送端和接收端。利用send和receive方法对数据包进行传输。建立DatagramPacket数据包作为发送和存储信息的载体。
通过getData、getPort、getAddress.getHostAddress等方法获取对方数据、对方port和对方主机ip地址。
b. TCP方式:
建立client:建立Socket对象,构造时指定连接的主机的ip地址/主机名、port。利用getInputStream、getOutputStream方法得到字节输入输出流。
TCP:
一句话:server端绑定(创建Socket时绑定)并监听(accept方法)一个port,client连接到这个port,两者通过各自建立一个socket,利用getOutputStream和getInputStream方法进行write和read,完毕通信,client使用的port是系统随机指定的,不必关心。
使用TCP进行网络编程。client向server端发送一个字符串。
server收到该字符串后将其打印到命令行上,然后向client返回该字符串的长度,最后。
client输出server端返回的该字符串的长度。
TCP_client.java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket; public class TCP_client {
public static void main(String[] args) throws IOException {
//创建一个流套接字并将其连接到指定 IP 地址/主机名的指定端口号。
Socket socket = new Socket("lj", 8888);
//Socket socket = new Socket("127.0.0.1", 8888);
System.out.println("client started");
//server端发送数据到客户端,从键盘获取该字符串
System.out.println("请输入字符串:");
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
String line = bufferedReader.readLine();
OutputStream outputStream = socket.getOutputStream();
outputStream.write(line.getBytes());
//客户端接收server端数据
InputStream inputStream = socket.getInputStream();
byte[] buf = new byte[1024];
int len = inputStream.read(buf);
String text = new String(buf,0,len);
System.out.println("长度为:"+text);
socket.close();
}
}
TCP_server.java
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket; public class TCP_server {
public static void main(String[] args) throws IOException {
//创建绑定到特定端口服务器Socket
ServerSocket serverSocket = new ServerSocket(8888);
System.out.println("server started...");
//监听该Socket端口
Socket socket = serverSocket.accept();
//服务器端接收client数据
InputStream inputStream = socket.getInputStream();
byte[] buf = new byte[1024];
int len = inputStream.read(buf);
String text = new String(buf,0,len);
System.out.println(text);
//服务器端发送返回数据到client
OutputStream outputStream = socket.getOutputStream();
outputStream.write(String.valueOf(text.length()).getBytes());
serverSocket.close();
}
}
UDP:
一句话。接收端绑定并监听一个port,建立数据包并通过Socket的receive(dp)方法接收,发送端建立数据包并指定接收端ip地址与port。通过Socket的send(dp)方法发送。
发送端使用的port是系统随机指定的,不必关心。
使用UDP进行网络编程。发送端向接收端发送一个字符串。接收端收到该字符串后将其打印到命令行上。
UDP_client.java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress; public class UDP_client {
public static void main(String[] args) throws IOException {
DatagramSocket socket = new DatagramSocket(10000);
System.out.println("client started...");
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
byte[] buf =reader.readLine().getBytes();
//第三个參数是发送的指定的Socket端口
DatagramPacket packet = new DatagramPacket(buf , buf.length,InetAddress.getByName("127.0.0.1"),1111);
socket.send(packet);//堵塞式
socket.close();
}
}
UDP_server.java
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket; public class UDP_server {
public static void main(String[] args) throws IOException {
DatagramSocket socket = new DatagramSocket(1111);
System.out.println("server started...");
byte[] buf = new byte[1024];
DatagramPacket packet = new DatagramPacket(buf,buf.length);//client数据包须要指定端口号,服务器端不用指定。 socket.receive(packet);
//packet.getPort()返回某台远程主机的端口号,此数据报将要发往该主机或者是从该主机接收到的。 System.out.println("http://"+packet.getAddress().getHostAddress()+":"+(packet.getPort()));
System.out.println(new String(packet.getData()));
socket.close();
}
}
Socket网络编程TCP、UDP演示样例的更多相关文章
- Socket网络编程(TCP/IP/端口/类)和实例
Socket网络编程(TCP/IP/端口/类)和实例 原文:C# Socket网络编程精华篇 转自:微冷的雨 我们在讲解Socket编程前,先看几个和Socket编程紧密相关的概念: TCP/IP层次 ...
- Socket网络编程-TCP编程
Socket网络编程-TCP编程 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.socket介绍 1>.TCP/IP协议 2>.跨网络的主机间通讯 在建立通信连接的 ...
- C编程规范, 演示样例代码。
/*************************************************************** *Copyright (c) 2014,TianYuan *All r ...
- 32.网络编程TCP/UDP服务
网络编程TCP: 服务器端口了解: port:0~65535 web服务:80 邮箱服务:556 0~1024:为服务默认的公认端口,一般我们不能用 套接字:socket socket作用 ip:po ...
- Python Socket 编程——聊天室演示样例程序
上一篇 我们学习了简单的 Python TCP Socket 编程,通过分别写服务端和client的代码了解主要的 Python Socket 编程模型.本文再通过一个样例来加强一下对 Socket ...
- Python中的socket网络编程(TCP/IP,UDP)讲解
在网络编程中的一个基本组件就是套接字(socket).套接字基本上是两个端点的程序之间的"信息通道".程序可能分布在不同的计算机上,通过套接字互相发送信息.套接字包括两个:服务器套 ...
- java 网络编程-tcp/udp
--转自:http://blog.csdn.net/nyzhl/article/details/1705039 直接把代码写在这里,解释看这里吧:http://blog.csdn.net/nyzhl/ ...
- 28_网络编程-TCP/UDP
一.传输层 1.定义 IP首部有一个协议字段,用来标识网络层(IP)的上一层所采用的是哪一种传输层协议.根据这个字段的协议号,就可以识别IP传输的数据部分究竟是TCP的内容还是 ...
- iOS 网络编程 TCP/UDP HTTP
一.HTTP协议的主要特点: 1. CS模式 2. 简单快速:只需要传送请求方法和路径.(常用方法有GET,HEAD,POST) 3. 灵活:任意对象都可以,类型由Content-Type加以标记 4 ...
随机推荐
- 安装Webmin1.860(RPM方式)
Webmin是基于web的功能强大的管理工具,管理员可以通过Webmin以图文方式方便的管理CentOS 7系统.本文介绍如何在CentOS 7中安装Webmin. 1.去官网获取最新的RPM链接 2 ...
- input 中 datetime-local 方法
<input type=" datetime-local "> 这个标签是H5新增的对象方法 能把现有的时间赋值给它 但是注意:必须是 yyyy-MM-ddTHH: ...
- 转: WebView载入一个网页 但是退出对应的activity时, 声音、视频无法停止播放 解决方案(未验证)
1. webview.onPause 2. webview独立进程,杀进程3.小场景可以不用这么复杂有个技巧就是在activity退出的时候加载一个空白页面,就能解决
- swoole编译安装/数据库连接池/异步mysql客户端
一.编译安装php5.6 0.安装必要软件 http://www.cnblogs.com/itfenqing/p/6055138.html 1.下载php5.6.30 http://php.net/d ...
- 对于刚開始学习的人Xcode最经常使用的快捷键
对于刚開始学习的人而言,好多人都是直接使用鼠标进行操作.差点儿非常少使用快捷键,从而再练习编程时比别人慢那么一点,今天就把刚開始学习的人最经常使用的几个快捷键给大家总结下,当然欢迎大家补充. (1)c ...
- EFFECTIVE JAVA 第一天 静态工厂方法
静态工厂方法:(这里指的是就是普通static方法),类可以通过静态工厂方法提供给它的客户端,而不是通过构造器.提供静态工厂方法而不是公有构造器,这样做有几大优势. 在类的实现中使用了API的类被称为 ...
- [Hibernate开发之路](2)Hibernate问题
(1)数据库驱动问题 log4j:WARN No appenders could be found for logger (org.hibernate.cfg.Environment). log4j: ...
- MongoDB在Win10下的安装
原文地址:http://blog.csdn.net/polo_longsan/article/details/52430539 1.下载MongoDB在windows下的安装文件 首先去官网https ...
- android监听事件的方式
1.匿名内部类 bt.setOnClickListener(new OnClickListener(){ @Overridepublic void onClick(View view){//Here ...
- laravel模型建立和数据迁移和数据填充(数据填充没有成功)未完
开始创建我们的第一个 Article 模型及其对应迁移文件了,我们在项目根目录运行如下 Artisan 命令一步到位: php artisan make:model Article -m -m 是 - ...