java socket 编程实现客户端和服务端接收信息

java socket 编程,实现客户端和服务端接收信息

#学习笔记/编程/socket

tcp/IP四层模型

  1. 链路层:数据物理层,光纤,网线之类
  2. 网络层:用于将传输的数据进行分组,分配到相应的计算机或端口
  3. 传输层:网络之间进行通信
  4. 应用层:应用程序

常见网络通信协议

网络双方必须同时遵守才能进行数据交换

UDP

  1. 数据源和目的地封装在数据包中
  2. 数据包大小<64k
  3. 安全性差,速度快,面向无连接,容易丢包,用于传输即时性数据,比如视频,音频;

TCP

通过三次握手后形成通道,再传输数据,安全性较高。

三次握手

  1. 客户端发送连接请求,等待服务器确认
  2. 服务器向客户端发送连接响应
  3. 客户端再向服务端发连接确认,连接形成。

网络知识

  1. IPV4:32位二进制数
  2. IPV6:128位二进制数,分成8组十六进制
  3. 端口号:进程占用的地址,由两个字节构成(0-65535)
    操作系统会为网络软件分配随机端口号/或网络软件申请固定端口号。(1024之前的端口不可使用)
    常用端口: 80(网络端口),3306(mysql),1521(oracle),8080(Tomcat)

TCP通信程序流程

通信前

  1. 服务端监听请求
  2. 客户端主动连接,连接包含IO对象,一个数据交互要使用四个io流对象

下面以客户端和服务器端互发消息为例

客户端

  1. 创建客户端对象,绑定服务器IP地址和端口号 Socket(String host , int port);
  2. 使用客户端对象中的getOutputStream()获取网络字节输出流对象
  3. 使用网络字节输出流的write方法给服务器发送数据
  4. 获取网络字节输入流对象
  5. 使用read方法读服务器回来的数据
  6. 释放资源;

实现代码

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

public class TCPClient {
    public static void main(String args[]) {
        try {
            Socket s1=new Socket("127.0.0.1",8888);//创建客户端对象
            OutputStream out1=s1.getOutputStream();
            byte[] bytes="232323".getBytes();
            out1.write(bytes);
            System.out.println("客户端发出了"+new String(bytes));
            InputStream i1=s1.getInputStream();
            byte[] bytes2=new byte[1024];
            int len=i1.read(bytes2);
            System.out.println("客户端接受到了"+new String(bytes2,0,len));
            s1.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

服务端

  1. 创建服务器对象,端口号
  2. 使用服务器对象中的accpet();获取请求的客户端对象
  3. 使用客户端对象的getINputStream()获取网络字节输入流对象
  4. 使用网络字节输入流的read方法获取数据
  5. 获取网络字节输出流对象
  6. 使用write方法回数据
  7. 释放资源(Socket,ServerSocket);

代码实现

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class TCPServer {
    public  static void main(String[] args){
        ServerSocket s1 =null;
        try {
            s1= new ServerSocket(8888);
            Socket s2 = s1.accept();
            InputStream IN1=s2.getInputStream();
            byte[] bytes=new byte[1024];
            int len =IN1.read(bytes);
            System.out.println("服务器端收到+"+new String(bytes,0,len));
            byte[] bytes1="6666".getBytes();
            OutputStream out1=s2.getOutputStream();
            out1.write(bytes1);
            System.out.println("服务器发送"+new String(bytes1));
            s2.close();
            s1.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

一些其他api

InetAddress类

  1. getLocalhost();返回主机地址(字符串)
  2. getLocalName();返回主机名
  3. getByName(String host);给定主机名的情况下确定主机的ip地址。

你可能感兴趣的:(java学习)