Java Socket入门

Java Socket底层采用TCP/IP协议通信,通信细节被封装,我们仅仅需要指定IP、端口,便能轻易地创建TCP或UDP连接,进行网络通信。数据的读写,可以使用我们熟悉的stream进行操作。

TCP通信中,服务端与客户端是一对多的关系,如下图

Client发起连接请求后,Server端响应并创建一个Socket实例,与Client端一对一通信。通信完毕后,Client端与Server端的Socket实例各自关闭连接并销毁,此次通信结束。

发起连接的三次握手和关闭连接的四次挥手过程暂且不表,后续文章详细介绍。下面看具体代码

服务端代码

package com.coshaho.learn.socket;

import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * SocketServer.java Create on 2017年12月16日 下午11:42:03    
 * 类功能说明:   socket服务端
 * @Author coshaho
 */
public class SocketServer 
{
    public static void main(String[] args) throws Exception 
    {
        // 创建服务端
        ServerSocket server = new ServerSocket(10000);
        
        // 服务端阻塞式监听客户端连接请求
        // 接收到连接请求,则创建一个socket实例,与客户端通信
        Socket client = server.accept();
        
        // 获取InputStream读取数据
        InputStream in = client.getInputStream();
        byte[] b = new byte[1024];
        // 客户端关闭输出流后服务端会读取到-1标志
        while(-1 != in.read(b))
        {
            System.out.println(new String(b));
        }
       
        // 获取OutputStream输出数据
        OutputStream out = client.getOutputStream();
        out.write("hello, client".getBytes());
        // 输出结束,关闭输出流
        client.shutdownOutput();
       
        System.out.println("Server close. " + System.currentTimeMillis());
        server.close();
    }
}

 

 客户端代码

package com.coshaho.learn.socket;

import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

/**
 * SocketClient.java Create on 2017年12月16日 下午11:42:53    
 * 类功能说明:   socket客户端
 * @Author coshaho
 */
public class SocketClient 
{
    public static void main(String[] args) throws Exception 
    {
        // 请求连接服务端,握手成功,返回Socket实例
        Socket client = new Socket("127.0.0.1",10000);
        
        // 获取输入输出流,读写数据(与服务端数据读写操作相同)
        InputStream in = client.getInputStream();
        OutputStream out = client.getOutputStream();
        
        out.write("hello, server".getBytes());
        client.shutdownOutput();
        
        byte[] b = new byte[1024];
        while(-1 != in.read(b))
        {
            System.out.println(new String(b));
        }
        
        System.out.println("Client close. " + System.currentTimeMillis());
        client.close();
    }
}

 

posted @ 2017-12-17 00:30  coshaho  阅读(2791)  评论(0编辑  收藏  举报