socket通信简单实现

1.所谓Socket通常也称作“套接字”,用于描述IP地址和端口,是一个通信链的句柄

2.应用程序通常通过“套接字”向网络发送请求或者应答网络请求

3.Socket有两种主要的操作方式:面向连接(TCP)的和无连接的(UDP)。

4.Java.net中提供了两个类Socket和ServerSocket,分别用来表示双向连接的客户端和服务端。

一个客户端要发起一次通信,首先必须知道运行服务器端的主机IP地址。然后由网络基础设施利用目标地址,将客户端发送的信息传递到正确的主机上。

ServerSocket:这个类是实现了一个服务器端的Socket,利用这个类可以监听来自网络的请求(当要监控多个客户端时,可使用类ExecutorService,其对象获取方法:Executors.newCachedThreadPool(); 调用该对象的execute(Runnablecommand)即可,在未来某个时间执行给定的命令。该命令可能在新的线程、已入池的线程或者正调用的线程中执行,这由Executor实现决定)。创建一个ServerSocket必须指定一个端口,以便客户端能够向该端口号发送连接请求。其accept()方法为下一个传入的连接请求创建Socket实例。

 Socket:利用Socket构造函数,可创建一个TCP套接字后,先连接到指定的远程地址和端口号。

通信过程中顺序:服务器端首先得到输入流,然后将输入流信息输出到其各个客户端

Socket提供了getInputStream()和getOutputStream()方法来得到输入输出流。然后再对输入流输出流进行读写操作,例 如,对于服务器端,得到Socket对象后,调用getInputStream方法即  可得到来自客户端的流,调用getOutStream方法可得到向客 户端发送数据的流。对于客户端,调用getInputStream方法即可得到来自服务器的流,调用getOutStream方法可得到向服务器端发送  数 据的流。下面是一个简单的例子:

public class SocketClient {

    public static void main(String [] args){

        Socket socket=null;
        BufferedReader reader=null;
        PrintWriter writer=null;
        try {
            //客户端socket指定服务器的地址和端口号
            socket=new Socket("127.0.0.1", SingleSocketService.port);
            //获取服务端的输入流
             reader =new BufferedReader(new InputStreamReader(socket.getInputStream()));
            //用于发送返回信息,
             writer =new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())));
            for (int i = 0; i < 10; i++) {
                writer.println("body" + i);
                writer.flush();
                String str=reader.readLine();
                System.out.println(str);
            }

            writer.println("end");
            writer.flush();

        } catch (Exception e) {
            e.printStackTrace();
        }finally {

            try {
                reader.close();
                writer.close();
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }
}
public class SingleSocketService {

    public static int port =8080;

    public static void main(String [] agres){

        ServerSocket serverSocket = null;
        BufferedReader bufferedReader = null;
        PrintWriter writer = null;
        Socket socket = null;
        //设定服务端的端口号
        try {
            serverSocket=new ServerSocket(port);
            等待请求,此方法会一直阻塞,直到获得请求才往下走
            socket=serverSocket.accept();
            //用于接收客户端发来的请求,得到输入流
            bufferedReader=new BufferedReader(new InputStreamReader(socket.getInputStream()));
            //用于发送返回信息,可以不需要装饰这么多io流使用缓冲流时发送数据要注意调用.flush()方法
            writer=new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);

            while (true){
                String str=bufferedReader.readLine();//接收到的信息
                if(str.equals("end")){
                    break;
                }

                Thread.sleep(1000);
                writer.println("Message Received");
                writer.flush();
            }

        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            try {
                bufferedReader.close();
                writer.close();
                socket.close();
                serverSocket.close();
            }catch (Exception e){

            }
        }

    }



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值