文档章节

网络编程简单总结

Jayden-Huang
 Jayden-Huang
发布于 2017/05/14 19:27
字数 1528
阅读 21
收藏 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();
	}

}

 

© 著作权归作者所有

共有 人打赏支持
上一篇: 数据库优化
下一篇: 数据库优化
Jayden-Huang
粉丝 0
博文 2
码字总数 2453
作品 0
广州
私信 提问
网络编程入门(六):什么是公网IP和内网IP?NAT转换又是什么鬼?

本文引用了“帅地”发表于公众号苦逼的码农的技术分享。 1、引言 搞网络通信应用开发的程序员,可能会经常听到外网IP(即互联网IP地址)和内网IP(即局域网IP地址),但他们的区别是什么?又...

首席大胸器
2018/11/20
42
0
网络编程懒人入门(五):快速理解为什么说UDP有时比TCP更有优势

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

JackJiang2011
2017/12/19
0
0
脑残式网络编程入门(六):什么是公网IP和内网IP?NAT转换又是什么鬼?

本文引用了“帅地”发表于公众号苦逼的码农的技术分享。 1、引言 搞网络通信应用开发的程序员,可能会经常听到外网IP(即互联网IP地址)和内网IP(即局域网IP地址),但他们的区别是什么?又...

JackJiang2011
2018/11/20
0
0
为什么选择Netty作为基础通信组件?

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

ZhakyMing
2016/10/19
5.5K
23
在以太坊上用代币如何与智能合约交互,进行数据传递(1)

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

gsl222
2018/08/29
0
0

没有更多内容

加载失败,请刷新页面

加载更多

二进制相关

二进制 众所周知计算机使用的是二进制,数字的二进制是如何表示的呢? 实际就是逢二进一。比如 2 用二进制就是 10。那么根据此可以推算出 5的二进制等于 10*10+1 即为 101。 在计算机中,负数以...

NotFound403
昨天
0
0
day22:

1、写一个getinterface.sh 脚本可以接受选项[i,I],完成下面任务: 1)使用格式:getinterface.sh [-i interface | -I ip] 2)当用户使用-i选项时,显示指定网卡的IP地址;当用户使用-I选项...

芬野de博客
昨天
1
0
Spring Cloud Alibaba基础教程:使用Nacos实现服务注册与发现

自Spring Cloud Alibaba发布第一个Release以来,就备受国内开发者的高度关注。虽然Spring Cloud Alibaba还没能纳入Spring Cloud的主版本管理中,但是凭借阿里中间件团队的背景,还是得到不少...

程序猿DD
昨天
3
0
Java并发编程:深入剖析ThreadLocal

ThreadLocal 的理解 ThreadLocal,很多地方叫线程本地变量,或线程本地存储。ThreadLocal为变量在每个线程中都创建了一个副本,每个线程可以访问自己内部的副本变量。===》解决的问题是线程间...

细节探索者
昨天
2
0
【Python3之异常处理】

一、错误和异常 1.错误 代码运行前的语法或者逻辑错误 语法错误(这种错误,根本过不了python解释器的语法检测,必须在程序执行前就改正) def test: ^SyntaxError: invalid...

dragon_tech
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部