Java Socket ServerSocket TCP/IP UDP/IP HTTP
基本概念
- 在Java原生的API中,客户端与服务器是通过Socket通信的。
- Socket指的是两台主机之间的连接。
基本原理
在服务器,你需要编写一个ServerSocket
,该ServerSocket
用于监听服务器上的某个端口。当客户端的Socket
尝试连接服务器端的ServerSocket
时,服务器就会被唤醒,并且返回一个Socket
对象(这个Socket
对象就是客户端的Socket
),因为Socket
有getInputStream
和getOutputStream
方法,因此我们可以通过Socket
在客户端和服务器之间交换数据。一般的执行过程如下:
- 服务器监听相应端口的请求
- 客户端发起一个请求
- 服务器接收到请求
- 服务器处理请求,并把结果返回给客户端
简单样例
在下面这个样例中,客户端Client
将向服务器Server
发送String
类型的数据,服务器读取数据并输出。
客户端
public class Client implements Runnable{
@Override
public void run() {
try {
//客户端Socket发起请求,服务器地址为本机地址,服务器端口为8080端口,如果服务器响应成功,将返回socket
Socket socket = new Socket(InetAddress.getLocalHost().getHostAddress(),8080);
//获取socket的输出流对象
OutputStreamWriter writer = new OutputStreamWriter(socket.getOutputStream());
BufferedWriter bufferedWriter = new BufferedWriter(writer);
//向socket写入数据
bufferedWriter.write("A message from client.");
//刷新输入流
bufferedWriter.flush();
//关闭输入流
socket.shutdownOutput();
} catch (IOException e) {
e.printStackTrace();
}
}
}
服务器
public class Server implements Runnable{
@Override
public void run() {
try{
//将要返回给客户端的Socket
Socket connection;
ServerSocket serverSocket = new ServerSocket(8080);
System.out.println("Server is waiting..");
//服务器ServerSocket等待客户端发起请求,阻塞线程
connection=serverSocket.accept();
//获取Socket的输出流对象
InputStreamReader reader = new InputStreamReader(connection.getInputStream());
BufferedReader bufferedReader = new BufferedReader(reader);
System.out.print("server get message: ");
//读取从客户端发来的数据
System.out.println(bufferedReader.readLine());
//关闭输出流
connection.shutdownInput();
}catch (IOException e){
e.printStackTrace();
}
}
}
开始测试
public class Main {
public static void main(String[] args) throws InterruptedException {
Runnable serverTask = new Server();
Runnable clientTask = new Client();
Thread server = new Thread(serverTask);
Thread client = new Thread(clientTask);
server.start();
//保证服务器先于客户端启动
Thread.sleep(1000);
client.start();
}
}