Java基于TCP/IP的Socket通信

基于TCP/IP的Socket通信通过输入流和输出流来传递数据,在这之前必须实现服务端和客户端的连接,客户端和服务端三次握手确认连接后,即可通过对应的流进行通信,基于TCP/IP的Socket通信的三次握手确认使得通信相对安全可靠。

Socket客户端由ServerSocket类实现

ServerSocket类的的一些方法:

构造方法
ServerSocket(int port)
Creates a server socket, bound to the specified port.
创建一个socket服务并绑定特定的端口。

注:

端口号为0~65535,其中0~1023为系统保留端口,所以可以任意取1024~65535内的端口。

Socket accept() throws IOException
Listens for a connection to be made to this socket and accepts it.
监听并接受socket连接。

注:

方法返回一个客户端连接的Scoket对象,通过这个对象可获取输入流输出流与客户端通信;

当线程调用accept()方法而没有socket连接时,线程将处于阻塞状态;

若在调用accept()方法前调用setSoTimeOut(int timeout)设定了等待时间,且在等待时间过后未有socket连接,则方法抛出SocketTimeoutException异常(setSoTimeOut(int) 参数为毫秒)。

void close()
Closes this socket.
关闭这个socket

InetAddress getInetAddress()
Returns the local address of this server socket.
返回本地socket服务的地址(InetAddress对象)

boolean isBound()
Returns the binding state of the ServerSocket.
boolean isClosed()
Returns the closed state of the ServerSocket.

Socket客户端通过创建Socket类对象与服务端连接

Socket类的一些方法:

构造方法
Socket(InetAddress address, int port)
Socket(String host, int port)
Creates a stream socket and connects it to the specified port number at the specified IP address.
创建一个流socket并连接到特定的IP地址的特定端口

注:

前一个构造方法中InetAddress对象可由InetAddress类的几个静态方法获得;

后一个构造方法中String host可以是主机名或者是IP地址。

void close()
Close this socket.

InetAddress getInetAddress()
Returns the address to which the socket is connected.
返回socket连接到的地址(InetAddress对象)

InputStream getInputStream()
OutputStream getOutputStream()
获取输入流和输出流

void shutdownInput()
void shutdownOutput()
关闭输入流和输出流

以上引用的内容来自Java API 1.8.0
更多相关的类和方法可查询Java API

服务端实现
  1. 创建ServerSocket实例,启动服务器
  2. 等待客户端连接
  3. 获取输入流输出流进行通信
  4. 关闭相关资源
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {

    public void start() throws IOException {//将异常抛出

        //创建ServerSocket实例,绑定8000端口,启动服务
        ServerSocket server = new ServerSocket(8000);
        InetAddress address = InetAddress.getLocalHost();
        System.out.println(address + "服务器启动");

        //等待客户端连接,在有客户端连接前线程阻塞
        Socket socket = server.accept();

        //获取输出流
        InputStream input = socket.getInputStream();
        BufferedReader reader = new BufferedReader(new InputStreamReader(input));
        String line;
        while((line = reader.readLine()) != null){
            System.out.println(line);
        }

        //关闭资源
        socket.shutdownInput();
        reader.close();
        socket.close();

        //关闭服务
        server.close();
    }   

    public static void main(String[] args) {
        try {
            new Server().start();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}
客户端实现
  1. 创建Socket实例,连接到指定服务端
  2. 获取输入流和输出流进行通信
  3. 关闭相关资源
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;

public class Client {

    public void start() throws IOException {//将异常抛出

        //创建Socket实例,连接到localhost的8000端口
        Socket socket = new Socket("localhost", 8000);

        //获取输出流
        OutputStream output = socket.getOutputStream();
        PrintWriter writer = new PrintWriter(output);
        writer.write("客户端连接");
        writer.flush();

        //关闭资源
        socket.shutdownOutput();
        writer.close();
        socket.close();

    }

    public static void main(String[] arg){
        try {
            new Client().start();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值