实现socket的服务和客户端通讯

对学习过程当中本身敲的一些关于socket有关的代码作了个简单总结,在这分享一下,给有须要的同窗借鉴一下。java

什么是socket?程序员

网络上的两个程序经过一个双向的通讯链接实现数据的交换,这个链接的一端称为一个socket。
创建网络通讯链接至少要一对端口号(socket)。socket本质是编程接口(API),对TCP/IP的封装,TCP/IP也要提供可供程序员作网络开发所用的接口,这就是Socket编程接口;HTTP是轿车,提供了封装或者显示数据的具体形式;Socket是发动机,提供了网络通讯的能力。
Socket的英文原义是“孔”或“插座”。做为BSD UNIX的进程通讯机制,取后一种意思。一般也称做"套接字",用于描述IP地址和端口,是一个通讯链的句柄,能够用来实现不一样虚拟机或不一样计算机之间的通讯。在Internet上的主机通常运行了多个服务软件,同时提供几种服务。每种服务都打开一个Socket,并绑定到一个端口上,不一样的端口对应于不一样的服务。Socket正如其英文原义那样,像一个多孔插座。一台主机犹如布满各类插座的房间,每一个插座有一个编号,有的插座提供220伏交流电, 有的提供110伏交流电,有的则提供有线电视节目。 客户软件将插头插到不一样编号的插座,就能够获得不一样的服务。
Java就给咱们提供了socket,咱们只要会使用就能够了,接下来为你们介绍一个简单的socket小例子,完成socket服务和客户端间的通讯。
这是咱们socket小例子的一个简单架构,由服务端、客户端、线程工做业务逻辑、数据获取类组成。

 

首先咱们先来完成socket服务端的代码开发。编程

在服务端的main方法里,咱们将socketserver对象设置成持久的,并绑定于本机的8899端口上,去接收客户端的socket链接。服务器

package com.wenbing.socket;

import java.net.InetSocketAddress;
import java.net.Proxy;
import java.net.ServerSocket;
import java.net.Socket;

public class ServiceServer {

    public static void main(String[] args) throws Exception{
//        建立一个serversocket,绑定到本机的8899端口上
        ServerSocket server = new ServerSocket();
        server.bind(new InetSocketAddress("localhost", 8899));

//        接收客户端的链接;accept是一个阻塞方法,会一直等待,到有客户端请求链接才返回
        while (true) {
            Socket socket = server.accept();
//            每一个socket请求都给一个线程来处理
            new Thread(new ServiceServerTask(socket)).start();

        }

    }

}

 

 咱们定义一个服务端处理客户端请求过来的数据处理线程工做类,让每一个请求来的socket都由每个线程去执行业务逻辑,ServiceServerTask类实行Runnable接口。
package com.wenbing.socket;

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

public class ServiceServerTask implements Runnable {

    Socket socket;
    InputStream inputStream = null;
    OutputStream outputStream = null;

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

    //    业务逻辑,跟客户端进行数据交互
    @Override
    public void run() {

        try {
//            从socket链接中获取到与client之间的网络通讯输入流
            inputStream = socket.getInputStream();
//            从socket链接中获取到与client之间的网络通讯输出流
            outputStream = socket.getOutputStream();

//            BufferedReader读取数据是一个字符一个字符读取,遇到回车即中止
            BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
//            从网络通讯输入流中读取客户端发送过来的数据,读取一行,遇到回车即结束
            // 注意:socketinputstream的读数据的方法是阻塞的
            //读取不少行数据,用while循环读
//            String line = "";
//            String param = "";
//            while (( line = br.readLine()) != null) {
//                param = br.readLine();
//                System.out.println(param);
//            }
            String param = br.readLine();

            System.out.println(param);
            GetDataServiceImpl getDataService = new GetDataServiceImpl();
            String result = getDataService.getData(param);

//            将调用结果写到socket的输出流中,以发送给客户端
            PrintWriter printWriter = new PrintWriter(outputStream);
            printWriter.println(result);
            printWriter.flush();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
//                关流,如今是在每一个线程里
                inputStream.close();
                outputStream.close();
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }


    }
}

处理数据的方法。网络

package com.wenbing.socket;

public class GetDataServiceImpl {

    public String getData(String param) {
        return "OK-" + param;
    }

}

接下来就是socket客户端了。客户端和服务端代码基本相同。架构

package com.wenbing.socket;

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

public class ServiceClient {

    public static void main(String[] args) throws Exception {
//        向服务器发出请求创建链接
        Socket socket = new Socket("localhost", 8899);
//        从socket中获取输出流
        InputStream inputStream = socket.getInputStream();
        OutputStream outputStream = socket.getOutputStream();

        PrintWriter printWriter = new PrintWriter(outputStream);
        printWriter.println("hello");
        printWriter.flush();

        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
        String result = bufferedReader.readLine();
        System.out.println(result);

        inputStream.close();
        outputStream.close();
        socket.close();
    }

}

简单的socket小例子,送给java小白们。socket

纸上得来终觉浅,绝知此事要躬行,必定要跟着敲一敲才更容易理解哦。ide

相关文章
相关标签/搜索