Socket网络编程
Posted junqiang-ma
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Socket网络编程相关的知识,希望对你有一定的参考价值。
基础知识:
链路层:链路层是用于定义物理传输通道,通常是对某些网络连接设备的驱动协议,例如针对光纤、网线提供的驱动。
网络层:网络层是整个TCP/IP协议的核心,它主要用于将传输的数据进行分组,将分组数据发送到目标计算机或者网络。
运输层:主要使网络程序进行通信,在进行网络通信时,可以采用TCP协议,也可以采用UDP协议。
应用层:主要负责应用程序的协议,例如HTTP协议、FTP协议等。
IPV4:它是由4个字节大小的二进制数来表示
IPv6使用16个字节表示IP地址
在计算机中,不同的应用程序是通过端口号区分的
0~1023之间的端口号用于一些知名的网络服务和应用,用户的普通应用程序需要使用1024以上的端口号到65535
<ip类>
java.net.InetAddress 互联网协议中的ip地址
* 静态方法创建对象
* static InetAddress getLocalHost() 返回本地主机对象
* static InetAddress getByName(String host) 返回指定主机的ip地址对象 可以传入主机名 ip地址 网址
*
* 方法
* String getHostName() 返回主机名
* String getHostAddress() 返回字符串的ip地址
UDP协议消耗资源小,通信效率高,所以通常都会用于音频、视频和普通数据的传输偶尔丢失一两个数据包,也不会对接收结果产生太大影响。
UDP发送端 java.net.DatagramSocket
* DatagramSocket() 发送端对象
* 方法
* send(DatagramPacket p)
* 发送端数据包 java.net.DatagramPacket
* DatagramPacket(byte[] bytes,int length ,InetAddres ip ,int port)
*
* 1.准备数据 "你好UDP".getBytes()
* 2.创建数据包对象DatagramPacket 封装数据 ip地址 端口号
* 3.创建发送端对象 DatagramSocket
* 4.调用发送端send方法 发送数据包
* 5.关闭资源
UDP的接收端
* java.net.DatagramSocket
* 构造方法
* DatagramSocket(int port) 接收端对象
* 方法
* void receive(DatagramPacket p) 接收数据包
* java.net.DatagramPacket UDP的接收端的数据包
* 构造方法
* DatagramPacket(byte[] buf, int length) 接收端的数据包对象
*
* 1.创建接收端对象 绑定一个端口号DatagramSocket
* 2.创建DatagramPacket对象 用来接收数据包
* 3.调用receive方法接收数据包
* 4.拆包
* DatagramPacket
* int getLength() 获取长度
* InetAddress getAddress() 获取ip
* int getPort() 获取发送端端口
5.关闭资源
TCP协议是面向连接的通信协议,即在传输数据前先在发送端和接收端建立逻辑连接,然后再传输数据,它提供了两台计算机之间可靠无差错的数据传输。
TCP客户端
* java.net.Socket
* 构造方法
* Socket(InetAddress address, int port)
* Socket(String host, int port) 封装服务端地址和端口
* 方法
* InputStream getInputStream() 获取字节输入流对象
* OutputStream getOutputStream() 获取字节输出流对象
*
* 1.创建客户端对象 Socket
* 2.获取字节输出流对象 写数据
* 3.获取字节输入流对象 读取服务端返回的数据
* 4.关闭资源
TCP服务端
* java.net.ServerSocket
* 构造方法
* ServerSocket(int port)创建服务端对象
* 方法
* Socket accept() 侦听并获取连接的客户端对象
*
* 1.创建服务端对象ServerSocket
* 2.调用accept()获取到连接当前服务端的客户端对象
* 3.调用客户端的getInputStream方法 获取字节输入流 读数据
* 4.调用客户端的getOutputStream方法 获取字节输出流 写数据
* 5.关流
上传文件客户端
*
* 数据源:d:\1.jpg
* 数据目的:服务端
* 1.创建客户端对象
* 2.创建FileInputStream对象 读取数据
* 3.调用getOutputStream获取字节输出流对象 用来向服务器写数据
* 4.循环读写
* 5.调用getInputStream获取字节输入流对象 接收服务器返回的上传成功
* 6.关闭资源
文件上传服务端
* 数据源:客户端
* 数据目的:d:\upload1\1.jpg
*
* 1.创建服务端对象
* 2.调用accept方法 获取客户端对象
* 3.调用getInputStream方法 获取字节输入流对象
* 4.创建FileOutputStream 获取字节输出流对象
* 5.循环读写
* 6.调用getOutputStream 获取字节输出流对象 向服务端返回上传成功
* 7.关闭资源
实例:
UDP接收端:
package demo_23_01;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketAddress;
import java.net.SocketException;
public class Recve {
public static void main(String[] args) throws IOException {
// 定义接收端<码头>
DatagramSocket ds = new DatagramSocket(8080);
while (true) {
byte[] b = new byte[1024];
// 定义拆包对象
DatagramPacket dp = new DatagramPacket(b, b.length);
// 接收数据
ds.receive(dp);
int lenth = dp.getLength();
// 发送端网络端口
InetAddress address = dp.getAddress();
int port = dp.getPort();
SocketAddress socketAddress = dp.getSocketAddress();
System.out.println("发送端网络地址:" + address + "发送端端口号:" + port + " socketAddress" + socketAddress);
System.out.println(new String(b, 0, b.length));
}
}
}
UDP发送端:
package demo_23_01;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.util.Scanner;
public class Send {
public static void main(String[] args) throws IOException {
// 定义发送端<码头>
DatagramSocket send = new DatagramSocket();
// 外界发送
Scanner sc = new Scanner(System.in);
while (true) {
System.out.println("要发送的数据:");
String str = sc.nextLine();
// 创建本地主机对象
InetAddress ip = InetAddress.getByName("127.0.0.1");
// 准备数据<打包快递包>
byte[] b = new byte[1024];
b = str.getBytes();
DatagramPacket dp = new DatagramPacket(b, b.length, ip, 8080);
// 发送数据
send.send(dp);
}
// send.close();
}
}
以上是关于Socket网络编程的主要内容,如果未能解决你的问题,请参考以下文章