java套接字(socket)实例

客户端socket

流程:

1、连接远程主机

2、发送数据

3、接收数据

4、关闭流与socket连接

实例:

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

/**
 * Created by CLY on 2017/7/11.
 */
public class ClientSocket {
    public static void main(String[] arg){
        int port = 233;//与之连接的服务端套接字的端口号
        String host = "127.0.0.1";//与之连接的服务端套接字ip地址
        Socket socket = null;
        try {
            //创建socket连接,即在该Socket构造函数返回之前,就会与远程主机建立连接,如果未能连接,则会抛出异常。
            socket = new Socket(host, port);

            //获取输出流,向服务器端发送当前时间
            OutputStream outputStream = socket.getOutputStream();
            Writer writer = new OutputStreamWriter(outputStream);
            String now_date = new Date().toString();
            writer.write("客户端当前时间为——"+now_date);
            writer.flush();
            ////关闭客户端的输出流。相当于给流中加入一个结束标记-1.这个样子服务器的输入流的reaLine方法就会读到一个-1,然后结束readLIne方法。
            socket.shutdownOutput();

            //获取输入流,并读取服务器端的响应信息
            InputStream inputStream= socket.getInputStream();
            BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
            String server_info = null;
            while((server_info=br.readLine())!=null){
                System.out.println("服务端传过来的值:"+server_info);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //如果socket不为null,则释放掉它
            if (socket!=null){
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

 

服务端Socket

流程:

1、绑定端口

2、监听入站数据

3、在绑定的端口上接受来自远程机器的连接

4、接收数据

5、发送数据

6、关闭流与socket连接

实例:

import java.io.*;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Date;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * Created by CLY on 2017/7/11.
 */
public class MyServerSocket {
    public static void main(String[] arg){
        /**
         * 根据tcp协议可知,所谓套接字(socket)是指一个由“ip地址+端口”组成的组合。
         * 而每一台主机的ip地址都是确定的,不需要我们来指定,
         * 所以构建服务器socket的第一步就是确定端口
         */
        try {
            int port = 233;//端口号
            int queueLength = 50;//最大入站连接
            InetAddress bindAddress = InetAddress.getByName("127.0.0.1");//只监听该ip的指定端口
            ExecutorService pool = Executors.newFixedThreadPool(50);//创建一个最大容量为50的线程池,为每一个入站连接分配一条线程。

            //创建一个端口为“233”的服务器socket
            ServerSocket serverSocket = new ServerSocket(port);

            //创建一个端口为233的服务器socket,且队列一次最多能保存50个入站连接
            //ServerSocket serverSocket = new ServerSocket(port,queueLength);

            //假设一台主机有多个ip地址,则服务器socket会默认在所有ip地址的指定端口上监听,但可以指定其只监听指定ip的端口。
            //ServerSocket serverSocket = new ServerSocket(port,queueLength,bindAddress);

            while (true){
                //accept()调用会阻塞,会一直等到有客户端连接到指定socket端口为止。
                final Socket connection = serverSocket.accept();

                //线程池中拿取一条线程来处理socket连接。然后主程序运行下一个循环,继续等待下一个客户端的访问。
                pool.execute(new Runnable() {
                    public void run() {
                        try {
                            //从输入流中读取获取客户端传过来的值
                            InputStream inputStream= connection.getInputStream();
                            BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
                            String client_info = null;
                            while((client_info=br.readLine())!=null){
                                System.out.println("客户端传过来的值:"+client_info);
                            }

                            //测试:将当前时间写入流中返回给客户端
                            Writer writer = new OutputStreamWriter(connection.getOutputStream());
                            String nowData = new Date().toString();
                            writer.write("服务端当前时间为——"+nowData);
                            writer.flush();
                        } catch (IOException e) {
                            e.printStackTrace();
                        } finally {
                            try {
                                //关闭socket连接
                                connection.close();
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                        }
                    }
                });
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

 

posted @ 2017-07-12 01:25  Red_Code  阅读(4374)  评论(0编辑  收藏  举报