TCP/IP
TCP/IP是一种可靠的网络协议,在通信两端个简历一个Socket,形成虚拟链路,进行通信。
通信端通过Socket产生I/O流来进行网络通信。
特点
- IP协议负责传递消息,TCP提供可靠的无差错的通信服务。
- TCP协议是一种端对端协议。链接两个通信端,建立用于发送和接收数据的虚拟链路。
- TCP负责接收IP协议传送的信息包,按次序放好,接收端接收后正还原。保证了数据包在传送中准确无误。
- TCP使用重发机制:当一个通信实体发送一个消息给另一个通信实体,收到消息的通信实体确认信息,如果没有收到确认信息,会再次重新发送刚才的消息。
使用ServerSocket创建TCP服务端
在两个通信实体没有建立虚拟链路之前,必须有一个通信实体主动接收来自其他通信实体的链接请求。
Java中类ServerSocket用于监听来自客户端的链接请求。
public class SocketServer {
public static void main(String[] args) throws IOException {
ServerSocket ss = new ServerSocket(30000);//创建ServerSocket,指定端口号30000
int i = 0;
while (true) {
i++;
Socket s = ss.accept();//接收Socket请求
//向客户端发送输出流
OutputStream os = s.getOutputStream();
os.write((" 服务器的第" + i + "条数据!\n").getBytes("utf-8"));
System.out.println("客户端请求" + i + "次!");
//接收客户端发送输入流
BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream(), "utf-8"));
String string = br.readLine();
System.out.println(string);
os.close();//关闭流
s.close();//关闭ServerSocket
br.close();//关闭流
}
}
}
直接在Java IDE中编译运行以上程序,会在本机的IP地址3000端口号上创建一个服务端。
使用Socket创建TCP客户端进行通信
public class SocketClient {
public static String line = null;
public static void main(String[] args) throws IOException {
//异步任务
FutureTask<String> task = new FutureTask<String>(new Callable<String>() {
@Override
public String call() throws Exception {
Socket socket = null;
try {
//Socket构造器链接指定服务器
socket = new Socket("192.168.199.100", 30000);//192.168.199.100本机IP地址
//向服务端发送数据流
OutputStream os = socket.getOutputStream();
os.write("客户端发送的数据".getBytes("utf-8"));
//接收服务端的数据流
InputStreamReader isr = new InputStreamReader(socket.getInputStream(), "utf-8");
BufferedReader br = new BufferedReader(isr);
line = br.readLine();
System.out.println(line);
os.close();//关闭流
isr.close();//关闭流
br.close();//关闭流
socket.close();//关闭Socket
} catch (IOException e) {
e.printStackTrace();
}
return line;
}
});
new Thread(task).start();
}
}
直接在Java IDE中编译,每执行一次便向服务端发送一次请求。服务端做出一次响应,并接收客户端发送的数据。
获取本机IP地址
直接命令行输入:ipconfig
当前连接网络的IPv4地址就是,如下体红框所示。
运行效果
PS:必须先执行服务端程序,再执行客户端程序,否则客户端会提示找不到服务端地址。
执行服务端后,连续执行3次客户端,效果如下: