java学习笔记(十五)java网络编程

OSI模型分为七层(从下到上):物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。

不同主机之间的相同层次称为对等层。对等层之间互相通信需要遵守一定的规则,称之为协议,我们将某个主机上运行的某种协议的集合称为协议栈。主机正是利用这个协议栈来接收和发送数据的。

TCP/IP模型:网络接口层、网络互连层、传输层、应用层。

在网络编程中需要注意的问题包括:

1.是如何找到网络上的主机上的要进行通讯的程序;

2.是找到了主机上的程序后如何传输数据。

端口号:是一组16位的无符号二进制数,每个端口号的范围是1到65535(0被保留)。

TCP协议代表传输控制协议,允许两个应用程序之间的进行可靠的通讯;

UDP协议代表用户报文协议,是一种非连接协议,允许两个应用程序之间进行不可靠的通讯。提供了在应用程序之间发送称为数据报的协议。

Socket套接字:Unix系统推出了一种应用程序访问通信协议的操作系统调用,是一种抽象层,应用程序通过它来发送和接收数据。

不同类型的Socket与不同类型的底层协议族以及同一协议族中的不同协议栈相关联。

InetAddress类代表IP地址,例:

import java.net.InetAddress;

public class InetAddressTest {

        public static void main(String[] args) throws Exception {
	       InetAddress ip = InetAddress.getLocalHost();
	       System.out.println(ip);
	       InetAddress ip = InetAddress.getByName("80YMEKCC96RXAOB");
	       System.out.println(ip);
	       InetAddress[] allByName = InetAddress.getAllByName("www.baidu.com");
	      for (InetAddress inetAddress : allByName) {
	            System.out.println(inetAddress);
	       }
             byte[] ip = {(byte)192, (byte)168, 1, 52};
             InetAddress address = InetAddress.getByAddress("www.baidu.com", ip);
             System.out.println(address);
      }
}

  

使用套接字建立TCP连接:

1.服务器初始化一个ServerSocket对象,指示通讯将要发生在哪个端口号上。

2.服务器调用ServerSocket类的accept()方法。该方法会一直等待,直到一个客户端连接到服务器上的指定端口。

3.在服务器等待的同时,客户端实例化一个Socket对象,指定要连接的服务器名和端口号。

4.Socket类的构造器试图将客户端连接到指定的服务器和端口号。

5.在服务器端,accept()方法返回一个将要连接到客户端套接字的服务器新套接字的引用。

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;

/**
* 服务器端
*
* @author Administrator
*
*/
public class Server {

     public static void main(String[] args) throws IOException {
           // 创建ServerSocket对象,指定监听端口
           ServerSocket server = new ServerSocket(30001);
           // 设置超时时间
           server.setSoTimeout(10000);
           // 等待客户端连接
           Socket socket = server.accept();
            /* 处理客户端数据 */
           // 从客户端读数据
           BufferedReader reader = new BufferedReader(new InputStreamReader(
socket.getInputStream()));
           char[] ch = new char[100];
            int len = reader.read(ch);
            System.out.println("从客户端接收到的信息:");
            // while (-1 != (len = reader.read(ch))) {
            System.out.print(new String(ch, 0, len));
            // }
           // 向客户端写数据
            BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(
socket.getOutputStream()));
            writer.write("你好客户端,我已经接收到你的信息了");
            writer.flush();
              // 释放资源
            writer.close();
             reader.close();
             socket.close();
             server.close();
        }
}

  

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;

/**
* 客户端 请求--响应
*
* @author Administrator
*
*/
public class Client {

        public static void main(String[] args) throws IOException {
              // 创建客户端Socket向服务器发起连接请求
             Socket socket = new Socket("192.168.1.200", 30001);
             /* 利用已建立的socket创建输入输出流,处理与服务器端的连接 */
             // 向服务器写入数据
          BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(
           socket.getOutputStream()));
           writer.write("你好服务器!!!");
            writer.flush();
          // 从服务器读数据
          BufferedReader reader = new BufferedReader(new  InputStreamReader(
socket.getInputStream()));
           char[] ch = new char[100];
           int len = reader.read(ch);
           System.out.println("从服务器端接收到的信息:");
            // while (-1 != (len = reader.read(ch))) {
            System.out.print(new String(ch, 0, len));
           // }
         // 释放资源
          reader.close();
          writer.close();
           socket.close();
        }
}

  

UDP套接字编程

数据报包的发送者和接受者都使用java.net.DatagramSocket类分别发送和接收包。

接收报文包:

1.创建一个足够大的字节数组,用于存储要接收的包的数据;

2.使用该字节数组实例化一个DatagramPacket对象;

3.DatagramSocket被实例化,它被指定该套接字要绑定到的本地主机上的一个端口;

4.调用DatagramSocket类的receive()方法,将DatagramPacket对象传入该方法。这将导致执行线程阻塞,直到接收到一个数据报包或者发生了超时。

import java.net.*;
import java.io.*;

public class PacketReceiver{

     public static void main(String[] args) {
            try{
                   byte[] buffer = new byte [1024];
                   DatagramOacket packet = new DatagramPacket(buffer,buffer.length);
                   DatagramSocket socket = new DatagramSocket(5002);
                   Syatem.out.println("正在等待一个包...");
                   socket.receive(packet);
                   System.out.println("刚从" + packet.getSocketAddress() + "接收到包");
                   buffer = packet.getData();
                   System.out.println("new String(buffer)");
            } catch(IOException e){
                    e.printStackTrace();
            }
     }
}

发送报文包

1.创建一个足够大的字节数组,用于存储要发送的包数据,用该数据填充数组;

