文档章节

网络编程简单总结

Edenjia
 Edenjia
发布于 2017/05/14 19:27
字数 1528
阅读 19
收藏 0

在计算机网络中,位于同一个网络的计算机在进行连接和通信时需要遵守一定的规则,这些连接与通信的规则被称为网络通信协议;目前应用最广泛的也就是基于TCP/IP协议;

TCP/IP协议中的四层分为应用层、传输层、网络层、链路层。其中,网络层是整个TCP/IP协议的核心,它主要是用于将传输的数据进行分组,将分组的数据发送到目标计算机或者网络;而运输层主要使网络程序进行通信,主要采用TCP协议或者UDP协议;

通过IP地址我们可以连接到指定的计算机,但如果我们要访问目标的计算机的某个程序,我们还需要指定端口号;

下面我将简单的介绍java中几个比较简单的类

1、InetAddress类,通过这个InetAddress类的一些常用方法我们可以得到关于IP地址的相关信息;

(1)、InetAddress getByName(String host);//参数host表示指定的主机,用于在给定主机名的情况下确定主机的IP地址;

(2)InetAddress getLocalHost();//创建一个表示本地主机的InetAddres对象

(3)String getHostName();//获取IP地址的主机名

(4)boolean isReachable(int timeout);//判断指定时间内可否达到;

(5)String getHostAddress();//得到字符串格式的IP地址

InetAddress innet = InetAddress.getLocalHost();//创建InetAddress对象
//指定主机,的InetAddress对象
InetAddress remoteAddress = InetAddress.getByName("www.baidu.com");
System.out.println("本机的Ip地址:"+innet.getHostAddress()); //得到Ip地址
System.out.println("远程的ip地址:"+remoteAddress.getHostAddress());
System.out.println("3秒可到达:"+remoteAddress.isReachable(3000));
System.out.println("远程主机名:"+remoteAddress.getHostName());//获得主机名

2、UDP通信

    UDP是无连接的通信协议,即在数据连接时,数据的发送端和接收端不建立逻辑连接。UDP协议的消耗资源比较小,通信效率高,可用于音频,视频,普通的数据的传输;

(1)DatagramPacket类,这个可以简单地理解为一个箱子,用于封装UDP通信中发送和接受的数据。

方法:DatagramPacket(byte[] buff,int length) ;//用于接收端,

         DatagramPacket(byte[] buff,int offset,int length) ;//用于接收端

         DatagramPacket(byte[] buff,int length,InetAddress addr,int port) ;//用于发送端

         DatagramPacket(byte[] buff,int offset,,int length,InetAddress addr,int port) ;//用于发送端

         InetAddress getAddress();//返回对方的Ip地址。

        int getPort();//返回对方的端口号

       byte[] getData;//返回将要接受或者发送的数据

  (2)DatagramSocket类,使用这个类的实例可以发送和接受Datagrampacket数据包

 方法:DatagramSocket(int port);//可用于接受端或者发送端,指定端口号   

         DatagramSocket(int port,InetAddress addr);//可用于接受端或者发送端,指定端口号,还指定相应的IP

        void receive(DatagramPacket p);//只有接受数据包时才会返回,否则处于阻塞状态

       void  send(DatagramPacket p);//发送数据包

简单代码示例:

package udp;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

//基于UDP通信
//接收端
public class Exam1 {

	public static void main(String[] args) throws Exception {
		byte[] buff = new byte[1024];//建立一个字节数组用于接受数据
		DatagramSocket datagramSocket = new DatagramSocket(8954);//监听的端口号是8954
		DatagramPacket datagramPacket = new DatagramPacket(buff, 1024);//用于接收数据
		System.out.println("等待接受数据");
		datagramSocket.receive(datagramPacket);
        String str = new String(datagramPacket.getData(), 0, datagramPacket.getLength()) + "from " + datagramPacket.getAddress().getHostAddress()
        		   +"端口号: "+datagramPacket.getPort();
        System.out.println("接受的数据为:"+str);
        datagramSocket.close();
	}

}
package udp;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.UnknownHostException;

//发送端
public class Exam02 {

	public static void main(String[] args) throws Exception {
		DatagramSocket socket = new DatagramSocket(3000);//创建一个对象
		String str = "hello word";
		//指定发送数据的内容,长度,InetAddress的对象,端口
		DatagramPacket datagramPacket = 
				new DatagramPacket(str.getBytes(), str.length(),InetAddress.getByName("localhost"),8954);
        socket.send(datagramPacket);//发送
        socket.close();
	}

}

3、TCP通信

TCP协议是面向连接的通信协议。在TCP通信中,需要明确客户端和服务器端,每次创建都需要“三次握手”,第一次,客户端向服务器端发出连接请求,等待服务器端确认,第二次,服务端向客户端回送一个响应,通知客户端收到连接请求,第三次握手,客户端再次向服务器端发送确认消息,确认连接。

(1)ServerSocket类, 表示服务器端。

方法:ServerSocket(int port);//创建一个对象,将其绑定到一个指定端口号上;

         ServerSocket(int port,int backlog);//创建一个对象,将其绑定到一个指定端口号上;backlog表示服务器忙时,可以与之保持连接请求的等待客户数量,如果没有指定,默认值为50

       ServerSocket(int port,int backlog,InetAddress bindAddr);//创建一个对象,在上一个方法上多个IP;

      Socket accept();//用于与客户端连接

      InetAddress getInetAddress();//返回一个InetAddress对象,该对象封装了ServerSocket对象的IP地址

      void bind(SocketAddress point);//用于绑定指定的Ip地址和端口号

