网络编程——基于TCP协议的Socket编程,基于UDP协议的Socket编程
2016-05-10 23:18
956 查看
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
服务端:
客户端:
为了更直观的看见通信过程,将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
接收端:UDPDemo2
将2个java程序复制到E盘根目录下,用命令行的形式来运行。
打开cmd,编译java,步骤:
① 进入e盘。 e:
② 编译以UDP开头的文件。 javac –d . UDP*.java
③ 先运行接收端。 java com.iotek.tcpsocket.UDPDemo2
④ 重新打开一个命令行,运行发送端。 java com.iotek.tcpsocket.UDPDemo1
目前较为流行的网络编程模型是客户机/服务器通信模式
客户进程向服务器进程发出要求某种服务的请求,服务器进程响应该请求。如图所示,通常,一个服务器进程会同时为多个客户端进程服务,图中服务器进程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
相关文章推荐
- 20159315《网络攻击与防范》第十周学习总结
- Wireshark抓包分析/TCP/Http/Https及代理IP的识别
- TCP和UDP通信
- TCP流量控制
- HTTP消息中header头部信息的讲解
- TCP四种计时器
- 理解HTTP协议的Request/Response(请求响应)模型
- 阿里云云服务器发起https失败
- 配置TCP/IP网络
- Tcp服务端一直sleep,客户端不断发送数据产生的问题
- UDP和TCP的区别
- iOS运行时 -- Runtime(摘抄自网络)
- tcp回射服务器程序处理僵死进程
- 网络基础
- java网络编程--udp传输示例
- Java网络编程--TCP文件上传、图片上传示例
- HTTP-URL编码函数
- 网络编程知识(9)--网络应用层协议的开发
- 爬取新浪博客http://www.jianshu.com/p/7c5a4d7545ca
- 面试之路(29)-TCP流量控制和拥塞控制-滑动窗口协议详解