客户端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(); } } }
时间: 2024-10-06 08:37:57