java网络协议

网络协议

每一层都有对应的协议

TCP/IP协议

TCP三次握手

作用:验证是否能发送/接收数据

第一次握手:客户端发送能力

第二次握手:服务器的接收和发送能力(返回信息给客户端,让客户端知道服务器可以接收)

第三次握手:客户端的接收能力

三次之后就可以发送数据了

网络通信的实现

socket编程

套接字使用TCP提供了两台计算机之间的通信机制。 客户端程序创建一个套接字,并尝试连接服务器的套接字。

当连接建立时,服务器会创建一个 Socket 对象。客户端和服务器现在可以通过对 Socket 对象的写入和读取来进行通信。

java.net.Socket 类代表一个套接字,并且 java.net.ServerSocket 类为服务器程序提供了一种来监听客户端,并与他们建立连接的机制。

当然,这里的ServerSocket只是socket通信中的一种,实际上,socket通信有三种模式来让我们实现:

1.流式套接字

提供了一个面向连接,可靠的数据传输服务,数据无差错,无重复的发送,且按发送顺序接收,其实他对应使用的是TCP协议

2.数据报式套接字

面向无连接,数据报以独立包形式发送,不提供无差错保证,数据可能丢失或重复,并且接收顺序无序,其实他对应使用的是UDP协议

3.原始式套接字

该接口允许对较低层次协议,如IP直接访问。可以接收本机网卡上的数据帧或数据包,对监听网络流量和分析很有用

TCP协议通信

TCP是一个面向连接的,可靠的,基于字节流的传输层协议.

面向连接: 所谓的连接,指的是客户端与服务器端的连接,在双方相互通信之前,TCP需要三次握手建立连接.

可靠性:TCP花费了非常多的功夫保证连接的可靠性,这个可靠性体现在下面两个方面:

服务端编程

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

/**
 *
 */
public class Demo {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(8888);
        Socket socket = serverSocket.accept();   //如果没链接就阻塞
        System.out.println("连接了");

        InputStream inputStream = socket.getInputStream();
        OutputStream outputStream = socket.getOutputStream();

        BufferedReader reader = null;
        BufferedWriter writer =null;

        reader=new BufferedReader(new InputStreamReader(inputStream)); //把字节流转换为字符流再转换为Buffer
        writer= new BufferedWriter(new OutputStreamWriter(outputStream));

        //接收
        String line = reader.readLine();
        System.out.println("接收到客户端的信息: "+line);

        //发送
        writer.write("我是服务端发的信息");
        writer.newLine();//换行符  因为是字符缓冲流,它读是一行一行读的
        writer.flush(); //如果不刷新或者关闭,那么数据就会在缓冲区读不出来

        writer.close();
        reader.close();
        socket.close();
        serverSocket.close();

    }
}

 客户端实现

import java.io.IOException;
import java.net.InetAddress;
import java.net.Socket;

public class Client3 {
    public static void main(String[] args) throws IOException {
        Socket socket = new Socket(InetAddress.getLocalHost(),8888);
        new Send(socket).start();
        new Receive("客服",socket).start();
    }
}

方法实现

import java.io.*;
import java.net.Socket;

public class Receive extends Thread{
    private Socket socket;
    private boolean flag=true;


    public Receive(String name, Socket socket) {
        super(name);
        this.socket = socket;
    }

    @Override
    public void run() {
        while (flag){
            String receive = receive();
            System.out.println(receive);
        }
    }


    public String receive() {
        InputStream inputStream = null;
        BufferedReader reader = null;
        String line = null;
        try {
            inputStream = socket.getInputStream();
            reader=new BufferedReader(new InputStreamReader(inputStream)); //把字节流转换为字符流再转换为Buffer
            //接收
            line = reader.readLine();
            return this.getName()+":"+line;
        } catch (IOException e) {
            flag=false;
            CloseUtil.close(reader,socket);
            e.printStackTrace();
        }

        return null;
    }
}
import java.io.*;
import java.net.Socket;
import java.util.Scanner;

public class Send extends Thread{
    private Socket socket;
    private boolean flag=true;
    Scanner input = new Scanner(System.in);


    public Send(Socket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {
        while (flag){
            send(input.next());
        }
    }

    public void send(String str){
        OutputStream outputStream = null;
        BufferedWriter writer =null;
        try {
            outputStream = socket.getOutputStream();
            writer= new BufferedWriter(new OutputStreamWriter(outputStream));
            writer.write(str);
            writer.newLine();
            writer.flush();
        } catch (IOException e) {
            flag=false;
            CloseUtil.close(writer,socket);
            e.printStackTrace();
        }
    }
}

 

import java.io.Closeable;
import java.io.IOException;

public class CloseUtil {
    public static void close(Closeable... closeables){
        if (closeables != null && closeables.length>0){
            for (Closeable closeable : closeables) {
                if (closeable!=null){
                    try {
                        closeable.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值