TCP/IP协议
要想实现两台甚至多台机子之间的相互通信,底层是使用TCP/IP协议的,而
Socket套接字完成了对TCP/IP协议的封装和使用。
网络由下往上分为:
物理层--
数据链路层--
网络层-- IP协议
传输层-- TCP协议
应用层-- HTTP协议
TCP/IP连接
TCP协议是对上层网络提供接口,使上层网络数据的传输建立在“无差别”的
网络之上
IP协议定义了寻址方法和数据报的封装结构。IP协议只关心如何使得数据能
够跨越本地网络边界的问题,而不关心使用传输媒体的类型和数据传输的方式。
能够使得不同应用类型的数据在网络上通畅地传输。
建立TCP连接需要经过三次握手,握手过程中传送的包里不包含数据,三次
握手完毕后,客户端与服务器才正式开始传送数据。
这个连接不要点
链接: https://blog.csdn.net/qq_41512314/article/details/107640988
Socket
Socket可以用来实现不同虚拟机或不同计算机之间的通信。其实创建Socket
连接时,可以指定使用的传输层协议,比如TCP/UDP,但是java中的socket-API
默认使用的是TCP,所以该Socket连接就是一个TCP连接。
使用Socket创建两台机子的通信连接时,我们需要一对套接字来完成连接,
运行在服务端的ServerSocket和运行在客户端的Socket
客户端的Socket发起连接:
Socket socket = new Socket(“127.0.0.1”,8080);
服务端的Socket接收连接:
ServerSocket server = new ServerSocket(8080);
Socket socket = server.accept();
当然两台机子完成通信的前提是:
必须处于同一网段或者同一局域网中,比如连接同一个wifi或热点
详细代码
服务端
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
/**
* 服务端
* @author 凌风
*
*/
public class Server {
/*
* java.net.ServerSocket
* 运行在服务端的ServerSocket主要有两个作用
* 1:向系统申请服务端口,客户端就是通过这个端口与服务端建立连接的。
*
* 2:监听该端口,这样一旦一个客户端通过该端口尝试建立连接时,ServerSocket就会自动实例化
* 一个Socket,那么通过这个Socket就可以与客户端对等并进行数据交互了。
*/
private ServerSocket server;
public Server() {
try {
/*
* 实例化ServerSocket的同时要向系统
* 申请服务端口,客户端就是通过这个端
* 口与服务端建立连接的。
*/
System.out.println("正在启动服务端...");
server = new ServerSocket(8080);
System.out.println("服务端启动完毕!");
} catch (Exception e) {
e.printStackTrace();
}
}
public void start() {
try {
/*
* Socket accept()
* ServerSocket的accept方法是一个阻塞
* 方法,调用后会一直等待,直到一个客户端
* 建立连接为止,此时该方法会返回一个Socket
* 实例,通过这个Socket就可以与刚连接上的
* 客户端进行数据交互了。
* 多次调用accept可以等待不同客户端的连接
*/
while(true) {
System.out.println("等待客户端连接...");
Socket socket = server.accept();
System.out.println("一个客户端连接了!");
/*
* 通过Socket获取输入流,可以读取到远端
* 计算机发送过来的字节。
*/
InputStream in = socket.getInputStream();
InputStreamReader isr
= new InputStreamReader(in,"UTF-8");
BufferedReader br
= new BufferedReader(isr);
String line = null;
while((line = br.readLine())!=null) {
System.out.println("客户端说:"+line);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Server server = new Server();
server.start();
}
}
客户端
import java.io.BufferedWriter;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;
import java.net.InetAddress;
import java.net.URL;
public class Client {
/*
* java.net.Socket 套接字
* 封装了TCP协议的通讯细节,使得我们可以通过它
* 来与远端计算机建立TCP连接,并利用两个流的读写
* 完成数据交互。
*/
private Socket socket;
/**
* 构造方法,用来初始化客户端
*/
public Client() {
try {
/*
* Socket实例化是需要传入两个参数
* 参数1:服务端IP地址
* 参数2:服务端程序申请的端口
* 我们通过IP可以找到网络上的服务端计算机
* 通过端口可以连接到服务端计算机上运行的
* 服务端应用程序了。
* 注意:
* 实例化Socket的过程就是连接的过程,若
* 服务端没有响应这里会抛出异常。
*/
System.out.println("正在连接服务端...");
socket = new Socket("192.168.8.128",8080);
System.out.println("与服务端成功建立连接!");
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 客户端开始工作的方法
*/
public void start() {
try {
Scanner scanner = new Scanner(System.in);
/*
* Socket提供的方法:
* OutputStream getOutputStream()
* 该方法获取的输出流是一个字节输出流
* 通过这个流写出的字节会通过网络发送
* 到远端计算机上(对于客户端这边而言,
* 远端计算机指的就是服务端了。)
*/
OutputStream out = socket.getOutputStream();
OutputStreamWriter osw = new OutputStreamWriter(out,"UTF-8");
BufferedWriter bw = new BufferedWriter(osw);
PrintWriter pw = new PrintWriter(bw,true);
while(true) {
String line = scanner.nextLine();
pw.println(line);
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Client client = new Client();
client.start();
}
}
测试步骤
1.把程序复制到两台电脑中
2.分别在两台电脑中运行服务端Server
3.在两台电脑中运行客户端Client
4.在客户端的控制台输入你的信息,查看另一台电脑的服务端是否接收到