文档章节

网络编程简单总结

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
基于io的socket编程

传统的socket io中,如果需要同时接受多个连接的时候。必须要使用多线程,为每一个连接创建一个线程。这样在连接数量比较大的情况,线程的数量也随之变大。虽然这样编程简单,但是缺点也十分...

少不读水浒
2016/10/15
6
0
Java程序员从笨鸟到菜鸟之(十三)java网络通信编程

本文来自:曹胜欢博客专栏。转载请注明出处:http://blog.csdn.net/csh624366188 首先声明一下,刚开始学习java网络通信编程就对他有一种畏惧感,因为自己对网络一窍不通,所以。。。呵呵。。...

长平狐
2012/11/12
138
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Spring Cloud Gateway真的有那么差吗?

前言 Spring Cloud从一开始最受大家质疑的就是网关性能,那是由于Spring Cloud最初选择了使用Netflix几年前开源的Zuul作为基础,而高性能版的Zuul 2在经过了多次跳票之后,对于Spring这样的整...

Java小铺
32分钟前
1
0
SpringBoot远程调试,远程debug你的线上项目

开发环境中代码出错了,可以利用IDE的debug功能来进行调试。那线上环境出错呢? 一、假设我们的项目是部署在tomcat中,那我们就需要对tomcat进行一定对配置,配置如下。 1. windows系统中,找...

nonnetta
37分钟前
0
0
JAVA秒杀优化方向

秒杀优化方向 将请求尽量拦截在系统上游:传统秒杀系统之所以挂,请求都压倒了后端数据层,数据读写锁冲突严重,几乎所有请求都超时,流量虽大,下单成功的有效流量甚小,我们可以通过限流、...

小贱是个程序员
44分钟前
0
0
C# 统计字符串中大写字母和小写字母的个数

static void Main() { int count1 = 0; int count2 = 0; Console.WriteLine("请输入字符串"); string str = Convert.ToString(Consol......

熊二的爸爸是谁
46分钟前
0
0
分布式服务框架之远程通讯技术及原理分析

在分布式服务框架中,一个最基础的问题就是远程服务是怎么通讯的,在Java领域中有很多可实现远程通讯的技术,例如:RMI、MINA、ESB、Burlap、Hessian、SOAP、EJB和JMS等,这些名词之间到底是...

老道士
52分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部