Socket网络编程

Posted 秋风伊人

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Socket网络编程相关的知识,希望对你有一定的参考价值。

网络编程的概念:

网络编程从大的方面说就是对信息的发送到接收,中间传输为物理线路的作用,编程人员可以不用考虑……

网络编程最主要的工作就是在发送端把信息通过规定好的协议进行组装包,在接收端按照规定好的协议把包进行解析,从而提取出对应的信息,达到通信的目的!中间最主要的就是数据包的组装,数据包的过滤,数据包的捕获,数据包的分析,当然最后再做一些处理!

网络编程三要素:

 A:IP地址  B:端口  C:协议

什么是Socket:

Socket的底层机制复杂,Java平台提供了一些简单的API,可以更简单有效的使用Socket开发而无需了解底层机制

Socket套接字 :
是网络上具有唯一标识的IP地址和端口号组合在一起才能构成唯一能识别的标识符套接字。
socket实现的原理机制:
1、通信的两端都有Socket
2、网络通信其实就是Socket间的通信
3、数据在两个Socket间通过IO传输

Socket网络编程一般可以分成如下步骤进行:

服务器端流程:
1、创建服务器套接字---分配内存、初始化
2、服务器套接字--侦听
3、建立与客户端配套的客户端套接字
4、与客户端通讯(可以多客户端)
5、关闭、销毁服务器端相应套接字
----------------
客户端:
1、创建客户端套接字---分配内存、初始化
2、连接服务器
3、与服务器通讯
4、关闭、销毁客户端套接字

模拟用户登录的功能:

来个例子:

package cn;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.UnknownHostException;

public class Socket {

    public static void main(String[] args) throws Exception {
        DatagramSocket ds=new DatagramSocket();
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        String line="s";
        byte [] bys=line.getBytes();
        int num=bys.length;
        InetAddress address=InetAddress.getByName("192.168.60.89");
        int port=10861;
        DatagramPacket dp=new DatagramPacket(bys,num, address,port);
        ds.send(dp);        
        ds.close();


    }

}
Socket类
package cn;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;


public class Socket1 {

    public static void main(String[] args) throws Exception {
        DatagramSocket ds=new DatagramSocket(10861);

        byte[] bys = new byte[1024];
        int len = bys.length;
        DatagramPacket dp = new DatagramPacket(bys, len);

        ds.receive(dp);

        byte[] by = dp.getData();
        int length = dp.getLength();

        InetAddress address = dp.getAddress();
        String ip = address.getHostAddress();

        String s = new String(by, 0, length);
        System.out.println(ip + "---" + s);

    ds.close();


    }

}
Socket1

运行结果:

基于UDP协议的Socket编程:

DatagramPacket类:封装了数据报的数据、数据长度、目标地址和目标端口

DatagramSocket类:接收和发送DatagramPacket对象封装好的数据报

基于UDP协议的Socket网络编程步骤:

 

来个栗子:

客户咨询问题:

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;


public class ServerSocket1 {

    public static void main(String[] args) throws Exception{
               //1.创建对象
                ServerSocket sk=new ServerSocket(11111);
                //2.监听
                Socket s=sk.accept();
                //打包数据
                BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));    
                BufferedReader bw=new BufferedReader(new InputStreamReader(System.in));
                OutputStream os=s.getOutputStream();
                String line=null;
                while((line=br.readLine())!=null){
                    System.out.println("Client \\t"+line);        
                    
                    os.write(bw.readLine().getBytes());
                }            
                //释放资源
                s.close();
                //sk.close();


    }

}
ServerSocket1服务器
import java.io.BufferedReader;
import java.io.BufferedWriter;

import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;


public class Socket1 {

    public static void main(String[] args) throws Exception {
        Socket sk=new Socket("192.168.60.89",11111);
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(sk.getOutputStream()));
        String line=null;
        while((line=br.readLine())!=null){            
            bw.write(line);
            bw.newLine();
            bw.flush();
            
            InputStream is=sk.getInputStream();            
            byte [] by=new byte[1024];
            int num=is.read(by);
            String h=new String(by, 0, num);
            System.out.println("Service:\\t"+h);
        }                    
            //br.close();
            //bw.close();
            sk.close();

    }

}
Socket1客户类

 运行结果:

 

以上是关于Socket网络编程的主要内容,如果未能解决你的问题,请参考以下文章

VSCode自定义代码片段——JS中的面向对象编程

VSCode自定义代码片段9——JS中的面向对象编程

VSCode自定义代码片段14——Vue的axios网络请求封装

VSCode自定义代码片段14——Vue的axios网络请求封装

VSCode自定义代码片段14——Vue的axios网络请求封装

Python--网络编程-----socket代码实例