java在包java.net中提供了两个类Socket和ServerSocket,分别用来表示双向连接的客户端和服务端。
package urlconnection;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
/**
* @author ermu
* @since 2021/3/23 9:22
*/
public class Server extends Thread{
private ServerSocket serverSocket;
public Server(ServerSocket serverSocket) {
this.serverSocket = serverSocket;
}
public Server(int port) throws IOException {
this.serverSocket = new ServerSocket(port);
}
@Override
public void run() {
Socket socket = null;
BufferedReader in = null;
PrintWriter out = null;
BufferedReader sin = null;
try {
//使用accept()阻塞等待客户端请求,有客户
//请求到来则产生一个Socket对象,并继续执行
socket = serverSocket.accept();
//得到socket输入流
in= new BufferedReader(new InputStreamReader(socket.getInputStream()));
//得到socket输出流
out = new PrintWriter(socket.getOutputStream());
//得到控制台输入流
sin = new BufferedReader(new InputStreamReader(System.in));
//打印客户端内容
System.out.println("Client:"+in.readLine());
//获取服务器端控制台输入
String data = sin.readLine();
while(!data.equals("bye")) {
//向客户端发送内容
out.println(data);
//刷新输出流,使客户端马上收到字符串
out.flush();
//在系统标准输出上打印读入的字符串
System.out.println("Server:"+data);
//从Client读入一字符串,并打印到标准输出上
System.out.println("Client:"+in.readLine());
//从系统标准输入读入一字符串
data = sin.readLine();
}
//向客户端发送内容
out.println(data);
//刷新输出流,使客户端马上收到字符串
out.flush();
}catch (IOException e){
e.printStackTrace();
}finally {
if(sin != null){
try {
sin.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(out != null){
out.close();
}
if(in != null){
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(socket != null){
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public static void main(String[] args) throws Exception{
new Server(8001).start();
}
}
package urlconnection;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
/**
* @author ermu
* @since 2021/3/23 9:23
*/
public class Client extends Thread{
Socket socket = null;
public Client(Socket socket){
this.socket = socket;
}
@Override
public void run(){
//由Socket对象得到输入流,并构造相应的BufferedReader对象
BufferedReader in = null;
//由系统标准输入设备构造BufferedReader对象
BufferedReader cin = null;
//由Socket对象得到输出流,并构造PrintWriter对象
PrintWriter out = null;
try {
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
cin = new BufferedReader(new InputStreamReader(System.in));
out = new PrintWriter(socket.getOutputStream());
//从控制台读取数据
String data = cin.readLine();
while (!data.equals("bye")) {
out.println(data);
out.flush();
//在系统标准输出上打印读入的字符串
System.out.println("Client:"+data);
//从Server读入一字符串,并打印到标准输出上
System.out.println("Server:"+in.readLine());
//从系统标准输入读入一字符串
data = cin.readLine();
//向服务器发送数据
}
out.println(data);
out.flush();
}catch (Exception e){
e.printStackTrace();
}finally {
if(cin != null){
try {
cin.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(out != null){
out.close();
}
if(in != null){
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(socket != null){
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public static void main(String[] args) {
try {
new Client(new Socket("127.0.0.1",8001)).start();
} catch (IOException e) {
e.printStackTrace();
}
}
}
如有错误请指正
参考链接:https://blog.csdn.net/u013256816/article/details/50186693