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网络编程的主要内容,如果未能解决你的问题,请参考以下文章

Socket网络编程

socket 网络编程

02 Socket网络编程

socket网络编程

Socket网络编程

python网络编程2--socket