Java--网络编程三要素,Socket,UDP、TCP协议

时间:2022-05-13 00:40:11

一、网络编程

1、计算机网络

      是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。

2、网络编程

      就是用来实现网络互连的不同计算机上运行的程序间可以进行数据交换。

二、网络编程三要素

1、IP

    每个设备在网络中的唯一标识

    每台网络终端在网络中都有一个独立的地址,我们在网络中传输数据就是使用这个地址。 

    ipconfig:查看本机IP192.168.12.42

    ping:测试连接192.168.40.62

    本地回路地址:127.0.0.1 255.255.255.255是广播地址

    IPv44个字节组成,40-255。大概42亿,30亿都在北美,亚洲4亿。2011年初已经用尽。 

    IPv68组,每组416进制数。

2、端口号

    每个程序在设备上的唯一标识

     每个网络程序都需要绑定一个端口号,传输数据的时候除了确定发到哪台机器上,还要明确发到哪个程序。

     端口号范围从0-65535

     编写网络应用就需要绑定一个端口号,尽量使用1024以上的,1024以下的基本上都被系统程序占用了。

    常用端口

        mysql: 3306

        oracle: 1521

        web: 80

        tomcat: 8080

        QQ: 4000

        feiQ: 2425

3、协议

     为计算机网络中进行数据交换而建立的规则、标准或约定的集合。

     UDP

          面向无连接,数据不安全,速度快。不区分客户端与服务端。(比如:发短信)

     TCP

         面向连接(三次握手),数据安全,速度略低。分为客户端和服务端。(比如:打电话)

        三次握手:客户端先向服务端发起请求,服务端响应请求,传输数据

三、Socket套接字

      网络上具有唯一标识的IP地址和端口号组合在一起才能构成唯一能识别的标识符套接字。

       通信的两端都有Socket

       网络通信其实就是Socket间的通信。

       数据在两个Socket间通过IO流传输。

       Socket在应用程序中创建,通过一种绑定机制与驱动程序建立关系,告诉自己所对应的IPport

四、UDP传输

1、发送Send

   创建DatagramSocket,随机端口号

   创建DatagramPacket,指定数据,长度,地址,端口

   使用DatagramSocket发送DatagramPacket

   关闭DatagramSocket

2、接收Receive

   创建DatagramSocket,指定端口号

   创建DatagramPacket,指定数组,长度

   使用DatagramSocket接收DatagramPacket

   关闭DatagramSocket

   从DatagramPacket中获取数据

3、接收方获取ip和端口号

   String ip = packet.getAddress().getHostAddress();

   int port = packet.getPort();

五、TCP协议

1、客户端

      创建Socket连接服务端(指定ip地址,端口号)通过ip地址找对应的服务器

      调用SocketgetInputStream()getOutputStream()方法获取和服务端相连的IO

       输入流可以读取服务端输出流写出的数据

      输出流可以写出数据到服务端的输入流

2、服务端

      创建ServerSocket(需要指定端口号)

      调用ServerSocketaccept()方法接收一个客户端请求,得到一个Socket

      调用SocketgetInputStream()getOutputStream()方法获取和客户端相连的IO

      输入流可以读取客户端输出流写出的数据

      输出流可以写出数据到客户端的输入流

UDP发送接收多线程传输

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.Scanner;

public class ReceiveASendThreadUDP {

//使用多线程解决发送、接收
public static void main(String[] args) {
new Receive().start();
new Send().start();
}
}

class Receive extends Thread{
public void run(){
try {
DatagramSocket socket = new DatagramSocket(6666);
DatagramPacket packet = new DatagramPacket(new byte[1024], 1024);

while(true){
socket.receive(packet);
byte[] arr = packet.getData();
int length = packet.getLength();
//3、接收方获取ip和端口号
String ip = packet.getAddress().getHostAddress();
int port = packet.getPort();
System.out.println("主机地址:" + ip + "--" + "端口号:" + port + "--" + "内容是:" + new String(arr, 0, length));
}
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}

class Send extends Thread{
public void run(){
try {
DatagramSocket socket = new DatagramSocket(); //创建socket
Scanner sc = new Scanner(System.in);

while(true){
String str = sc.nextLine();
if("quit".equals(str)){
break;
}
DatagramPacket packet = //创建集装箱
new DatagramPacket(str.getBytes(), str.getBytes().length, InetAddress.getByName("127.0.0.1"), 6666);
socket.send(packet);//发送数据
}
socket.close(); //关闭
} catch (SocketException e) {
e.printStackTrace();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
TCP服务端Server

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;

/*
2、服务端
创建ServerSocket(需要指定端口号)
调用ServerSocket的accept()方法接收一个客户端请求,得到一个Socket
调用Socket的getInputStream()和getOutputStream()方法获取和客户端相连的IO流
输入流可以读取客户端输出流写出的数据
输出流可以写出数据到客户端的输入流
* */
public class ServerTCP2 {
public static void main(String[] args) throws IOException {
ServerSocket server = new ServerSocket(8888);
while(true){
final Socket socket = server.accept(); //接收客户端的请求
new Thread(){
public void run(){
try {
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintStream ps = new PrintStream(socket.getOutputStream());

ps.println("我很好");
System.out.println(br.readLine());

socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();
}
}
}

TCP服务端Client

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.Socket;
import java.net.UnknownHostException;

import org.omg.CORBA.portable.InputStream;

/*
* 1、客户端
创建Socket连接服务端(指定ip地址,端口号)通过ip地址找对应的服务器
调用Socket的getInputStream()和getOutputStream()方法获取和服务端相连的IO流
输入流可以读取服务端输出流写出的数据
输出流可以写出数据到服务端的输入流
* */
public class ClientTCP2 {
public static void main(String[] args) throws UnknownHostException, IOException {
Socket socket = new Socket("127.0.0.1", 8888);

BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintStream ps = new PrintStream(socket.getOutputStream());

System.out.println(br.readLine());
ps.println("你好啊");

socket.close();
}
}