Chp15 网络编程
来源:互联网 发布:铁路工程概预算软件 编辑:程序博客网 时间:2024/04/29 10:52
● 网络协议及分层见文章分类Computer Network下的相关博客。
1.什么是Socket?
网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket,应用程序通常通过”套接字”向网络发出请求或者应答网络请求。
Socket和ServerSocket类库位于java.net包中。ServerSocket用于服务器端,Socket是建立网络连接时使用的。在连接成功时,应用程序两端都会产生一个Socket实例,操作这个实例,完成所需的会话。
——百度百科2.TCP编程
● TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。
● TCP编程的基本步骤:
服务器端: 1.创建ServerSocket对象,并绑定端口;2.调用ServerSocket对象的accept方法,并返回一个Socket对象;3.通过Socket对象来获取输入输出流,进行数据读写;4.关闭Socket流。
客户端: 1.创建Socket对象,并连接服务器;2.调用Socket对象的Socket流,进行数据读写;3.关闭Socket流。
● 注意: 1.Socket流是底层建立好的,既有输入流也有输出流,想要输入或者输出流对象,可以通过Socket来获取;2.服务器端自身不需要流,它里面装的全是资源,所以需要获取客户端对象,拿对应对象的Socket流和其通信;4.因为TCP是面向连接的,所以在运行程序时必须先开服务器端;5.服务器端通过Socket对象获取输入流,来读取客户端发来的数据。● 示例:创建一个TCP服务器和一个TCP客户端。客户端向服务器发送一个“Hello”字符串,服务器接收后,在后面增加一个“ from server”字符串,再返回给客户端。
服务器端代码:
import java.io.BufferedReader;import java.io.InputStreamReader;import java.io.PrintWriter;import java.net.ServerSocket;import java.net.Socket;public class TCPServer { @SuppressWarnings("resource") public static void main(String[] args) throws Exception { //服务端必须对外提供一个接口,否则客户端无法连接 ServerSocket serverSocket = new ServerSocket(9000); Socket socket = serverSocket.accept(); //通过Socket对象获取输入流,来读取客户端发来的数据 BufferedReader bufferedReader = new BufferedReader( new InputStreamReader(socket.getInputStream())); String line = bufferedReader.readLine(); PrintWriter printWriter = new PrintWriter(socket.getOutputStream()); printWriter.println(line + " from server"); printWriter.flush(); socket.close(); }}
- 客户端代码:
import java.io.BufferedReader;import java.io.InputStreamReader;import java.io.PrintWriter;import java.net.Socket;public class TCPClient { public static void main(String[] args) throws Exception { //连接服务器如此,连接数据库也是这样,但连接数据库的时候要用到用户名和密码 Socket socket = new Socket("192.168.0.66", 9000); //客户端连接成功后,要把数据发送给服务端,使用输出流,将数据写出 PrintWriter printWriter = new PrintWriter(socket.getOutputStream()); printWriter.println("Hello World"); printWriter.flush(); BufferedReader bufferedReader = new BufferedReader( new InputStreamReader(socket.getInputStream())); String line = bufferedReader.readLine(); System.out.println(line); socket.close(); }}
- 3.UDP编程
● UDP (User Datagram Protocol 用户数据报协议)是一种无连接,不可靠的协议。效率较高,在对数据传输的正确率不太关心,但又对传输效率要求较高的情况下,可以采用UDP协议,例如网络语音及视频聊天应用。
● UDP编程的基本步骤:
服务器端: 1.创建DatagramSocket对象,并绑定端口;2.接收数据;3.发送数据;4.关闭Socket流。
客户端: 1.创建DatagramSocket对象;2.发送数据;3.接收数据;4.关闭Socket流。 ● 注意: UDP编程需使用的两个主要类:DatagramSocket和DatagramPacket。其中DatagramSocket可以当成是一台传真机,既可以收传真,也可以发传真,而DatagramPacket则是需要传输的数据。
● 示例:创建一个UDP服务器和一个UDP客户端。从客户端向服务器发送一个“hello server”,而服务器端回复客户端一个字符串“hello,client”。
服务器端代码:
import java.net.DatagramPacket;import java.net.DatagramSocket;public class UDPServer { public static void main(String[] args) throws Exception { //准备一个“传真机”,指定端口 DatagramSocket datagramSocket = new DatagramSocket(9000); //准备“造纸的材料” byte [] buf = new byte [100]; //用上一步的材料造一张“纸” DatagramPacket paper = new DatagramPacket(buf, 0, buf.length); //把纸放入,服务器调用datagramSocket的receive方法接收数据 datagramSocket.receive(paper); //获得客户端给服务器发送的数据 String str = new String(buf, 0, paper.getLength()); System.out.println(str); //从服务器给客户端发送数据 byte [] data = "Hello client".getBytes(); //此次回传的datagramPacket的地址,便是收到的paper对象的getSocketAddress()的返回值 DatagramPacket datagramPacket = new DatagramPacket( data, 0, data.length, paper.getSocketAddress()); datagramSocket.send(datagramPacket); datagramSocket.close(); }}
- 客户端代码:
import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.InetSocketAddress;public class UDPClient { public static void main(String[] args) throws Exception { //准备一个“传真机”,端口由系统随机分配 DatagramSocket datagramSocket = new DatagramSocket(); //准备发送数据 String str = "Hello Server"; byte [] data = str.getBytes(); //把data数组中的数据封装到一个DatagramPacket中 //前三个参数表示,发送的是data数组,从数组下标为0的位置发送,发送长度为data.length个字节 //第四个参数,是一个InetSocketAddress对象 DatagramPacket datagramPacket = new DatagramPacket( data, 0, data.length, new InetSocketAddress("192.168.0.66", 9000)); //客户端调用datagramSocket的send方法,发送datagramPacket至服务器 datagramSocket.send(datagramPacket); byte [] buf = new byte [100]; DatagramPacket paper = new DatagramPacket(buf, 0, buf.length); datagramSocket.receive(paper); String msg = new String(buf, 0, paper.getLength()); System.out.println(msg); datagramSocket.close(); }}
- Chp15 网络编程
- 网络编程
- 网络编程
- 网络编程
- 网络编程
- 网络编程
- 网络编程
- 网络编程
- 网络编程
- 网络编程
- 网络编程
- 网络编程
- 网络编程
- 网络编程
- 网络编程
- 网络编程
- 网络编程
- 网络编程
- 第十三周项目1:阅读程序,并写出运行结果(2)虚析构函数
- 深复制体验2
- NoSQL数据库概览及其与SQL语法的比较
- ssh框架中的basedao
- 2 Add Two Numbers
- Chp15 网络编程
- 猴子吃桃问题
- HDU 2200 Eddy's AC难题(组合数学)
- 基于FS4412嵌入式系统移植(8) linux内核调试之printk
- 百度 API 生成短网址自己测试的例子
- css word-wrap和word-break强制换行
- 第12周项目1实现复数类的运算符重载3
- Spring-Spring事务管理
- 细数5款主流NoSQL数据库到底哪家强?