2、Socket 类,用于客户端

    Socket(String host,int port);//根据参数去连接指定的地址和端口上的运行程序

   Socket(InetAddress ,iint port);//与上一个方法类似

    int getPort();//返回端口号

    InetAddress getLocalAddress();//获取Socket的Ip地址,并将Ip地址封装返回

    InputStream getInputStream() 和OutputStream getOutputStream();//用户客户端接受数据和向服务器端发送数据;

简单代码实例:

package tcp;

import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;


//TCP通信,服务端
public class TCPServer {

	public static void main(String[] args) throws Exception {
		//定义一个端口号
		int port = 9000;
		//创建ServerSocket对象
		ServerSocket serverSocket = new ServerSocket(port);
		//接收数据
		Socket socket = serverSocket.accept();
		//获取客户端的输出流
		OutputStream outputStream = socket.getOutputStream();
		System.out.println("开始与客户端交互数据");
		outputStream.write(("hello world").getBytes());
		Thread.sleep(1000);
		
		//读取客户端的数据
		InputStream inputStream = socket.getInputStream();
		byte[] by = new byte[1024];
		int len = inputStream.read(by);
		System.out.println("客户端发来的数据:"+new String(by,0,len));
		
		System.out.println("与客户端结束交互数据");
		outputStream.close();
		socket.close();

	}

}
package tcp;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
//客户端
public class Client {

	public static void main(String[] args) throws Exception {
		int port = 9000;//端口号要与服务端一样
		//创建一个socket对象,指定地址和端口号
		Socket socket = new Socket(InetAddress.getLocalHost(), port);
		//接受数据
		InputStream inputStream = socket.getInputStream();
		byte[] buff = new byte[1024];
		int len = inputStream.read(buff);
		System.out.println("接受到的数据:"+new String(buff,0,len));
		
	     //向服务端发送数据
		OutputStream outputStream = socket.getOutputStream();
		outputStream.write(("hi sir").getBytes());
		
		socket.close();
	}

}

 

© 著作权归作者所有

共有 人打赏支持
Edenjia
粉丝 0
博文 2
码字总数 2453
作品 0
潮州
137-基本的网络编程总结

网络编程远远不止前面所提到的那些内容。在 Linux 编程中,只是非常简单的介绍了下基本的 socket 编程。如果要讲完整个网络编程,需要整整一本书的内容。 但是,前面的文章提到的一些基础概念...

q1007729991
2017/04/03
0
0
网络编程懒人入门(五):快速理解为什么说UDP有时比TCP更有优势

本文观点仅作参考,请根据自已系统的应用场景合理地选择数据传输层协议即可,无需盲目崇拜大牛言论。 1、前言 对于即时通讯开者新手来说,在开始着手编写IM或消息推送系统的代码前,最头疼的...

JackJiang2011
2017/12/19
0
0
为什么选择Netty作为基础通信组件?

以下内容根据网上资料和自己整理总结而成 一、什么是Netty? Netty是一个高性能 事件驱动、异步非堵塞的IO(NIO)Java开源框架,Jboss提供,用于建立TCP等底层的连接,基于Netty可以建立高性能...

ZhakyMing
2016/10/19
5.5K
23
Netty与JDK自带NIO的使用对比

Netty与JDK自带NIO的使用对比 开发高质量的NIO程序并不是一件简单的事情,出去NIO固有的复杂性和BUG不谈,作为NIO服务端,需要能够处理网络的闪断、客户端的重复接入、客户端的安全认证、消息...

宸明
09/07
0
0
在以太坊上用代币如何与智能合约交互,进行数据传递(1)

从接触区块链概念到进入开发状态,也有一段时间了,最近也在以太坊上发了几个智能合约,现把个人的经验总结以下,也算是学习总结吧,希望后来者减少一些坑.如你有不明清楚的,也可以直接和本人联系...

gsl222
08/29
0
0

没有更多内容

加载失败,请刷新页面

加载更多

自定义Ubuntu/Windows双系统引导菜单主题

学习Linux自然少不了要装双系统,其中Ubuntu便是我们用的最多的Linux系统。装完双系统后,Ubuntu会自动生成grub开机引导及菜单,及其丑陋,而且很多我们用不到的选项。今天我们就介绍burg:修...

Linux就该这么学
21分钟前
0
0
Go 并发(二)

Go Mutex 通过Mutex和信道处理竞态条件。 临界区 当程序并发运行时,多个协程不应该同时访问那些修改共享资源的代码,这些修改共享资源的代码称为临界区。 Go中通过Mutex可以避免同时访问临界...

春哥大魔王的博客
23分钟前
0
0
CentOS 7安装和部署Docker

Docker 要求 CentOS 系统的内核版本高于 3.10 ,查看本页面的前提条件来验证你的CentOS 版本是否支持 Docker 。通过 uname -r 命令查看你当前的内核版本 uname -r3.10.0-514.el7.x86_64 1、...

狼王黄师傅
27分钟前
0
0
php扩展可以通过pecl 或者phpize 安装

pecl 算是 php 扩展的一个官方聚合平台,一些比较有名,有特点的扩展会被 pecl 收录,收录后可以通过 pecl 的方式安装。但是更多的扩展是没有收录在 pecl 上的,这些扩展还是需要通过 phpize...

bengozhong
27分钟前
0
0
CentOS中如何安装7ZIP

执行以下命令下载安装: wget http://nchc.dl.sourceforge.net/project/p7zip/p7zip/9.20.1/p7zip_9.20.1_src_all.tar.bz2tar -jxvf p7zip_9.20.1_src_all.tar.bz2cd p7zip_9.20.1make......

凯文加内特
33分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部