java--11--网络编程
来源:互联网 发布:淘宝都是假货吗 编辑:程序博客网 时间:2024/03/29 21:52
1 服务器端通过ServerSocket建立监听,客户端通过Socket连接到指定服务器后通信双方就可以通过IO流进行通信。
计算机网络分为物理层,数据链路程,网络层,传输层,会话层,表示层,应用层七层。
2基于TCP协议的网络编程
IP协议只能保证计算机能发送和接收分组数据,IP协议不能解决数据分组数据在传输过程中可能出现的问题。
TCP协议被称为一种端对端协议,当两台计算机连接时,TCP协议将会让他们建立一个连接,用于发送和接收数据的虚拟链路,TCP协议负责收集信息包,依次传送,
TCP使用重发机制,当一个通信实体发送一个消息给另外一个通信实体后,需要收到另外一个通信实体的确认信息,如果没有收到另外一个通信实体的确认消息,将会再次发送刚才发送的信息。
例:
/** * 客户端 接收来自服务器端的数据 * @author Shipp */public class TextDemo_16 { public static void main(String[] args) throws IOException{ Socket socket=new Socket("127.0.0.1",30000); //设置超过指定时间认为超时 socket.setSoTimeout(10000); //另外一种连接的写法 //Socket socket2=new Socket(); //让Socket连接到远程服务器,设置超过时间为10000即为超时 //socket.connect(new InetSocketAddress("127.0.0.1", 30000), 10000); //接收数据 BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(socket.getInputStream())); //读取数据 String line=bufferedReader.readLine(); System.out.println("来自服务器端的数据:"+line); socket.close(); bufferedReader.close(); }}
/** * 服务端 * 用于向客户端发送数据 * @author Shipp */public class TextDemo_15 { public static void main(String[] args) throws IOException{ //没有指定IP地址,则该ServerSocket将会绑定到本机默认的IP地址 //创建一个ServletSocket,用于监听客户端Socket的连接请求 ServerSocket serverSocket=new ServerSocket(30000); //采用循环不断的接收来自客户端的请求 while(true){ //每当接收到客户端Socket的请求时,服务器端也会产生一个Socket Socket socket=serverSocket.accept(); //将Socket对应的输入流包装成PrintStream PrintStream printStream=new PrintStream(socket.getOutputStream()); //输入输出,发送数据 printStream.println("已接收到服务器的新年祝福!"); //关闭Socket socket.close(); //关闭输入输出流, printStream.close(); } }}
2 基于UDP协议的网络编程
UDP协议是一种不可靠的网络协议,它在通信的两端各建立一个Socket,但是这两个Socket并没有虚拟链路,这两个Socket只是发送,接收数据包的对象。
UDP是一种面向非连接的协议,面向非连接指的是在正式通信之前不必与对方先建立连接,不管对方状态就直接发送。至于对方是否可以接收到这些数据,UDP协议无法控制。因此对于UDP协议而言,没有所谓的客户端和服务器端的概念。
例:
public class UdpClient { /** * 定义端口号 */ public static final int DEST_PORT = 30000; /** * IP地址 */ public static final String DEST_IP = "127.0.0.1"; /** * 定义接收网络数据的字节数组的长度 */ private static final int DATA_LEN = 4096; /** * 定义接收字节数组 */ byte[] inBuff = new byte[DATA_LEN]; // 以指定的字节数组创建准备接收数据的DatagramPacket对象 private DatagramPacket inDatagramPacket = new DatagramPacket(inBuff, inBuff.length); // 用于发送数据 private DatagramPacket outDatagramPacket = null; /** * 客户端接收发数据 */ public void initial() { DatagramSocket datagramSocket = null; try { // 创建一个连接 datagramSocket = new DatagramSocket(); } catch (SocketException e) { // TODO Auto-generated catch block e.printStackTrace(); } // 初始化发送用的DatagramSocket, try { outDatagramPacket = new DatagramPacket(new byte[0], 0, InetAddress.getByName(DEST_IP), DEST_PORT); } catch (UnknownHostException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } // 创建键盘输入流 Scanner scanner = new Scanner(System.in); while (scanner.hasNextLine()) { byte[] buff = scanner.nextLine().getBytes(); // 设置发送用的DatagramPacket中的字节数据 outDatagramPacket.setData(buff); try { // 发送数据报 datagramSocket.send(outDatagramPacket); // 读取Socket中的数据,读取的数据放在inDatagramPacket中 datagramSocket.receive(inDatagramPacket); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } // 输出收到的字节 System.out.println(new String(inBuff, 0, inDatagramPacket .getLength())); } } public static void main(String[] args) { new UdpClient().initial(); }}
public class UdpServer { /** * 端口号 */ public static final int PORT = 30000; /** * 定义每个数据报的大小 */ private static final int DATA_LEN = 4096; byte[] inBuff = new byte[DATA_LEN]; // 以指定字节数组创建准备接收数据的DatagramPacket对象 private DatagramPacket inPacket = new DatagramPacket(inBuff, inBuff.length); // 定义一个用于发送的DatagramPacket private DatagramPacket outPacket; // 服务器发送该数值的元素 String[] books = new String[] { "java疯狂讲义1", "java疯狂讲义2", "java疯狂讲义3" }; /** * 接收和发送数据 * * @throws IOException */ public void init() throws IOException { DatagramSocket datagramSocket = null; try { // 创建DatagramSocket对象 datagramSocket = new DatagramSocket(PORT); } catch (SocketException e) { // TODO Auto-generated catch block e.printStackTrace(); } for (int i = 0; i < 1000; i++) { // 读取Socket中的数据,读到的数据放入inPacket数组中 datagramSocket.receive(inPacket); System.out.println(new String(inBuff, 0, inPacket.getLength())); byte[] sendData = books[i % 4].getBytes(); // 以指定的字节数组作为发送数据,以刚接收到的DatagramSocket为目标 outPacket = new DatagramPacket(sendData, sendData.length, inPacket.getSocketAddress()); // 发送数据 datagramSocket.send(outPacket); } } public static void main(String[] args) { // TODO Auto-generated method stub try { new UdpServer().init(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } }}
对于Socket关闭的问题。如果关闭了流,则关闭了Socket,一般不关闭流,关闭Socket即可。
未完待续。。。
0 0
- java--11--网络编程
- 【网络编程】JAVA网络编程
- 11 java 王少飞-java网络编程小节
- java网络编程:网络基本概念
- Java总结(11) 网络编程1
- 黑马程序员--Java基础--11网络编程
- 黑马程序员--Java之网络编程11
- Java中网络编程基础11
- Java基础11——网络编程
- Java网络编程-UDP编程
- Java 高层网络编程
- Java网络编程2
- Java网络编程3
- Java网络编程4
- Java网络服务器编程
- java网络编程1
- java网络编程2
- JAVA网络编程
- 静态路由生效条件及loopback通信
- ACM程序设计 -K (移动方块问题)
- Java清空输入缓冲区的一种方法
- js---数组,定时器应用
- C语言的数组与函数
- java--11--网络编程
- PAT(乙) 1003.我要通过!(20)
- 校园o2o经营情况跟踪
- 堆排序总结
- 94:Maximum Subarray
- c# 加密与解密 Base64Encode
- Sql Server内置函数实现MD5加密
- PXC集群添加新节点如何使用IST方式避免使用SST方式传输数据
- Bootstrap 按钮