之前了解了UDP通信,现在了解下TCP通信,TCP通信也能实现两台计算机的通信,但TCP通信的两端需要创建Socket对象,两者的区别在于,UDP中只有发送端和接收端,不区分客户端和服务器端,计算机之间可以任意发送数据;而TCP通信是严格区分客户端和服务器端的,在通信时,必须先由客户端去连接服务器端才能实现通信,服务器不可以主动连接客服端,并且服务器端程序需要事先启动,等待客户端的连接
Java提供了两个用于实现TCP程序的类,一个是ServerSocket类,用于表示服务器端;另一个是Socket类,用于表示客户端
ServerSocket对象负责监听某台计算机的某个端口号,在创建ServerSocket对象后,需要继续调用该对象的accept()方法,接收来自客户端的请求。当执行了accept()方法之后,服务器端程序会发生阻塞,直到客户端发出连接请求时,accept()方法才会返回一个Socket对象用于与客户端实现通信,程序才能继续向下执行。
表中的getInputStream()和getOutStream()方法分别用于获取输入流和输出流。当客户端和服务器端建立连接后,数据是以I/O流的形式进行交互的,从而实现通信。
下面用代码进行演示
package Text4;
import java.io.IOException;
import java.io.OutputStream;
import java.net.*;
public class text2 {
public static void main(String[] args) throws Exception {
new TCPServer().listen();//创建TCPServer对象,并调用listen()方法
}
}
//TCP服务器端
class TCPServer {
private static final int PORT=9856;//定义一个端口号
public void listen() throws Exception{//定义一个listen()方法,抛出异常
ServerSocket serverSocket=new ServerSocket(PORT);
//调用ServerSocket类的accept()方法接收数据
Socket client=serverSocket.accept();
OutputStream os=client.getOutputStream();//获取客户端的输出流
System.out.println("开始与客户端交互数据");
//当客户端连接到服务器端时,向客户端输出数据
os.write(("传智播客欢迎你").getBytes());
Thread.sleep(5000);//模拟执行其他功能占用的时间
System.out.println("结束与客户端交互数据");
os.close();
client.close();
}
}
package Text4;
import java.io.InputStream;
import java.net.*;
public class text1 {
public static void main(String[] args) throws Exception {
new TCPClient().connect();//创建TCPClient对象,并调用connect()方法
}
}
//TCP客户端
class TCPClient {
private static final int PORT=9856;//服务器端的端口号
public void connect()throws Exception {
//创建一个Socket并连接到给出地址和端口号的计算机
Socket client=new Socket(InetAddress.getLocalHost(),PORT);
InputStream is=client.getInputStream();//得到接收数据的流
byte[]buf=new byte[1024];//定义1024个字节数组的缓冲区
int len=is.read(buf); //将数据读到缓冲区中
System.out.println(new String(buf,0,len));//将缓冲区中的数据输出
client.close(); //关闭Socket对象,释放资源
}
}
这就形成了完整的通信流程,在开启客户端前,必须先开启服务器端,不然会报错