码迷,mamicode.com
首页 > 其他好文 > 详细

Socket网络编程

时间:2018-04-01 15:21:52      阅读:168      评论:0      收藏:0      [点我收藏+]

标签:服务器端   实现   连接   物理   red   内存   java平台   reader   复杂   

网络编程的概念:

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

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

网络编程三要素:

 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网络编程

标签:服务器端   实现   连接   物理   red   内存   java平台   reader   复杂   

原文地址:https://www.cnblogs.com/3020815dzq/p/8686683.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!