TCP通信是严格区分客户端与服务器端,在通信时,必须先由客户端去连接服务端才能实现通信,服务器端不可主动连接客户端,并且服务器端要事先启动,等待客户端的连接
实现TCP程序提供了两个类,一个是ServerSocket类,一个是Socket类,两个都是会与客户端与服务器端进行联系。
TCP的特点是:面向连接
进行TCP通信的时候,需要进行三次握手。第一次,客户端向服务器端发出连接请求,等待服务器确认;第二次握手,服务器端向客户端回送一个响应,通知客户端收到了连接请求;第三次握手,客户端再次向服务器端发送确认信息,确认连接。
bind(SocketAddress endpoint):是ServerSocket()方法绑定到指定的端口上面
connect(SocketAddress endpoint):是Socket()方法绑定到指定的端口上面
ServerSocket
有关于ServerSocket的构造方法
1、ServerSocket():创建对象的时候服务器端没有监听任何端口,不能之间使用,还需要继续调用bind(SocketAddress endpoint)方法将其绑定到指定的端口上面
2、ServerSocket(int port):创建对象时,就可以将其绑定到一个指定的端口上面,port就是指定的端口,端口号可以指定为0,这时就会分配一个还没有使用的端口号,由于客户端需要根据指定的端口号来访问服务器端程序,一般情况下会使用指定的端口号来进行访问服务器端
3、ServerSocket(int port ,int backlog):backlog用于指定服务器在忙时,可以与之保持连接请求的等待客户数量,如果没有指定这个参数,默认值是50
4、ServerSocket(int port,int backlog,InetAddress bndAddr):加上一个相关的IP地址,是使用多个网卡和多个IP的情况
使用的方法:
1、Socket accept():该方法等于等待客户端的连接,在客户端连接之前一直处于阻塞状态,如果有客户端连接就会返回一个与之对应的Socket对象
2、InetAddress getInetAddress():该方法用于返回一个InetAddress对象,该对象中封装了ServerSocket绑定的IP地址
3、boolean isClosed():判断ServerSocket对象是否为关闭状态,是,返回true,否,返回false
4、void bind(SocketAddress endpoint):用于将ServerSocket对象绑定到指定的ip地址和端口号,其中参数endpoint封装了IP地址和端口号
注:ServerSocket对象负责监听计算机的某个端口号,创建ServerSocket之后就会需要调用accept()方法,接收来自客户端的请求。当执行了accept方法之后,服务器端会发生阻塞,知道客户端发出连接请求,accept方法才会返回一个Socket对象用于和客户端实现通信,程序向下执行
Socket
Socket的创建构造方法
1、Socket():创建对象之后调用connect(SocketAddress endpoint)方法,才能完成与指定服务器的连接,其中endpoint用于封装ip地址和端口号
2、Socket(String host,int port):创建Socket时,会根据连接的参数连接在指定的地址和端口上运行的服务器程序,其中host接受的是一个字符串类型的ip地址
3、Socket(InetAddress address,int port):与第二种类似,参数address用于接收一个InetAddress类型的对象,该对象用于封装一个ip地址
通常使用的方法是:
1、int getPort():该用法返回一个端口号,该对象是Socket对象与服务器端连接的端口号
2、InetAddress getLocalAddress():该方法用于获取Socket对象绑定的本地IP地址,并将IP地址封装成InetAddress类型的对象返回
3、void close():结束通信,在关闭Socket之前,与socket相关的输入输出流全部关闭
4、InputStream getInputStream(): 返回一个InputStream类型的输入流对象,如果该对象室友服务器端的Socket返回,就用于读取客户端发送的数据,反之,用于读取服务器端发送的数据
5、OutputStream getOutputStream():返回一个OutputStream类型的输出流对象,如果该对象室友服务器端的Socket返回,就用于向客户端发送的数据,反之,用于向服务器端发送的数据
当客户端与服务器端建立链接之后,是用IO流来进行数据的交互,从而实现通信
实现服务器端的编写
import java.net.*;
import java.io.*;
public class emp{
public static void mian(String [] args){
new TCPServer().listen();
}
}
class TCPServer{
private static final int PORT=7788
public void listen() throws Exeption{
ServerSocket serverSocket = new ServerSocket(PORT);
Socket client= serverSocket.accept();
OutputStream os = client.getOutputStream();
System.out.println("开始与客户端交互数据");
os.write("你女朋友呢!");
Thread.sleep(5000);
System.out.println("结束与客户端进行交互");
os.close();
client.close();
}
}
实现客户端的编写
import java.net.*;
import java.io.*;
public class emp{
public static void mian(String [] args){
new TCPClient().connect();
}
}
class TCPClient{
private static final int PORT=7788
public void connect() throws Exeption{
Socket client = new Socket(InetAddress.getLocalHost,PORT);
InputStream is = client.getInputStream();
byte [] buf = new byte[1024];
int len = is.read(buf);
System.out.println(new String(buf,0,len));
is.close();
client.close();
}
}