2.创建一个新的DatagramPacket对象,用于存储上面的字节数组,以及服务器名和接受者的端口号;

3.DatagramSocket被实例化,它被指定套接字要绑定到本地主机的哪个端口;

4.DatagramSocket类的send()方法被调用,传入DatagramPacket对象。

import java.net.*;
import java.io.*;

public class PacketSender{
       public static void main(String [] args){
                 try{
                       String data = "刚收到数据包";
                       byte[] buffer = data.getBytes();
                       DatagramPacket packet = new DatagramPacket(buffer,buffer.length,new InetSocketAddress("localhost",5002));
                       DatagramSocket socket = new DatagramSocket(5003);
                       System.out.println("正在发送一个包...");
                       Socket.send(packet);
                 } catch(IOException e){
                       e.printStackTrace();
                 }
        }
}

  

 

时间: 2024-10-05 04:09:27

java学习笔记(十五)java网络编程的相关文章

java学习笔记(五)枚举

原文出处:http://www.cnblogs.com/linjiqin/archive/2011/02/11/1951632.html 在实际编程中,往往存在着这样的"数据集",它们的数值在程序中是稳定的,而且"数据集"中的元素是有限的. 例如星期一到星期日七个数据元素组成了一周的"数据集",春夏秋冬四个数据元素组成了四季的"数据集". 在java中如何更好的使用这些"数据集"呢?因此枚举便派上了用场,以

第五周JAVA学习笔记(五)

将指定目录下的所有文件显示到列表框(JList)组件中, :效果图如下:                  import java.awt.BorderLayout; import java.io.File; import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JList; import javax.swing.JScrollPane; public class kuang { public st

Java进阶(三十五)java int与integer的区别

Java进阶(三十五)java int与integer的区别 前言 int与integer的区别从大的方面来说就是基本数据类型与其包装类的区别: int 是基本类型,直接存数值,而integer是对象,用一个引用指向这个对象. 1.Java 中的数据类型分为基本数据类型和复杂数据类型 int 是前者而integer 是后者(也就是一个类):因此在类进行初始化时int类的变量初始为0.而Integer的变量则初始化为null. 2.初始化时: int i =1; Integer i= new In

JAVA学习笔记一(JAVA输出环境变量)

package mytest; import java.util.*;; public class mymain { public static void main(String[] args) { // TODO Auto-generated method stub System.out.print(new Date()); Properties p=System.getProperties(); p.list(System.out); Runtime rt=Runtime.getRuntim

Java进阶(二十五)Java连接mysql数据库(底层实现)

Java进阶(二十五)Java连接mysql数据库(底层实现) 前言 很长时间没有系统的使用java做项目了.现在需要使用java完成一个实验,其中涉及到java连接数据库.让自己来写,记忆中已无从搜索.特将之前使用的方法做一简单的总结.也能够在底层理解一下连接数据库的具体步骤. 实现 首先需要导入相关的jar包,我使用的为:mysql-connector-java-5.1.7-bin.jar. 下面来看一下我所使用的数据库连接方法类: MysqlUtil.java package cn.edu

Swift 学习笔记十五:扩展

扩展就是向一个已有的类.结构体或枚举类型添加新功能(functionality).扩展和 Objective-C 中的分类(categories)类似.(不过与Objective-C不同的是,Swift 的扩展没有名字.) Swift 中的扩展可以: 1.添加计算型属性和计算静态属性 2.定义实例方法和类型方法 3.提供新的构造器 4.定义下标 5.定义和使用新的嵌套类型 6.使一个已有类型符合某个协议 一.扩展属性,构造器,方法 class Human{ var name:String? va

laravel3学习笔记(十五)

原作者博客:ieqi.net ==================================================================================================== 异常与日志 在应用中,我们总会遇到各种问题.各种异常,这时,记录异常发生时的状态就很重要,所以异常与日志是有着天然的关系的. 关于异常与日志的配置在文件 application/config/error.php 中. 文件中有四个配置项: 'ignore' => ar

Java学习笔记心得——初识Java

初识Java 拿到这本厚厚的<Java学习笔记>,翻开目录:Java平台概论.从JDK到TDE.认识对象.封装.继承与多态...看着这些似懂非懂的术语名词,心里怀着些好奇与担忧,就这样我开始走进Java的世界.  Java产生的历史 Java来自于Sun公司的一个叫Green Project中撰写的程序语言,全球信息网(World Wide Web)兴起,Java Applet成为网页互动技术的代表,特别适合于Internet应用程序开发. Java语言的特点 1.面向对象 这是Java最重要

Java基础学习笔记十五 集合、迭代器、泛型

Collection 集合,集合是java中提供的一种容器,可以用来存储多个数据. 在前面的学习中,我们知道数据多了,可以使用数组存放或者使用ArrayList集合进行存放数据.那么,集合和数组既然都是容器,它们有啥区别呢? 数组的长度是固定的.集合的长度是可变的. 集合中存储的元素必须是引用类型数据 集合继承关系图 ArrayList的继承关系: 查看ArrayList类发现它继承了抽象类AbstractList同时实现接口List,而List接口又继承了Collection接口.Collec

Python学习笔记(四十五)网络编程(1)TCP编程

摘抄:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001432004374523e495f640612f4b08975398796939ec3c000 Socket是网络编程的一个抽象概念.通常我们用一个Socket表示“打开了一个网络链接”,而打开一个Socket需要知道目标计算机的IP地址和端口号,再指定协议类型即可. 客户端 大多数连接都是可靠的TCP连接.创建TCP