引言
Java Socket编程,主要有Socket
和ServerSocket
两个类,其中客户端(Client)通过构造Socket
实例,向服务端(Server)的ServerSocket
发起请求。 ServerSocket
在接受到来自客户端的请求后,构建一个Socket
,并将响应内容通过这个Socket
实例返回。
建立客户端和服务端
分别建立Client
和Server
两个java类,在Client
类中声名Socket
对象,在Server
类声名ServerSocket
和Socket
对象,并实例化。服务端监听10086端口,并打印log。
Client.java
package org.hjc.socket;
import java.io.IOException;
import java.net.Socket;
public class Client {
static Socket socket;
// 为了方便起见,Socket对象设为静态,IO异常在方法签名中抛出
public static void main(String[] args) throws IOException {
// 连接IP地址为“localhost”,端口号为10086的服务器
// 因为目前服务器和客户端都跑在同一台设备中,地址就填localhost
// 端口号的取值范围是1024到65535
socket=new Socket("localhost",10086);
}
}
Server.java
package org.hjc.socket;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
static ServerSocket serverSocket;
static Socket socket;
// 为了方便起见,Socket对象设为静态,IO异常在方法签名中抛出
public static void main(String[] args) throws IOException {
System.out.println("启动服务器...");
serverSocket=new ServerSocket(10086);// 创建ServerSocket,监听10086端口
System.out.println("开始监听10086端口");
socket=serverSocket.accept();// 接收连接请求
System.out.println("已连接上来自IP为"+socket.getInetAddress().getHostAddress()+"的连接请求");
}
}
目前客户端和服务端就创建好了,运行代码试试看看效果,注意先运行Server.java,再运行Client.java。
启动Server.java后Server控制台的输出:
启动服务器…
开始监听10086端口
启动Client.java后Server控制台的输出:
启动服务器…
开始监听10086端口
已连接上来自IP为127.0.0.1的连接请求
Process finished with exit code 0
客户端向服务端发送数据
这里需要用到IO流操作,通过socket
对象,调用getInputStream()
和getOutputStream()
分别获取输入流和输出流,进行数据读取和写入操作。
Client.java
package org.hjc.socket;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
public class Client {
static Socket socket;
//为了方便起见,Socket对象设为静态,IO异常在方法签名中抛出
public static void main(String[] args) throws IOException {
//连接IP地址为“localhost”,端口号为10086的服务器
//因为目前服务器和客户端都跑在同一台设备中,地址就填localhost
//端口号的取值范围是1024到65535
socket = new Socket("localhost", 10086);
//向服务端发送数据
OutputStream os = socket.getOutputStream();//构造输出流
os.write("你好,我是客户端\n".getBytes());//向输出流写入数据,末尾必须加上换行符
}
}
Server.java
package org.hjc.socket;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
static ServerSocket serverSocket;
static Socket socket;
//为了方便起见,Socket对象设为静态,IO异常在方法签名中抛出
public static void main(String[] args) throws IOException {
System.out.println("启动服务器...");
serverSocket = new ServerSocket(10086);//创建ServerSocket,监听10086端口
System.out.println("开始监听10086端口");
socket = serverSocket.accept();//接收连接请求
System.out.println("已连接上来自IP为" + socket.getInetAddress().getHostAddress() + "的连接请求");
//接收客户端的数据
InputStream is =socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
System.out.println("接收到客户端发来的数据:\n"+br.readLine());
}
}
Server控制台输出结果如下:
启动服务器…
开始监听10086端口
已连接上来自IP为127.0.0.1的连接请求
接收到客户端发来的数据: 你好,我是客户端
Process finished with exit code 0
服务端响应客户端
服务器响应客户端的操作其实和客户端向服务器发送数据一样,都是通过输出流进行传输。
Client.java
package org.hjc.socket;
import java.io.*;
import java.net.Socket;
public class Client {
static Socket socket;
//为了方便起见,Socket对象设为静态,IO异常在方法签名中抛出
public static void main(String[] args) throws IOException {
//连接IP地址为“localhost”,端口号为10086的服务器
//因为目前服务器和客户端都跑在同一台设备中,地址就填localhost
//端口号的取值范围是1024到65535
socket = new Socket("localhost", 10086);
//向服务端发送数据
OutputStream os = socket.getOutputStream();//构造输出流
os.write("你好,我是客户端\n".getBytes());//向输出流写入数据,末尾必须加上换行符
// 接收服务器响应的数据
InputStream is = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
System.out.println("服务器的响应:\n" + br.readLine());
}
}
Server.java
package org.hjc.socket;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
static ServerSocket serverSocket;
static Socket socket;
//为了方便起见,Socket对象设为静态,IO异常在方法签名中抛出
public static void main(String[] args) throws IOException {
System.out.println("启动服务器...");
serverSocket = new ServerSocket(10086);//创建ServerSocket,监听10086端口
System.out.println("开始监听10086端口");
socket = serverSocket.accept();//接收连接请求
System.out.println("已连接上来自IP为" + socket.getInetAddress().getHostAddress() + "的连接请求");
//接收客户端的数据
InputStream is =socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
System.out.println("接收到客户端发来的数据:\n"+br.readLine());
//响应数据给客户端
OutputStream os = socket.getOutputStream();//构造输出流
os.write("welcome!欢迎连接!\n".getBytes());//向输出流写入数据,末尾必须加上换行符
}
}
Server控制台输出结果如下:
启动服务器…
开始监听10086端口
已连接上来自IP为127.0.0.1的连接请求
接收到客户端发来的数据:
你好,我是客户端
Process finished with exit code 0
Client控制台输出结果如下:
服务器的响应:
welcome!欢迎连接!
Process finished with exit code 0