概述
1、网络编程的三要素: (1)IP地址 (2)端口号 (3)协议
2、IP地址 : 网络中计算机唯一标识。 (1)IP地址在计算机中存储的时候是由二进制的形式进行存储的: IP:192.168.7.42 十进制 换算成二进制: 11000000.10101000.00000111.00101010 实际上存储的是: 11000000101010000000011100101010 为了方便IP地址的标识,就把IP地址上的每一个字节上的数据转换成10进制,然后字节与字节之间用 . 分割标识。 这样的表示法叫做 : 点分十进制表示法 (2)IP地址的组成: 网络号段 + 主机号段 (3)IP地址的分类: A:第一个号段定义为网络号段 + 后面三个号段都是为主机号段 (主机号段:将来可以连接多少台电脑) 可以有多少台主机相连: (3个号段): 256*256*255 11111111*11111111*11111110 = 256*256*255 B:前两个号段为网络号段 + 后两个号段为主机号段 256*255 C:前三个号段都为网路号段 + 最后一个号段为主机号段 255 局域网 D:224.0.0.1---239.255.255.254 E:240.0.0.1---247.255.255.254 (4)特殊的IP地址: 1、loaclhost = 本机 = 127.0.0.1 127.0.0.1 : 回环地址,可以用于测试本机的网络是否有问题, 检测方法: ping 127.0.0.1 2、广播地址: x.x.x.255 3、网络地址: x.x.x.0
3、为了方便我们对IP地址的获取和操作,java提供了一个类InetAddress 供我们使用:
InetAddress的方法:
(1)public static InetAddress getByName(String host) 确定主机名称的IP地址。 (2)public String getHostName() 获取此IP地址的主机名。 (3)public String getHostAddress() 返回文本显示中的IP地址字符串。 (4)getAddress() 返回此InetAddress对象的原始IP地址。
public class InetAddressDemo {
public static void main(String[] args) {
//public static InetAddress getByName(String host) 确定主机名称的IP地址。
InetAddress name = null;
try {
name = InetAddress.getByName("192.168.7.18");
} catch (UnknownHostException e) {
e.printStackTrace();
}
System.out.println(name); // /192.168.7.18
//public String getHostName() 获取此IP地址的主机名。
String hostName = name.getHostName();
System.out.println(hostName); // XiaoWang
//public String getHostAddress() 返回文本显示中的IP地址字符串。
String hostAddress = name.getHostAddress();
System.out.println(hostAddress); // 192.168.7.18 (这是一个字符串)
}
}
4、TCP
建立连接,形成传输数据的通道;在连接中进行大数据量传输;通过三次握手完成连接,是可靠协议;必须建立连接,效率会稍低
/**
* -----------TCP客户端----------------
*
* TCP协议客户端代码实现:
* 1、创建客户端的Socket对象 -- 这一步如果成功创建对象,就说明连接已经建立成功
* 构造方法: (1)Socket(InetAddress address, int port) 创建流套接字并将其连接到指定IP地址的指定端口号。
* (2)Socket(String host, int port) 创建流套接字并将其连接到指定主机上的指定端口号。
*
* 2、获取输出流对象,向服务器写数据
* OutputStream getOutputStream() 返回此套接字的输出流。
*
* 3、释放资源,关闭Socket服务
*
*
* 注意事项:
* 要先启动服务器端,再启动客户端,否则会报连接被拒绝异常
*/
public class ClientDemo {
public static void main(String[] args) {
//1、创建发送端的Socket对象
//(1)Socket(InetAddress address, int port) 创建流套接字并将其连接到指定IP地址的指定端口号。
// Socket s = new Socket(InetAddress.getByName("192.168.7.42"), 12345);
//(2)Socket(String host, int port) 创建流套接字并将其连接到指定主机上的指定端口号。
Socket s = null;
try {
s = new Socket("192.168.7.18", 12345);
//2、获取输出流对象,向服务器写数据
//OutputStream getOutputStream() 返回此套接字的输出流。
OutputStream os = s.getOutputStream();
os.write("你好,新世界".getBytes());
} catch (IOException e) {
e.printStackTrace();
}
//3、释放资源,关闭Socket服务
if(s != null) {
try {
s.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/**
* -----------TCP服务器端----------------
*
* TCP协议编写服务器端代码:
* 1、创建服务器端Socket对象(ServerSocket)
* 构造方法: ServerSocket(int port) 创建绑定到指定端口的服务器套接字。
*
* 2、服务器端没有直接对流的操作,所以调用accept()方法,监听客户端的连接,返回一个对应客户端连接的Socket对象
* Socket accept() 侦听要连接到此套接字并接受它。
*
* 3、获取通道中的输入流对象,读取客户端发送的数据
* InputStream getInputStream() 返回此套接字的输入流。
* InetAddress getInetAddress() 返回套接字所连接的地址(客户端地址)。
*
* 4、释放资源,关闭Socket服务
*
*/
public class ServerDemo {
public static void main(String[] args) {
//1、创建服务器端Socket对象(ServerSocket)
//ServerSocket(int port) 创建绑定到指定端口的服务器套接字。
ServerSocket ss = null;
try {
ss = new ServerSocket(12345);
//2、调用accept()方法,监听客户端的连接,返回一个对应客户端连接的Socket对象
//Socket accept() 侦听要连接到此套接字并接受它。
Socket s = ss.accept();
//3、获取通道中的输入流对象,读取客户端发送的数据,并显示在控制台上
//InputStream getInputStream() 返回此套接字的输入流。
InputStream is = s.getInputStream();
//获取客户端的ip
//getInetAddress() 返回套接字所连接的地址(客户端地址)。
String ip = s.getInetAddress().getHostAddress();
String hostName = s.getInetAddress().getHostName();
byte[] bytes = new byte[1024];
int length = is.read(bytes);
String s1 = new String(bytes, 0, length);
System.out.println(ip + "名为: " + hostName + "发送的数据为: " + s1);
} catch (IOException e) {
e.printStackTrace();
}
}
}
5、UDP
将数据源和目的封装成数据包中,不需要建立连接;每个数据报包的大小在限制在64k;因无连接,是不可靠协议;不需要建立连接,速度快
/**
* -----------UDP发送端----------------
*
* UDP协议发送数据 :
* 1、创建发送端的Socket对象
*
* DatagramSocket类构造方法1:
* DatagramSocket() 构造数据报套接字并将其绑定到本地主机上的任何可用端口。
*
* 2、创建数据,并把数据打包
*
* DatagramPacket类构造方法1:
* DatagramPacket(byte[] buf, int length, InetAddress address, int port) 构造用于发送指定长度的数据包到指定主机上指定的端口号。
*
* 3、调用Socket对象的发送方法将数据发送出去
* 发送方法 : void send(DatagramPacket p) 从此套接字发送数据报包。
*
* 4、释放资源,关闭Socket
*
*/
public class SendDemo {
public static void main(String[] args) throws Exception{
//1、创建发送端的Socket对象
//DatagramSocket() 构造数据报套接字并将其绑定到本地主机上的任何可用端口。
DatagramSocket ds = new DatagramSocket();
//2、创建数据,并把数据打包
//(1)定义一个字节数组
byte[] bytes = "你好,大数据".getBytes();
//(2)获取数组的长度
int length = bytes.length;
//(3)要发送的IP地址
InetAddress address = InetAddress.getByName("192.168.7.18");
//(4)自定义设置端口号 有效端口:0~65535,其中0~1024系统使用或保留端口
int port = 10086;
//DatagramPacket(byte[] buf, int length, InetAddress address, int port) 构造用于发送指定长度的数据包到指定主机上指定的端口号。
DatagramPacket dp = new DatagramPacket(bytes, length, address, port);
//3、调用Socket对象的发送方法将数据发送出去
//void send(DatagramPacket p) 从此套接字发送数据报包。
ds.send(dp);
//4、释放资源,关闭Socket
ds.close();
}
}
/**
* -----------UDP接收端----------------
*
* UDP协议接收数据:
* 1、创建接收端的Socket对象
*
* DatagramSocket类构造方法2:
* DatagramSocket(int port) 构造数据报套接字并将其绑定到本地主机上的指定端口。
*
* 2、创建一个数据包(接收容器)
*
* DatagramPacket类构造方法2:
* DatagramPacket(byte[] buf, int length) 构造一个DatagramPacket用于接收指定长度的数据包。
*
* 3、调用Socket对象的接收方法接收数据
* 接收方法 : void receive(DatagramPacket p) 从此套接字接收数据报包。
*
* 4、解析数据包,得到数据并显示在控制台上
* public byte[] getData() 获取到数据包里的数据。
* public int getLength() 返回要发送的数据的长度或接收到的数据的长度。
*
* 5、释放资源,关闭Socket
*
*
* 注意事项:
* 接收端程序在绑定同一个端口的时候不能同时运行多个,即不能同时启动多个接收端。
*/
public class ReceiveDemo {
public static void main(String[] args) throws Exception {
//1、创建发送端的Socket对象
//DatagramSocket(int port) 构造数据报套接字并将其绑定到本地主机上的指定端口。
DatagramSocket ds = new DatagramSocket(10086); // 因为发送端定义了端口号10086
//2、创建一个数据包(接收容器)
//(1)定义一个字节数组
byte[] bytes = new byte[1024];
//(2)获取数组的长度
int length = bytes.length;
//DatagramPacket(byte[] buf, int length) 构造一个DatagramPacket用于接收指定长度的数据包。
DatagramPacket dp = new DatagramPacket(bytes, length);
//3、调用Socket对象的接收方法接收数据
//void receive(DatagramPacket p) 从此套接字接收数据报包。
ds.receive(dp); //调用receive程序阻塞,直到接收到发送端发送的数据
InetAddress address = dp.getAddress(); // 获取InetAddress对象
String ip = address.getHostAddress(); // 通过InetAddress对象获取ip地址字符串
//4、解析数据包,得到数据并显示在控制台上
//public byte[] getData() 获取到数据包里的数据。
byte[] data = dp.getData();
//public int getLength() 返回要发送的数据的长度或接收到的数据的长度。
int length1 = dp.getLength();
String s = new String(data, 0, length1);
System.out.println(ip + "发送的数据为: " + s);
//5、释放资源,关闭Socket
ds.close();
}
}
最后
以上就是哭泣啤酒为你收集整理的大数据 -- java基础16 网络编程 TCP UDP的全部内容,希望文章能够帮你解决大数据 -- java基础16 网络编程 TCP UDP所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复